Python学习笔记(六)抽象(上)


6.1 懒惰即美德

目前我们写的程序都很小,如果要编写比较大的程序,就要进行代码复用。 创建函数即可解决此问题。

6.2 抽象和结构

抽象可以节省很多工作,而且模块化的程序也是人们能更轻松地理解,正如其他编程语言所做的那样。

6.3 创建函数

函数可以调用,他执行某种行为并且返回一个值(当然,并非所有的函数都会返回值),一般来说,内建的callable函数可以用来判断函数是否可调用。

>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
False
>>> callable(y)
True

使用def语句可以定义函数

>>> def hello(name):
	return 'hello,'+name+'!'

>>> hello ("daxiao")
'hello,daxiao!'


6.3.1 记录函数

如果想要给函数写文档,让后面使用该函数的人能理解的话,可以加入注释(以#开头)。 另外一个方式就是直接写上字符串。 如果在函数的开头写下字符串,他就会作为函数的以部分进行存储,这称为文档字符串。

>>> def hello(name):
	'name'
	return 'hello'+name+'!'

>>> hello.__doc__
'name'


也可以通过help访问

>>> help(hello)
Help on function hello in module __main__:

hello(name)
    name


6.3.2 并非真正函数的函数

实际上相当于之前我们接触过的void 类型. 可以执行一部分操作,print 结果是None

>>> def test():
	print 'this is morning '

	
>>> x=test()
this is morning 
>>> x
>>> print x
None
6.4 参数魔法

从最基本的简单回顾一下

6.4.1

6.4.2 我能改变参数吗

函数通过它的参数获得一系列值,参数只是变量而已:

>>> def trytochange(n):
	n='l'

	
>>> name='x'
>>> trytochange(name)
>>> name
'x'
就与之前的C和hava 一样,将实参传入形参,然后改变形参,实参的值当然不会改变.

但是如果参数是一个可变的结构,比如列表呢?

>>> def chang(n):
	n[0]='l'

	
>>> name('x','l')

Traceback (most recent call last):
  File "", line 1, in 
    name('x','l')
TypeError: 'str' object is not callable
>>> name=['x','l']
>>> chang(name)
>>> name
['l', 'l']

就与C中一样,当形参是一个数组时,通过改变形参,实参也跟着变了. 所以为了防止这种情况,记得引用时先拷贝参数.


当参数不可变时,怎样通过函数来修改参数呢?

>>> def inc(x):
	return x+1

>>> x=2
>>> x=inc(x)
>>> x
3

6.4.3 关键字参数和默认值

目前我们所使用的参数都叫做位置参数,因为他们的位置很重要-----事实上比他们的名字更加重要. 本节中引入的这个功能可以回避位置问题,当你慢慢习惯使用这个功能以后,就会发现程序规模越大,它们的作用也就越大.

有些时候,参数是很难记的,为了让事情简单些,可以提供参数的名字.

>>> def hello_1(greeting ,name):
	print '%s,%s'%(greeting,name)

	
>>> hello_1(name='world',greeting='hello')
hello,world

这样一来,位置就完全没影响了.

关键字参数最厉害的地方在于可以在函数中给参数提供默认值,当参数具有默认值时,调用的时候可以不提供,也可以只提供一部分参数.

>>> def hello_1(greeting='hello' ,name='world'):
	print '%s,%s'%(greeting,name)

	
>>> hello_1(name='liang')
hello,liang

6.4.4 收集参数

要是用户可一个函数提供人一多的参数,实现起来也不难.

>>> def print_(*p):
	print p

	
>>> print_(1,2,3)
(1, 2, 3)



评论关闭