Python的函数基本概念
- 使用def定义基本函数,函数本身是对象,即可以返回函数对象本身。类似于c里面的函数指针。
- 函数被调用的时候才检查def语句,所以def语句可以写在函数调用之后。
函数变量的作用域
- 变量名的查找遵循LEGB原则,即先在本地(一般是函数内部,如果是嵌套函数则是嵌套函数内部)寻找对应的变量,再在函数中寻找对应的变量,再去模块中查找,最后去内置模块查找。
- 函数中对变量名有两种修饰声明,一个是global另一个是nonlocal。global声明的变量,从模块中查找,nonlocal声明的变量针对于嵌套函数里的变量,从函数外层查找,虽然不声明nonlocal也可以使用嵌套函数的外层函数的本地变量,但是不能对其进行修改。
- 函数本身是对象,可通过类定义一个函数对象,实现其__call__方法。函数对象里面的属性变量不遵循LEGB原则。
函数的参数
- 参数类型分为位置参数,关键字参数,默认参数,任意参数,任意参数用*或**标记。*在函数定义里表示收集任意的参数组成元组,**在函数定义里收集任意的关键字参数组成字典。*在函数调用里表示将参数集合解包为多个参数,**参数在函数调用里表示将字典解包为多个参数。
- 指定keyword-only参数可以与任意参数混用而不会被看做任意参数的一部分。指定keyword-only即是调用时使用关键字参数。
- 参数的编写顺序,调用时位置参数在关键字参数之前,关键字参数在**参数之前,定义时普通参数必须在**参数之前。
函数编程工具
- map将序列中每一个元素进行指定的函数操作。返回一个结果集。map使用内置函数作为指定函数一般是最快的。
- filter对序列中每一个元素进行判断真值的函数操作,返回为真元素的结果集。
- reduce接受迭代器计算序列总和。
列表解析和生成器函数,生成器表达式
- 列表解析通常比for循环快,比使用内置函数的map要慢一点。列表解析可在[]添加多重循环遍历和条件判断。
- 生成器函数在函数里使用yield返回对象。表示不一次生成结果集。省内存,但比列表解析和for循环慢,适用于具有很大数量的集合。生成表达式也具有上述特点,不过它是用类似(x+3 for x in y)的形式和列表解析很像。
- 字典解析和集合解析某种意义上是生成器表达式传递给类型名
- 生成器是单迭代对象,即使用iter()内置函数只能迭代一回。需要重新生成生成器才能继续迭代。