1.python函数传参的方式有以下几种:
备注:传参按照数量分为固定参数和可变参数,固定参数有关键字+默认,可变参数是参数组。
1.1、关键字参数,就是传参的时候可以只传值(参数值),但要求与函数的参数顺序一致;也可以带上参数名,(参数名=参数值),该情况就是关键字参数,可以不需要按照函数的参数顺序。
1.2、默认参数,就是给参数附一个默认的值,如果调用函数时给该参传了新值,以新值为准,如果没传,使用默认值,备注要求默认参数要放到参数最后面,(参数名1,参数名2,默认参数=3)
1.3、参数组,就是参数值是元祖和字典,func(*tuple_grp_nonkw_args, **dict_grp_kw_args),其中的 tuple_grp_nonkw_args 是以元组形式体现的非关键字参数组, dict_grp_kw_args 是装有关键字参数的字典,字典中键为参数名,值为相应的参数值。
备注:(1).可变长的参数元组必须在位置和默认参数之后;(2).参数顺序是:关键字参数、默认参数、参数组(可变参数)
2.装饰器(@):
2.1、装饰器是在函数调用之上的修饰,装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数,和装饰函数的可选参数。装饰器看起来会是这样:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
2.2、可以考虑在装饰器中置入通用功能的代码来降低程序复杂度。例如,可以用装饰器来:
a.引入日志
b.增加计时逻辑来检测性能
c.给函数加入事务的能力
3.函数式编程
3.1、匿名函数与 lambda
匿名函数的语法:
lambda [arg1[, arg2, ... argN]]: expression参数是可选的,如果使用的参数话,参数通常也是表达式的一部分
核心笔记:lambda 表达式返回可调用的函数对象。
用合适的表达式调用一个 lambda 生成一个可以像其他函数一样使用的函数对象。它们可被传入给其他函数,用额外的引用别名化,作为容器对象以及作为可调用的对象被调用(如果需要的话,可以带参数)。当被调用的时候,如果给定相同的参数的话,这些对象会生成一个和相同表达式等价的结果。它们和那些返回等价表达式计算值相同的函数是不能区分的
3.2、举例如下:
def add(x, y): return x + y <=> 函数名=lambda x, y: x + y
def usuallyAdd2(x, y=2): return x+y <=> 函数名=lambda x, y=2: x+y
如:a = lambda x, y=2: x + y —> a(3)=5
4.内建函数
4.1、filter(odd, allNums),返回一个列表,odd代表提供筛选的函数,allNums代表待处理的列表,filter的作用是将allNums列表中的数据通过odd函数筛选后,保留返回True的数据组成新的列表;
4.2、map(odd, allNums),返回一个列表,odd代表运算的函数,allNums代表待处理的列表,filter的作用是将allNums列表中的数据通过odd函数运算后,返回函数结果的数据组成新的列表;map((lambda x: x+2), [0, 1, 2, 3, 4, 5]) => [2, 3, 4, 5, 6, 7];map(lambda x, y: (x+y, x-y), [1,3,5], [2,4,6]) => [(3, -1), (7, -1), (11, -1)]。
5.变量的作作用域
5.1、全局变量与局部变量
当搜索一个标识符的时候,python 先从局部作用域开始搜索。如果在局部作用域内没有找到那个名字,那么就一定会在全局域找到这个变量否则就会被抛出 NameError 异常,如果找到一个名字,搜索就不会继续去寻找一个全局域的变量,故局部变量可的优先级高于同名的全局变量。
6.生成器
生成器是一个带 yield 语句的函数。一个函数或者子程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果----那就是 yield 语句的功能, 返回一个值给调用者并暂停执行。当生成器的 next()方法被调用的时候,它会准确地从离开地方继续(当它返回[一个值以及]控制给调用者时)——可尝试用于功能测试半自动化。