每日八股文:函数

47 阅读5分钟

函数的定义与调用

image.png

其中函数命名要遵循标识符命名规则(字母数字下划线组合,不能以数字开头)

函数的参数

参数:函数执行时需要从外部传入数据
形参:自己定义的参数并没有具体的值
实参:调用函数时调用者传入的具体的值
必须参数:需要以正确的顺序传入函数.调用时的数量必须和声明时一样

image.png

关键字参数:通过参数名指定明确的值,可以不按照参数定义的顺序传参

image.png

默认参数:为函数设定默认值,当没有传参时使用默认值,当传递实参时使用实参
注意:默认参数必须放在位置参数后边,否则会报错

image.png

不定长参数(处理不确定数量的参数):
*args :接收任意数量的位置参数,形成元组()
**kwargs:接收任意数量的关键字参数,形成字典{key:value}

image.png

函数的返回值return

return语句返回结果有以下特征:
函数可返回任意类型的数据,包括基本类型、列表、字典甚至其他函数
没有return语句的函数,默认返回None
return会立刻终止函数执行,后边的代码也不再执行
可返回多个值,实际以元组形式返回

image.png

函数的作用域

Local:局部作用域,即函数中定义的变量,仅在函数内有效
Enclosing:外层函数的变量,对嵌套的内层可见
Globa:全局变量,就是模块级别定义的变量
Built-in:Python内置的变量和函数(比如:print、len)
搜索变量的优先级依次是:局部作用域>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB

image.png

变量的修改

一个不在局部作用域的变量默认是只读的,如果试图为其绑定一个新的值,python认为是在当前局部作用域里创建一个新的变量,重新赋值,也就是说在当前局部作用域中,如果直接使用外部作用域的变量,那么变量是只读的,不能修改;

如下边的代码:第一个print输出的count1其实是外部作用域中的10;但第二遍输出的count1,使用的是重新赋值的100

image.png

解决办法:
使用 `global` 关键字用于在函数内部声明一个变量是全局变量,从而可以在函数内部访问和修改在函数外部定义的全局变量。
过程:定义类一个函数并且调用sum()时整个函数已经加载到内存了,然后从def往下执行,执行到print(count1)发现报错,是因为在内存中也能找到count1,但是正常情况应该先声明一个变量然后再调用,所以导致保存,因为它虽然能找到但又执行不了.所以我们添加global count1,给python说明一下,count1是全局变量,可以内部访问和修改在函数外部定义的全局变量。所以第1个print输出10是因为它访问了全局变量,而第2个print输出100访问的是重新赋值的count1.

image.png

只有模块、类、及函数才能引入新作用域;
对于一个变量,内部作用域先声明就会覆盖外部变量,不声明就会直接使用外部作用域的变量;
内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字.

image.png

函数名可以进行赋值;
函数名可以作为函数的参数,还可以作为函数的返回值

image.png

高阶函数

判断一个函数是否是高阶函数需要满足以下的条件:
一个函数的参数是另一个函数
一个函数的返回值return为另一个函数

image.png

递归函数

递归的特性:
调用自身函数
有一个结束条件
但凡是递归可以写的循环也都可以解决.递归的效率在很多时候会很低

image.png

内置函数

重要的内置函数1:  
filter(function,sequence)  
用于过滤序列,过滤掉不符合条件的元素,返回一个迭代对象,  
接收两个参数,第1个是函数,第2个是序列,函数的作用是判断每个元素是否符合条件

image.png

重要的内置函数2:  
map(function,sequence)  
将传入的函数依次作用到序列的每个元素,并把结果作为新的迭代器返回  
接收两个参数,第1个是函数,第2个是序列  
与filter区别在于,filter只做筛选,不做改变.而map是会使原来的序列发生变化

image.png

重要的内置函数3:  
它会对参数序列中元素进行累积计算,接收两个参数,第一个为函数(该函数需要接收两个参数,返回一个值)  
第二个为序列,依次将前一个计算结果和序列下一个元素传入函数进行计算

image.png

重要的内置函数4
匿名函数lambda的命名规则,用lambda关键字标识,冒号:左侧标识函数接收的参数(x,y),冒号右边表示函数的返回值 x+y

image.png

函数的应用:闭包closure

闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包.

image.png