主要是 迭代器和相关使用
人生若只是初见
1函数名的应用
函数名就是变量
可以相互赋值.
可以作为容器的元素
可以作为返回值进行返回
可以作为参数传递给函数
2 闭包
在内部函数使用外部函数的变量.
Def outer ():
a=10
Def inner(“”)
Print(a)
Return inner
Outer()()
Outer()()
Ret =outer()
Ret()
Ret()
闭包好处:
- 保护变量
- 可以让一个变量常驻内存
- 迭代器
-iter-() 可迭代对象.获取迭代器
_next_() + _inter_()
特点:
- 惰性机制
- 只能向前
- 节省内存
For 循环的内部就是迭代器
Lst=[1,3,5]
It =lst._iter_()#获取迭代器
While 1:
Try:
It._next_()
Except StopIteration
Break
Iterable: 可迭代的
Iterator:迭代器
三,今日主要内容
- 生成器
(1) 生成器的本质就是迭代器
(2) 生成器的特点和迭代器一样,取值方式和迭代器一样(_next_(),send():给上一个yield)
(3) 生成器一般由生成器函数或者生成器表达式来创建
(4) 其实就是手写的迭代器
- 生成器函数
和普通函数在执行的时候,默认不会执行函数体,返回生成器)
通过生成器的_next_()分段执行这个函数.
Send()给上一个yield传值,不能在开头(因为没有上一个yield),
最后一个yield也不可能用send()
- 推导式
- 列表推导式[结果 for 循环 条件筛选]
- 字典推导式[k:v for 循环 条件筛选]
- 集合推导式{ k for 循环 条件}
- 生成器表达式
(结果 for 循环 条件)
特点:
- 惰性机制
- 只能向前
- 节省内存(鸡蛋)
生成器函数的特点:
函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数
yield: 相当于return 可以返回数据. 但是yield不会彻底中断函数. 分段执行函数.
gen.__next__() 执行函数. 执行到下一个yield.
gen.__next__() 继续执行函数到下一个yield.
send() 和__next__()是一样的. 可以执行到下一个yield, 可以给上一个yield位置传值
def func():
print("我是第一个段")
a = yield 123
print(a)
print("石头人是第二段")
b = yield 456
print(b) # ??
print("哈赛是第三段")
c = yield 789
print(c)
print("刘伟是最后一个段")
yield 79 # 最后收尾一定是yield
print(g.__next__()) # 没有上一个yield 所以不能使用send() 开头必须是__next__()
for i in func(): # for的内部一定有__next__()
print(i)
print(list(func())) # 内部都有__next__()
推导式:就是用一句话来生成一个列表
Lst=[“python”+str(i) for i in range(1,16)]
Print(lst)
100以内能被3整除的数的平方
Lst=[i*i for i inrange(100) if i%==0]
字典的推导式 就一行
Dic={i:lis[i] for i in range(len(lst)) if i<2}
Print(dic)
dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
d = {v : k for k,v in dic.items()}
S={i for i in range(100)}可删除重复
生成器表达式
Tu=(i for i inrange(10))#没有元祖推导式. 括号是生成器表达式
Print(tu) 生成器
Lst=[i for i in range(10)]# 列表
Print(lst)
Gen=(i for i inrange(10))
生成器函数
Def func():
Print(111)
Yield 222
Yiled 333
G = func() 获取生成器
g1 =(i for i in g) 生成器
G3=func()
G2=(i for i in g3) # 生成器带括号的就是生成器表达式
Print(list(g)) [222,333] 源头,从源头把数据拿走了
Print(list(g1)) 这里执行的时候. 源头已经没有数据了
print(list(g2)) # ??? [] 这里也没有值了
面试题 值钱的题
ef add(a, b):
return a + b
# 生成器函数 # 0-3
def test():
for r_i in range(4):
yield r_i
# 0,1,2,3
g = test() # 获取生成器
for n in [2, 10]:
g = (add(n, i) for i in g)
print(g)
相当于白菜上的害虫
大致意思是 上面定义了一个求和函数
中间 test 是一个生成器函数 不会被执行
然后到最后列表通过list 把生成器函数进行转化然后开始传值
如果列表中有多个元素
可以看成是
N= 2;
g = (add(n, i) for i in g)
N=5:
g = (add(n, i) for i in g)
这是俩个生成器 都不执行 因为是惰性机制
然后等list(g)开始执行
执行 n =10 然后开始循环有几个元素就有几层
每个上层元素都赋值到下个g
索引 根据最开始的函数0.123 n=5
循环2次 到最后向里面放数据
5*3+(0,4)结果就是15.16.17.18