一、函数
- 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
- 所有的函数都有返回值。如果你没有告诉它们该返回什么,将返回None。
- def语句中,位于函数名后面的变量通常称为形参,而调用函数时提供的值称为实参。
- 字符串以及数和元组是不可变的,意味着不能修改它们(即只能替换为新值)。
- 函数的作用:减少重复代码;方便修改,更易扩展;保持代码一致性。
1. 函数的命名规则
- 函数名必须以下划线或字母开头,可以包含任意字母、数字和下划线的组合。
- 不能使用任何标点符号。
- 函数名区分大小写。
- 函数名不能是保留字。
2. 函数的定义与使用
2.1 定义函数
Python定义函数使用def关键字,后面必须跟函数名和带括号的形式参数列表和冒号。然后,在缩进块中编写函数体,函数的返回值用return语句返回。
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量。
格式:def 函数名(参数列表):
函数体
2.2 调用函数
调用函数通过函数名和带括号的实参列表
2.3 形参与实参
形参:形式参数,不是实际存在,是虚拟变量,在定义函数和函数体时使用形参,目的时在函数调用时接收实参(实参个数,类型与实参一一对应)
实参:实际参数,调用函数时传给函数的参数,可以是常量、变量、表达式、函数,传给形参
2.4 可更改与不可更改对象
在Python中,字符串、数字和元组是不可更改的对象,而列表和元组是可更改的对象
2.5 函数返回值
可用return 表达式语句用于把函数作为结果值返回。所有的函数都有返回值。
如果没有return语句,默认会返回一个None。
如果return可以返回多个值,会将多个值封装成一个元组返回。
3. 函数的参数
3.1 必需参数
必需参数必须以正确的顺序传入参数,调用时的数量必须和声明时的一样。
3.2 关键字参数
函数调用使用关键字参数来确定传入的参数值,允许函数调用时参数顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。
3.3 默认参数
调用函数时,如果没有传递参数,则会使用默认值。
设置默认参数时需注意:必选参数在前,默认参数在后,否则解释器会报错。
3.4 可变参数
参数前面加一个星号将提供的所有值都放在一个元组中,存放所有未命名的变量参数。如果在函数调用时没有指定参数,则为一个空元组。
参数前面加两个星号会以字典的形式导入,该字典包含了所有未出现在形参列表中的关键字参数。
加一个星号的变量名会存放所有的未命名参数,加两个星号的变量名会存放所有的命名参数
函数参数位置顺序:关键字参数,默认参数,*args,**kwargs
4. 变量的作用域
- L:local,局部作用域,即函数中定义的变量;
- E:enclosing,闭包函数外的函数中(嵌套的父级函数的局部作用域),即包含此函数的上级函数的局部作用域,但不是全局的
- G:global,全部作用域,就是模块级别定义的变量
- B:built-in:内置作用域系统固定模块里面的变量
优先级:L-->E-->G-->B
全局变量在局部作用域可以访问,但不能被修改
- 变量查找顺序:L-->E-->G-->B
- Python 中只有模块,类以及函数才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问。
当内部作用域想要修改全局作用域的变量时,就要使用global关键字;
当内部作用域想要修改嵌套作用域的变量时,就要使用nonlocal关键字。
5. lambda匿名函数
匿名函数lambda在创建时不需要命名,所以叫做匿名函数
用lambda关键字表示,冒号左侧表示函数接收的参数,冒号右侧表示函数的返回值
6. 递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数必须有一个明确的结束条件;递归效率不高,递归层次过深会导致栈溢出(在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归层次过深会导致栈溢出)
7. 高阶函数
函数名可以进行赋值。函数名既可以作为函数参数输入;也可以作为函数返回值
8.内置函数
8.1 filter()函数
filter()函数用于过滤序列,它接收两个参数(一个函数和一个序列)。
filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。Python2返回列表,Python3返回迭代器对象。
8.2 map()函数
map()函数接收两个参数(一个函数和一个序列)。map()将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回。Python2返回列表,Python3返回迭代器对象。
8.3 reduce()函数
reduce()函数接收两个参数(一个函数和一个序列),把一个函数作用在一个序列上,把序列前两个数结果继续和序列的下一个元素作累积计算。reduce的结果就是一个值。Python3中必须通过from functools import reduce调用模块。