一、函数参数类型
不可变类型参数:整数、字符串、元组。 fun(a)内部修改 a的值,只是修改另一个复制的对象,不会影响 a 本身。 可变类型:列表,字典。如 fun(la), 则是将 la 真正的传过去,修改后fun外部的la也会受影响 1、传递不可变类型参数,不会影响参数本身。
2、传递可变类型参数,会影响参数本身。
二、命名空间
命名空间指的是保存程序中的变量名和值的地方。命名空间的本质是一个字典, 用来记录变量名称和值。字典的key是变量的名称,字典的value对于的是变量的 值。 例如 {‘name’:’zs’,’age’:10} 命名空间一共分为三种:局部命名空间、全局命名空间、内置命名空间 局部空间: 每个函数都有自己的命名空间,叫做局部空间,它记录了函数的变量,包括函数 的参数 和局部定义的变量 全局空间: 每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包 括函数、 类、其它导入的模块。 内置名称空间: 任何模块均可访问它,它存放着内置的函数和异常。
- 命名空间的访问
局部名称空间使用 locals() 函数来访问 全局命名空间的访问使用globals()函数访问。
全局命名空间:
- 命名空间加载顺序
内置命名空间(程序运行前加载)>全局命名空间(当程序运行的时候加载全局命名 空间)>局部命名空间(程序运行中:函数被调用时才加载)当函数返回结果 或 抛 出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
- 命名空间查找顺序
当使用某个变量的时候,先从局部命名空间中找,如果能找到则停止搜索,如果 找不到在去全局名称空间中查找,如果找到则停止搜索,如果找不到则到内置名 称空间中查找,如果找不到则报错。
嵌套函数的情况:
1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
2、然后是在父函数的命名空间中搜索
3、接着是模块命名空间中搜索
4、最后在内置命名空间中搜索
三、作用域
作用域指的是变量在程序中的可应用范围。
作用域按照变量的定义位置可以划分为4类即LEGB:
Local(函数内部)局部作用域。
Enclosing(嵌套函数的外层函数内部)嵌套作用域(闭包)。
Global(模块全局)全局作用域。
Builtin(内建)内建作用域。(指的是builtins.py模块)
a = 10
def father():
b = 20
def son():
c = 30
prin(a,b,c,id) #G C L E
son()
father()
Python内层作用域访问外层作用域时的顺序: Python搜索4个作用域[本地作用域(L)之后是上一层结构中def或者lambda的本 地作用域(E),之后是全局作用域(G)最后是内置作用域(B)(即python的内置类和 函数等)] 并且在第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程 中都没有找到,Python就会报错。
注意: 在python中,模块(module),类(class)、函数(def、lambda)会产生新 的作用域,其他代码块是不会产生作用域的,也就是说,类似条件判断 (if……else)、循环语句(for x in data)、异常捕捉(try…catch)等的变量是 可以全局使用的。
四、全局变量和局部变量
在函数中定义的变量称为局部变量,只在函数内部生效, 在程序一开始定义的变量称为全局变量,全局变量的作用域是整个程序。
name = 'zs' #全局变量
def s():
age = 10 #局部变量
global和nonlocal关键字
1、global关键字可以将局部变量变成一个全局变量。 格式: global 变量名称。
2. nonlocal关键字可以修改外层(非全局)变量。
命名空间和作用域的关系
命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键 值对的集合,变量名与值是一一对应关系。 作用域定义了命名空间中的变量能够在多大范围内起作用。
匿名函数与内置函数
# Encoding = utf-8
# Auther:Xiao le
_date_ = "2019/12/11 17:56"
'''加法'''
add = lambda x,y :x + y
'''找最大'''
dic = {"k1":10,"k2":100,"k3":30}
print(max(dic.items(),key=lambda a:a[1]))
'''找最大'''
students = [{"name":"zs","age":21},
{"name":"ls","age":20},
{"name":"ww","age":19}]
students = dict(students)
a = int(input())
b = students['age'==a]
print(b)
'''返回平方'''
lst = [1,2,3,4,5,6]
print(list(map(lambda s:s**2,lst)))
'''返回奇数'''
lst = [1,2,3,4,5,6,7,8,9]
print(list(filter(lambda n : n%2==1,lst)))
'''映射'''
a = ('a'),('b')
b = ('c'),('d')
l = lambda x,y: dict(zip(x,y))
print(l(a,b))