学习3:函数

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)

原文地址:https://www.cnblogs.com/lypy/p/6369417.html