函数的参数类型
- 不可变类型参数:字符串str,数值型,元组tuple
- 传递的参数不会影响参数本身,只是修改了另一个复制的对象
- 可变类型参数:列表list,字典dict
- 传递参数会影响参数本身
命名空间
定义:保存程序中的变量名和值的地方。命名空间的本质是一个字典,用来记录变量名称和值
-
命名空间一共分为三种:局部命名空间、全局命名空间、内置命名空间
- 局部命名空间:每一个函数都有自己的命名空间,记录函数内部的变量,函数的参数
- 全局命名空间:每个模块都有自己的命名空间,记录了模块的变量,类,导入的模块
- 内置命名空间:任何模块都可以访问,记录内置函数和异常
-
命名空间的访问
- 局部命名空间使用 locals() 函数来访问
- 全局命名空间的访问使用 globals()函数访问
命名空间的加载顺序:内置-->全局--局部
命名空间的查找顺序:局部-->全局-->内置
作用域
定义:是变量在程序中的可应用范围
-
分类:分为4类 LEGB
- L-->local(函数内部) 局部作用域
- E-->enclosing 嵌套作用域
- G-->global 全局作用域
- B-->built in 内建作用域
模块,类,函数会产生新的作用域, 条件语句if,循环语句while,for不会产生新的作用域
全局变量和局部变量
局部变量:在函数中定义的变量成为局部变量,只在函数内部起作用
全局变量:在程序一开始定义的变量成为全局变量,全局变量的作用域是整个程序
-
global 关键字可以将一个局部变量变成一个全局变量
- 格式:global 变量名
-
nonlocal:可以修改外层(非全局)变量 -->嵌套作用域的变量
-格式:nonlocal变量名
内置函数
abs()函数:求绝对值 abs(数据)
-
max()函数:求最大值, max(一组数据,key=func)
- 将迭代器的每一个返回值当做参数传给 key=func 中的 func(一般用 lambda 表达式定 义) ,然后将 func 的执行结果传给 key,然后以 key 为标准进行大小的判断
-
map(func,iterable) 函数 ,第一个参数是函数,第二个参数是可迭代对象
- 函数会作用在可迭代对象内容的每一个元素上进行计算,返回一个新的可迭代内容
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进判 然后返回 True 或 False,最后将返回 True
zip 函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个 tuple, 然后返回一个可迭代的 zip 对象
匿名函数
定义:在定义函数的时候,如果不想给函数起名字,可以用lambda定义一个匿名函数
-
语法:变量名=lambda [参数]:表达式
-
注意:1.表达式中不能有循环,return,可以包含if..else
2.表达式的结果直接返回
-
-
lambda 表达式也会产生一个新的局部作用域。在 def 定义的函数中嵌套 labmbda 表达式,
lambda 表达式 能够看到所有 def 定义的函数中可用的变量
闭包和装饰器
-
闭包
- 1.嵌套 2.内层函数使用外层函数的参数或者变量 3.外层函数返回内层函数的引用
-
装饰器:本质就是一个闭包函数
import time def timer(f): def innner(): start = time.time() f() end = time.time() print("程序运行的时间是:",end-start) return innner @timer def func(): lst = [] for i in range(10000): lst.insert(0,i) func()