10.1 命名空间
-
概述
- 命名空间指的是保存程序中的变量名和值的地方.本质上是一个字典,字典的key就是变量名,value就是变量对应的数据.
- 局部命名空间: 函数内部
- 全局命名空间, python文件中
- 内置命名空间: python解释器层面, builitins, python各个系统层级
-
访问命名空间
- 局部命名空间使用locals()函数来访问
- 全局命名空间的访问使用 globals() 函数访问
-
命名空间加载顺序
- 内置命名空间–>全局命名空间–>局部命名空间
-
命名空间的查找顺序
- 使用某个变量时, 先从局部命名空间查找, 如果找到了就停止搜索,如果没有找到,去全局命名空间查找,找到了停止,如果没有找到,去内置命名空间去查找,如果没找到就报错
10.2 作用域
-
概述
-
作用域指的是变量在程序中的可应用范围
-
作用域按照变量的定义位置可以划分为四类即:L, E, G, B
-
Local( 函数内部 ) 局部作用域
-
Enclosing(嵌套函数的外层函数内部)嵌套作用域
-
Global(模块全局)全局作用域
-
Built-in(内建)内建作用域
-
-
-
内层作用域访问外层作用域的顺序
-
L–>E–>G–>B
-
*内层作用中可以访问,外层作用域当中数据*
*在外层作用域中,不能访问内层作用域中的数据*
-
-
在 Python 中,模块(module),类(class)、函数(def、lambda)会产生新的作用域
条件判断(if……else)、循环语句(for x in data)、异常捕捉不会产生作用域
在分支,循环,异常处理中声明的变量,作为范围是属于当前作用域的
-
10.3 全局变量和局部变量
- 在函数中定义的变量称为局部变量, 只在函数内部生效
- 在程序一开始的定义的变量称为全局变量,全局变量的作用域是整个函数
- 当全局变量是不可变数据类型,函数无法修改全局变量的值, 强制修改会报错
- 在局部变量中可以访问全局变量
- 当全局变量是可变数据类型,函数可以修改全局变量,修改后,全局变量中的数据会受影响
10.4 global和nonlocal
-
global可以将局部变量变成一个全局变量
-
nonlocal关键字可以在内函数中修改外层(非全局)变量
10.5 内置高阶函数
-
abs() 绝对值函数
-
max() 最大值函数
-
max(iterable, key, default) 求迭代器的最大值
-
其中 iterable 为迭代器,max 会 for i in … 遍历一遍这个迭代器
-
然后将迭代器的每一个返回值当做参数传给 key=func 中的 func
-
然后将 func 的执行结果传给 key,然后以 key 为标准进行大小的判断
-
-
map() 映射函数
-
有两个参数,第一个参数是一个函数,第二个参数是可迭代的内容
-
函数会依次作用在可迭代内容的每一个元素上进行计算,然后返回一个新的可迭代内容
-
例如: 将列表lst1 = [1,2,3] 的每个值都乘以2
-
-
filter() 过滤函数
-
用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
-
该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断 , 然后返回 True 或 False,最后将返回 True 的元素放到新列表中
-
例如: 将列表lst=[1,2,3,4,5,6,7,8,0] 过滤出所有的偶数
In [24]: lst=[1,2,3,4,5,6,7,8,0] In [25]: def fun(item): ...: if item%2 == 0: ...: return True ...: In [26]: filter(fun,lst) Out[26]: <filter at 0x7fd52c7c0160> In [27]: list(filter(fun, lst)) Out[27]: [2, 4, 6, 8, 0]
-
-
zip() 函数
-
接受任意多个可迭代对象作为参数 , 将对象中对应的元素打包成一个 tuple
-
返回一个可迭代的 zip 对象 . 这个可迭代对象可以使用循环的方式列出其元素
-
若多个可迭代对象的长度不一致 , 则所返回的列表与长度最短的可迭代对象相同
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isJ2vI5u-1597844873209)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200819194514705.png)]
-
案例: 通过t1=(“a”,”b”),t2=(“c”,”d”) 生成[{“a”:”c”},{“b”:”d”}]
t1 = ("a","b") t2 = ("c","d") res = list(zip(t1,t2)) def fun(item): d = dict() d[item[0]] = item[1] return d print(list(map(fun,res)))
-
10.6 匿名函数
-
匿名函数的定义使用lambda
-
本质为一个函数,没有名字的函数,针对简单函数提供的一种简洁的操作语法
-
语法格式
-
变量 = lambda [参数1,参数2…] : 表达式
-
参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数
-
注意 : 表达式中不能包含 循环,return , 可以包含 if…else… 语句(三元表达式)
-
表达式计算的结果直接返回
-
匿名函数用处: 一般配合高阶函数使用
-
优点: 代码简洁,
-
缺点: 可读性差难于理解, 不推荐使用
-
案例: 使用filter函数过滤所有的奇数 lst = [1,2,3,4,5,6,7,8,9,10]
-
In [8]: list(filter(lambda x : x%2==0, lst)) Out[8]: [2, 4, 6, 8, 10]
-
-
10.7 嵌套作用域和lambda
-
lambda 表达式也会产生一个新的局部作用域。在 def 定义的函数中嵌套 labmbda 表达式能够看到所有 def 定义的函数中可用的变量
-
# 例1 def make_actions(): acts = [] for i in range(5): acts.append(lambda x: i ** x) return acts funcs = make_actions() print(funcs[0](2)) # 16 print(funcs[1](2)) # 16 print(funcs[2](2)) # 16 # 例2 def make_actions(): acts = [] for i in range(5): acts.append(lambda x, y=1: i ** x) return acts funcs = make_actions() print(funcs[0](2)) # 0 print(funcs[1](2)) # 1 print(funcs[2](2)) # 4
-