函数设计概念
递归函数
用递归求和
编码替代方案
采用三元if/else表达式
递归可以是直接的,也可以是间接的
循环语句VS递归
我们可以使用循环替代上述递归
处理任意结构
如果不是一个线性迭代,那么嵌套的循环语句是不够用的,因为子列表可能嵌套到任意的深度并且以任意的形式嵌套。如下使用递归来应对这种一般性的嵌套,以便顺序访问子列表:
函数对象:属性和注解
间接函数调用
函数内省
内省工具允许我们探索实现细节,如下:
函数属性
Python3.0中的函数注解
给函数对象附加注解信息:注解自身不做任何事情,注解是可选的,出现的时候只是直接附加到函数对象__annotations__属性以供其他用户使用。
如下函数:
函数注解编写在def头部,对于参数,它们出现在紧随参数名之后的冒号之后;对于返回值,它们编写于紧跟在参数列表之后的一个->之后
匿名函数:lambda
像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名。这也就是lambda有时叫做匿名(也就是没有函数名)的函数的原因。实际上,它们常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码。
lambda表达式
以关键字lambda,之后是一个或多个参数,紧跟的是一个冒号,之后是一个表达式
lambda argument1, argument2,... argumentN : expression using arguments
lambda与def定义函数不同之处:
(1).lambda是一个表达式,而不是一个语句。
lambda能够出现在不允许def出现的地方一一例如,在一个列表常量中或者函数调用的参数中。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
(2)lambda的主体是一个单个的表达式,而不是一个代码块。
lambda是一个为编写简单的函数而设计的,而def用来 处理更大的任务。
除了上述区别,def和lambda可以做相同的动作:
为什么使用lambda
使用lambda可以在你仅需要嵌入小段可执行代码的情况下带来一个更简洁的代码结构
lambda通常用来编写跳转表,也就是行为的列表或字典,能够按照需要执行相应的动作:
一个def是不会在列表常量中工作的,因为它是一个语句,而不是一个表达式。对等的def代码可能需要在想要使用的环境之外有临时性函数名称和函数定义:
在序列中映射函数:map
考虑如下代码:
map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表,如下:
函数式编程工具:filter和reduce
filter:按要求过滤出一些元素
reduce:对每对元素都应用函数并运行到最后结果: