关键字 global nonlocal
global 声明全局变量 如果全局中 存在声明的变量 那么就使用;如果不存在,就创立一个
## 已存在的全局变量
l = [1,2,3]
l1 = l
def func():
global l
l.append(10)
func()
print(l1) ## [1,2,3,10]
print(l) ## [1,2,3,10]
# 不存在的全局变量
def func2():
global l2
l2 = [1,2,3]
return l2
func2()
print(l2)
在局部 , 有使用全局变量的权限,但是没有更改指向的权力
l1 = []
def func(args):
l1.append(args)
return l1
print(func(1))
print(func(2))
print(func(3)) # 【1,2,3】
预编译
## name在全局存在,也在内部存在,但是在使用后定义
name = '报错了'
import time
def func():
print(name)
name = 10
func() #会报错,因为name在内部定义前使用了,外部也存在,出现了歧义
nonlocal 使用上一层 同时在locals里存在
可变默认参数
当默认参数为可变数据类型时,程序会开辟一个新空间,不会因函数执行结束而释放
def func(a,l = []):
l.append(a)
return l
l1 = func(1)
l2 = func(2)
l3 = func(3)
l4 = func(4,[])
print(l1,l2,l3,l4) # [1] [1,2] [1,2,3],[4]
## 个人理解 因为l没有传入,所以l= [] 除去第一次读取的时候执行过,之后也没有执行过l = [],所以l还是之前的列表指向
## 最后的l4 传入了新的[] 所以结果改变
函数名的应用
函数名也是变量名 所以可以相互引用,
所以可以当 实参参数 返回值
def func1(func):
return func()
def func2():
print ('1')
func1(func2) # 1
f 格式化
s = f'几乎什么都可以放{everything}' ## 除了解析出来报错的东西 符号
可迭代对象
只要对象中存在__ iter __ 方法 就是可迭代对象
可迭代对象不能直接遍历 需要转换成迭代器
dir() 内置函数 查看对象中所有方法和属性 返回的是列表
##测试是否是
if '__iter__' in dir(对象):
pass
迭代器
可以重复迭代的工具
对象内部含有__ iter__ () 方法 和 __ next__()就是可迭代对象
迭代器的优点:
- 惰性机制
- 非常节省内存
迭代器缺点
- 不直观
- 没有可用方法
- 效率低
使用迭代器 用while模拟for
l = [1,2,3]
l1 = iter(l)
while 1:
try:
print(next(l1))
except:
break
可迭代对象与迭代器的对比
可迭代对象:操作灵活,直观,效率相对高,占内存
迭代器:节省内存,不直观