第11章函数和函数式编程
11.1 什么是函数?
函数:逻辑结构化的编程方法
如果没有返回元素,python返回None
元组关键字: *tuple_args
字典关键字: **dict_args
python不允许函数未声明前对其引用或调用
函数属性:
内嵌函数:函数体内创建另一个函数是合法的。
11.3.6函数装饰器
装饰器:以@开头,包含名字和可选参数
@decorator(args)
def func2(funcArgs)
静态方法装饰器
class MyClass(object):
@staticmethod
def staticFunc():
class MyClass(object):
def __init__(self , name):
self.name= name
@staticmethod
def show():
print("static method")
if __name__ == "__main__":
myClass = MyClass('dong')
MyClass.show()
装饰器堆叠:
@deco2
@deco1
def func()
…
func = deco2(deco1(func))
有参数和无参数的装饰器
装饰器的本质:是函数,接受函数作为参数,返回另一个函数
作用:日志,检测性能,加入事务
11.6.1非关键字可变长参数(元组)
可变长的参数元组必须在位置和默认参数之后,带元组或非关键字可变长参数)
def func_time(formal_args , *vargs_tuple):
添加可变参数列表变量,处理超出数目的参数
def tupleArgs(arg1 , arg2='2' , *otherArgs):
print(arg1)
print(arg2)
print(*otherArgs)
11.6.2关键字变量参数
def func(formal_args , *tuple_args ,**dict_args )
11.7函数式编程
lambda关键字创造匿名函数,匿名是因为不需要以标准的方式声明
lambda本质是一个表达式,定义和声明在同一行
lambda[arg1 , arg2 , …,argn] : expression
参数可选,
lambda表达式中前面是参数,后面是表达式,返回可调用的函数
def true() : return True
a = lambda x , y = 2 : x + y
11.7内建函数apply(),filter(),map(),reduce()
apply(func , nkw , kw):用可选参数调用func, nkw:非关键字参数,
kw关键字参数
map(func , seq1 , seq2…):将函数func作用于给定序列(s)每个元素,并返回列表,相当于对列表中每个元素进行处理
reduce(func , seq [, init]):将二元函数作用于seq序列元素,每次携带一堆
先前结果和下一个序列元素,若init设定,第一个是init和第一个序列元素
# map(func , seq): map对序列中每个元素value调用func(seq),并返回处理后的序列
def mapTest():
nums = [i for i in range(1,6)]
results = map(lambda x : x + 2 , nums)
for i in results:
print(i)
map(lambda x , y : x + y , [1,3,5],[2,4,6])
reduce():进行折叠,等于每次从序列中取出两个元素进行运算,
有点类似于。典型的一个应用:求序列元素累加和
reduce(func , seq [, init]):
# reduce(func , seq ,init): 将序列中前一次运算结果和当前元素进行某种操作,直到最后只有一个元素
def reduceTest():
nums = [i for i in range(1,11)]
sum = reduce( (lambda x, y : x + y) , nums)
print(sum)
nums = [i for i in range(1,11)]
sum = reduce( (lambda x, y : x + y) , nums , 45)
print(sum)
11.8变量作用域
搜索标识符:先从局部作用域开始,,然后寻找全局域
全局变量名字会被局部变量覆盖掉
global
11.8.4闭包
闭包:将内部函数代码,作用域,外部函数的作用结合起来
11.8.5作用域和lambda
11.9递归
def fac(n):
ifn == 0 or n == 1:
return1
else:
returnn * fac(n-1)
11.10生成器
协同程序:运行独立函数调用,可以暂停或挂起
生成器含义:带有yield语句的函数,能暂停执行并返回中间结果
yield功能:返回一个值给调用者并暂停执行
适用:迭代大的数据集,可节省内存,自动推算下一个结果
next():获得下个生成的值
将值送给生成器send(),yield语句是表达式
close()结束