递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。使用递归函数的优点是逻辑简单清晰,缺点就是过深的调用会导致栈溢出。但是针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
"""尾递归""" # 尾递归是指在函数返回的时候,调用自身本身,并且return语句不能包含表达式。 def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return 1 return fact_iter(num-1, num*product) """普通递归""" def fact1(n): if n == 1: return 1 return n*fact(n-1)
匿名函数:lambda
除了def语句外,python还提供了一种生成函数对象的表达式。就像def一样,这个表达式创建了一个之后能调用的函数,但是他返回了一个函数而不是将这个函数赋值个一个变量。这也就是lambda有时叫做匿名函数的原因。实际上,他们常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码。lambda可作为def的速写。
"""lambda匿名函数操作""" # lambda返回一个函数,可以赋值各变量,通过变量进行函数调用 f = lambda x: x * x f(3) # lambda 通常用来编写跳转表。也就是行为的列表或字典,能够按照需要执行相应的动作 L = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4] # 遍历函数列表 for f in L: print(f(2)) # 指定特定函数执行 print(L[0](3)) # 同时lambda也可与字典嵌套可以构建更多种类的行为表。
在序列中映射函数:map
程序对列表和其他序列常常要做的一件事就是对每个元素进行一个操作并把其结果集合起来。map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。但是python3map是一个可迭代对象,他的返回值为一个迭代器,因此在这里,一个列表(list())调用用来迫使他生成所有的结果以显示。
"""map函数操作""" L = [1, 2, 3, 4] s = map((lambda x: x ** x), L) # map函数可以通过next()进行调用,同时可以使用list()强制将其转化为列表。 print(next(s)) print(list(s))
函数式编程工具:filter和reduce
在python内置函数中,map函数是用来进行函数式编程的这类工具中最简单的内置函数代表:函数式编程的意思是对序列应用一些函数的工具。例如,基于某一测试函数过滤出一些元素(filter),以及对每队元素都应用函数并运行到最后结果(reduce)。由于range和filter都返回可迭代对象,在python3中他们需要list调用来显示其所有结果。
"""filter函数操作""" """ filter函数用于过滤序列,和map一样接受一个函数和一个列表。 和map不同的是filter把传入的函数依次作用于每个元素,然后根据 返回值时True还是False决定保留还是丢弃。 """ # 在一个list中删掉偶数 def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 3, 4, 5, 6])) """reduce函数操作""" """ reduce把一个函数作用在一个序列[x1, x2, x3, ...]上这个函数 必须接受两个参数,reduce把结果继续和序列的下一个元素做累积计算 """ # 例如:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2),x3),x4) from functools import reduce def add(x, y): return x + y print(reduce(add, [1, 2, 3, 4]))