一、函数定义和函数文档注释
1.1 使用def语句自定义函数
# _*_ coding:utf-8 _*_
def test(name):
print 'Hello'+name
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test('World')
HelloWorld
>>>
1.2 给函数添加文档
# _*_ coding:utf-8 _*_
def test(x1,x2):
'Calculate the sum of the two numbers'
print x1+x2
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test(1,2)
3
>>> test.__doc__
'Calculate the sum of the two numbers'
>>>
二、函数参数的修改
2.1 函数形参和实参
case1:
# _*_ coding:utf-8 _*_
def test_1(n):
n='red'
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> colour='green'
>>> test_1(colour)
>>> colour
'green'
>>>
case2:
# _*_ coding:utf-8 _*_
def test_2(n):
n[0]='red'
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> colour=['green','yellow']
>>> colour
['green', 'yellow']
>>> test_2(colour)
>>> colour
['red', 'yellow']
>>>
在C语言中已近知道形参与实参的关系,函数参数的传递有两种,一种是值传递,一种是传参数的地址。若仅就形式而言,上面所给的2个case貌似属于值传递,因此调用函数后形参的改变是不会改变实参的值得。但是,从结果可以看出,在第一个case中,函数条用结束后,实参的值没有发生改变;在第二个case中,函数条用结束后,实参的值发生了改变。原因何在,这跟Python的机制有关,在Python中字符串(以及数字和元组)是不可改变的,在函数条用中不能被修改,只能在函数外用新的值进行覆盖。可变的数据结构,例如列表和字典等做参数时,就可以在调用函数中对参数进行修改,其修改的结果也会影响实参的值,如case2所示。
既然在Python中并不是所有的实参通过修改形参来改变实参,那么对于不可变得数据类型,例如字符串、数字和元组怎样在函数中修改实参的值呢。有两种方法是可行的,一种是将形参的值在函数中返回,并将返回的结果重新赋值给实参;另一种是将参数值放到列表中。
# _*_ coding:utf-8 _*_
def test(x):
return x+1
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> x=100
>>> x=test(100)
>>> x
101
>>>
或者:
# _*_ coding:utf-8 _*_
def test(x):
x[0]=x[0]+1
运算结果:
=========RESTART:C:\Users\Mr_Deng\Desktop\test.py=========
>>> x=[200]
>>> test(x)
>>> x
[201]
>>>
2.2 改变函数的形参
# _*_ coding:utf-8 _*_
def init(data):
data['first']={}
data['middle']={}
data['last']={}
def find(data,label,name):
return data[label].get(name)
def storage(data,full_name):
names=full_name.split()
if len(names)==2:
names.insert(1,'')
labels='first','middle','last'
for label,name in zip(labels,names):
result=find(data,label,name)
if result:
result.append(full_name)
else:
data[label][name]=[full_name]
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> myList={}
>>> init(myList)
>>> storage(myList,'Robin Hood')
>>> storage(myList,'Robin Jack Chen')
>>> find(myList,'first','Robin')
['Robin Hood', 'Robin Jack Chen']
>>> find(myList,'middle','')
['Robin Hood']
>>>
事实上,利用Python中可变的数据结构在函数中修改实参的值可以使操作变得简单,程序编写更加规范,而且可以提高代码的利用效率。上面的程序的功能是将一个人的名字按照英文名字的习惯进行拆分,并存储到字典中,用户可用通过名字的firstName、middleName或者lastName检索字典中的全民,也可以检索指定类型(first、middle或者last)中含有某个字段所有复合要求的全名。
三、关键字参数和默认值
在上面涉及到的函数参数属于位置参数,调用函数时给定值得顺序要与定义的函数参数列表标尺一致,否则可能使程序结果出错。Python中有关键字参数的概念,使用关键字参数,可以明确每个参数的作用,而且与参数的顺序没有太大的关系。
# _*_ coding:utf-8 _*_
def test(name,greeting):
print greeting+name
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test(name='Jack',greeting='Hello!')
Hello!Jack
>>> test(greeting='Hi',name='Bob')
HiBob
>>>
指定默认参数值:
# _*_ coding:utf-8 _*_
def test_1(name='World',greeting='Hello '):
print '%s,%s!' % (greeting,name)
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test_1()
Hello ,World!
>>> test_1(greeting='Hi !',name='Bob')
Hi !,Bob!
>>>
位置参数与关键字参数混合使用:
# _*_ coding:utf-8 _*_
def test_2(name ,string='World',greeting='Hello '):
print '%s,%s,%s!' % (name,greeting,string)
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test_2('Bob')
Bob,Hello ,World!
>>> test_2('Bob',greeting='Hi',string='sky')
Bob,Hi,sky!
>>>
四、收集参数
4.1 函数中收集任意多个参数,在参数前加上*,将所有的参数值放到同一个元组中
# _*_ coding:utf-8 _*_
def test_3(title,*fun):
print title
print fun
运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test_3('par:',1,2,3)
par:
(1, 2, 3)
>>>
4.2 使用**返回一个字典
# _*_ coding:utf-8 _*_
def test_4(**fun):
print fun
运算结果:
=========RESTART:C:\Users\Mr_Deng\Desktop\test.py=========
>>> test_4()
{}
>>> test_4(x=1,y=2)
{'y': 2, 'x': 1}
>>>
五、反转过程
# _*_ coding:utf-8 _*_
def test_5(**dict):
print dict['english']+' is '+dict['num']
运算结果:
=========RESTART:C:\Users\Mr_Deng\Desktop\test.py=========
>>> dic={'english':'one','num':'1'}
>>> test_5(**dic)
one is 1
>>>