函数
函数可以将它们的返回值赋给变量,也可以作为参数被其他函数调用,也可以从其他函数中返回值
函数的定义为:依次输入def、函数名、带有函数参数(也可以没有参数)的圆括号、最后加上一个’:’
下面写一个计算两个变量的和的函数
>>> def add_args(x,y):
print (x + y)
>>> add_args(2,5)
7
接下来再定义一个函数,它有3个参数,第一个参数为一个可以运行的函数的名字
>>> def run_something(func,arg1,arg2):
func(arg1,arg2)
>>> run_something(add_args,5,2)
7
传进去的函数是add_args,而不是 add _args(),加上括号就表示调用函数,不加括号的话,Python只会把函数当做一个普通的对象处理
内部函数
即在函数中定义另外一个函数
>>> def outer(a,b):
def inner(c,d):
return c + d
return inner(a,b)
>>> outer(4,7)
11
闭包
内部函数可以看成一个闭包,闭包是一个可以由另外一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值
>>> def knights(saying):
def inner():
return "We are the knights who say: '%s'" % saying
return inner # 返回的是一个函数
>>> a = knights('Duck')
>>> b = knights('Hasenpfeffer')
# 同样的,a与b的类型都是函数,同时,也是闭包
>>> type(a)
<class 'function'>
>>> type(b)
<class 'function'>
# 接下来我们调用a与b
>>> a()
"We are the knights who say: 'Duck'"
>>> b()
"We are the knights who say: 'Hasenpfeffer'"
匿名函数lambda()函数
lambda函数是用一条语句表达的匿名函数,可以用来代替一些小函数
>>> def edit_story(words,func):
for word in words:
print(func(word))
>>> stairs = ['word','number','func','STL']
>>> def change(word): # 将每个单词首字母变为大写并在末尾加上感叹号
return word.capitalize() + '!'
>>> edit_story(stairs, change)
Word!
Number!
Func!
Stl!
使用lambda函数代替change()函数
# lambda接收一个参数word,冒号后面都是此函数的定义
>>> edit_story(stairs, lambda word:word.capitalize() + '!')
Word!
Number!
Func!
Stl!
位置参数
传入参数的值是按照顺序依次复制过去的,使用这种方式需要记住每个位置的参数的含义
>>> def menu(wine,entree,dessert):
return {'wine':wine,'entree':entree,'dessert':dessert}
>>> menu('chardonnay','chicken','cake')
{'wine': 'chardonnay', 'entree': 'chicken', 'dessert': 'cake'}
关键字参数
调用函数时可以指定对应参数的名字,可以采用与函数定义不同的顺序调用,也可以与位置参数一起使用,不过位置参数必须放置于关键字参数前面
>>> menu('frontenac',dessert = 'bagel',entree = 'fish')
{'wine': 'frontenac', 'entree': 'fish', 'dessert': 'bagel'}
指定默认值参数
当调用方没有提供对应的参数值时,可以使用指定默认参数值
>>> def menu(wine,entree,dessert = 'pudding'):
return {'wine':wine,'entree':entree,'dessert':dessert}
>>> menu('frontenac','chicken')
{'wine': 'frontenac', 'entree': 'chicken', 'dessert': 'pudding'}
>>> menu('duckelfelder','duck','doughnut')
{'wine': 'duckelfelder', 'entree': 'duck', 'dessert': 'doughnut'}
使用*收集位置参数
星号可以将一组 可变数量的位置参数集合成参数值的元组,即此方法会将位置参数转换为一个元组
>>> def print_args(*args):
print('args:',args)
>>> print_args(3,2,1,'with','in')
args: (3, 2, 1, 'with', 'in')
当然,也可以与位置参数一起使用,不过位置参数要放在前面
>>> def print_more(key1,key2,*other):
print('1、',key1)
print('2、',key2)
print('3、',other)
>>> print_more('cap','gloves','scarf','Shh','one')
1、 cap
2、 gloves
3、 ('scarf', 'Shh', 'one')
使用* *收集关键字参数
使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值
>>> def print_kwargs(**kwargs):
print('kwargs:',kwargs)
>>> print_kwargs(wine = 'merlot', entree = 'fish', dessert = 'bagel')
kwargs: {'wine': 'merlot', 'entree': 'fish', 'dessert': 'bagel'}
可以将* args与 * *kwargs的参数混合使用,不过要按照顺序出现
>>> def print_more(*args, **kwargs):
print('args:',args)
print('kwargs:',kwargs)
>>> print_more('cap','gloves',wine = 'merlot', entree = 'fish', dessert = 'bagel')
args: ('cap', 'gloves')
kwargs: {'wine': 'merlot', 'entree': 'fish', 'dessert': 'bagel'}