1. 函数参数
1) 必选参数(非关键字参数形式)
def test(name,age): print name,age test('tom',28) test(age='10', name='lik')
输出结果:
tom 28
lik 10
[Finished in 0.2s]
说明:函数定义的必选参数,调用函数时候参数的个数以及位置要分别对应;如果在调用时候想不按照位置顺序传递,那么必须指定参数名,这个叫指定关键字参数
2) 默认参数(关键字参数形式)
def test(name='tom',age='20'): print name,age test(28) test() test(age='28')
输出结果:
28 20
tom 20
tom 28
[Finished in 0.2s]
说明:函数定义的参数带有默认值,这个叫默认参数。针对默认参数,函数调用时候可以不指定参数值,也可以指定参数名重新赋值,也可以不指定参数名此时按参数顺序传递;
另外默认参数要定义为不可变对象,不要定义为可变对象如list,否则会发生逻辑问题,如下每次调用test时候teacher默认参数的值没有被清空。
def test(name='tom',teacher=[]): teacher.append('ll') print teacher test() test()
3) 非关键字可变参数
针对必选参数样式的参数,但是又不是必选参数,我们可以定义为非关键字可变参数*args.
args是一个list或者tuple,通过在前面加一个*就表示list或者tuple中的单个元素,从而表示多个必选样式的可选参数值
def test(*args): print args for arg in args: print arg test('tom', 18) test('tom', 20, 'address') #函数在调用时候直接使用必选参数形式,这些参数会自动被组装成一个元组 params = ['tim', 20,'address','work'] test(*params) params = ('tim', 20,'address','work','home') test(*params) #函数在直接使用列表或元组调用时候,要带上*
输出结果:
('tom', 18)
tom
18
('tom', 20, 'address')
tom
20
address
('tim', 20, 'address', 'work')
tim
20
address
work
[Finished in 0.1s]
4)关键字可变参数
针对默认参数样式的参数,但是又不是必选参数,我们可以定义为关键字可变参数**kw
kw是一个字典,通过在前面加一个**就表示字典中的元素,从而表示多个默认参数样式的可选参数值
def test(**kw): for (key,value) in kw.items(): print key,kw[key] test(name='tom',age='20') #函数在调用时候直接使用关键字参数形式,这些参数会自动被组装成一个字典 print '---' kw={'name':'tom','age':'30','height':'180'} test(**kw) #函数在调用时候直接使用字典形式,注意要带上**
输出结果:
age 20
name tom
---
age 30
name tom
height 180
[Finished in 0.1s]
5) 混合参数
混合参数定义,必须遵守参数定义顺序:必选参数->默认参数->非关键字可变参数->关键字可变参数。另外默认参数最好定义为不可变对象,不要定义为list。
混合参数调用,必须遵守参数设置顺序:关键字参数之后不能再出现非关键字参数。通俗的说就是有指定参数名的参数之后,不能再出现没有指定参数名的参数。
def test(name,age,*args,**kw): print name,age print args print kw test('tom', 18) print '----' test('tom',18,'grade','address') print '----' test('tom',18,grade='3',address='suzhou') print '----' test('tom',18,'3',address='suzhou')
输出结果:
tom 18
()
{}
----
tom 18
('grade', 'address')
{}
----
tom 18
()
{'grade': '3', 'address': 'suzhou'}
----
tom 18
('3',)
{'address': 'suzhou'}
[Finished in 0.1s]
下面是一些错误的调用方法, 违背了规则:关键字参数之后不能再出现非关键字参数
test(name='tom', 18)
test('tom', 18, grade='3','address')
2. 函数执行
1)函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕并将结果返回。哪怕是在循环中循环还未结束也会结束函数执行。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return
2) 空函数,如果想定义一个什么事也不做的空函数,可以用pass语句:
def nop(): pass
3) pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
4) 调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError: my_abs() takes exactly 1 argument (2 given)
但是如果参数类型不对,Python解释器就无法帮我们检查.所以需要时候可以先对参数类型做检查。
5) 返回多个值,比如return x,y,实际返回的是一个元祖(x,y)