函数
格式:
def add(a, b):
'''
放在函数开头的独立字符串是文档字符串,
可用add.__doc__调用
'''
return a+b
位置参数, 关键字参数和默认值(P100)
调用函数的时候后可以使用函数参数的名称来调用, 可以设置默认值
收集参数(提供任意个数的参数), 分配参数(P100)
使用*标记一个参数, 此参数会收集剩下的所有参数放到一个元组中, 此参数之后的参数必须通过关键字指定
使用**号标记会将剩余作为一个字典收集起来
def f(a, *b, **c):
print(b, c)
return
f(1, 2, 3, c=10, d=20, e=8)
# (2, 3) {'c': 10, 'd': 20, 'e': 8}
分配参数: 在调用函数是在类型为元组或列表的实参前面加上*, 在类型为字典的实参前面加上**可将其拆分为参数列表
x = [1, 2]
y = {'c':3, 'd':4}
f(*x, **y) # 相当于f(1, 2, c=3, d=4)
# (2,) {'c': 3, 'd': 4}
作用域(P105)
python的作用域(名称空间)是一个字典, 其中当前作用域可用vars()或locals()函数得到, 全局作用域可用globals()得到
在python的函数中可以直接访问全局变量, 但是不建议对全局变量进行修改
def g():
a = 10
print('\ng')
print(id(vars()))
print(id(locals()))
print(id(globals()))
def h():
b = 20
print('\ng-h')
print(id(vars()))
print(id(locals()))
print(id(globals()))
return
h()
return
print(id(vars()))
print(id(locals()))
print(id(globals()))
g()
# 结果:
2431549591984
2431549591984
2431549591984
g
2431590262032
2431590262032
2431549591984
g-h
2431590263112
2431590263112
2431549591984
将函数作为参数(函数式编程)(P111)
-
lambda表达式: 创建简单的函数
-
map: 使用map将序列所有元素传递给函数
>>> list(map(lambda x:x*x, range(10))) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 与下面的列表推导等价 >>> [x*x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-
filter: 根据bool函数的返回值进行过滤
>>> list(filter(lambda x:x%3==0, range(10))) [0, 3, 6, 9] # 与下面的推导式等价 >>> [x for x in range(10) if x%3==0] [0, 3, 6, 9]
-
reduce: 用指定函数将序列前两个元素合二为一, 在将结果与第三个元素合二为一, 直到得到一个结果
>>> from functools import reduce >>> reduce(lambda x, y:x*10+y, range(1, 10)) 123456789