- # 1. 生成器的本质就是迭代器
- # 2. 通过函数变成一个生成器
- # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # 我的函数走到这了 # # g = func() # 生成一个生成器
- # print(g.__next__()) # print(g.__next__()) # print(list(range(10000)))
- # def func(): # print(1) # # return 5 # yield 5 # print(func().__next__()) # 这样生成一个生成器 # print(func().__next__()) # 这样生成一个生成器 # print(func().__next__()) # 这样生成一个生成器 # print(func().__next__()) # 这样生成一个生成器
- # 函数体存的是代码
- # 1. 语法分析
- # 2. 语义分析
- # 3. 词法分析
- # python2 next() iter()
- # python3 next() __next__() iter() __iter__()
- # 大批量的数据的时候首先要想到生成器
- # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # 我的函数走到这了 # # g = func() # 生成一个生成器 # print(g.__next__()) # print(g.__next__())
- # 碰到 return 就结束函数 # 碰到 yield 不结束就挂起 # 生成器的好处, 非常节省内存
- # def func():
- # print(1)
- # a = yield 2 # 1. 挂起 2. 返回值 3. 接受值
- # print(a) # '123'
- # print(3)
- # b = yield 4
- # print(b) #'234'
- # c = yield 9
- #
- # g = func()
- #
- # print(g.__next__()) #1 2 g.send(None)
- # print(g.send('123')) # send = next + 传值
- # print(g.send('234')) # send = next + 传值
- # # 第一次调用生成器的时候使用 send 里边的值必须是 None
- # print(g.send('123')) # send = next + 传值 # print(g.send('234')) # send = next + 传值 # # 第一次调用生成器的时候使用 send 里边的值必须是 None
- # def func():
- # yield 1
- # yield 2
- #
- # g = func()
- # ret = g.__next__()
- # print(ret+4)
- # print(g.__next__())
- # def func():
- # li = [1,2,3,4]
- # # yield li
- # yield from li
- #
- # ret = func() # 把生成器的地址给了 ret
- # print('is ret',ret.__next__())
- # # 执行 ret 这个变量的指向的生成器地址
- # print('is ret',ret)
- # # 在全局空间找到一个变量叫做 ret 的, 打印它的值 值就是生成器的地址
- # # 执行 ret 这个变量的指向的生成器地址 # print('is ret',ret) # # 在全局空间找到一个变量叫做 ret 的, 打印它的值 值就是生成器的地址
- # def func(): # li = [1,2,3,4] # l2 = [5,6,7,8] # # yield from li # # yield from l2 # for i in li: # yield i # # for em in l2: # yield em # # ret = func() # 把生成器的地址给了 ret # print('is ret',ret.__next__()) # print('is ret',ret.__next__()) # print('is ret',ret.__next__()) # print('is ret',ret.__next__()) # print('is ret',ret.__next__())
- # 总结:
- # 1. 生成器的本质就是一个迭代器
- # 2. 生成器一定是一个迭代器, 迭代器不一定是一个生成器
- # 3. 生成器是可以让程序员自己定义的一个迭代器 #
4. 生成器的好处, 节省内存空间 #
5. 生成器的特性 一次性的, 惰性机制, 从上向下 #
6.send 相当于 next + 传值, 第一次触生成器的时候, 如果使用 send(None) # 值必须是 None, 一般我建议你们使用__next__ #
7. python2 iter() next() # python3 iter() next() __next__() __iter__() #
8.yield from 将可迭代对象元素逐个返回
- # 列表推导式
- # 列表推导式
- # li = []
- # for i in range(10):
- # li.append(i)
- # print(li)
- # print([i for i in range(10)])
- # [结果 语法] #容器
- li = [] # for i in range(10): # if i%2 == 1: # li.append(i) # print(li)
- # print([i for i in range(10) if i%2 == 0]) # 过滤 (筛选)
- # li = [] # for i in range(10): # for em in range(3): # li.append(em) # print(li)
- # print([j for i in range(10) for em in range(3) for j in range(5)])
- # 集合推导式
- # 集合推导式
- # s = {
- i for i in range(10)
- }
- # print(s)
- # {
- 结果 语法
- } 容器
- # {
- 结果 语法
- } 容器
- # 字典推导式:
- # print({
- i:i+1 for i in range(10)
- })
- # print(type({
- 1,2,32,4
- }))
- # g = (i for i in range(10))
- # {
- '1':1,'2':2
- } # {
- '1','2'
- }
- # {
- 1:2,2:3,3:4
- } # {
- '美女':1999,1999:2
- }
- # 推导式:\
- # 1. 列表
- # 2. 集合
- # 3. 字典
- # 1. 生成器推导式
- # 1. 生成器: # 总结:
- # 1. 生成器的本质就是一个迭代器
- # 2. 生成器一定是一个迭代器, 迭代器不一定是一个生成器
- # 3. 生成器是可以让程序员自己定义的一个迭代器
- # 4. 生成器的好处, 节省内存空间
- # 5. 生成器的特性 一次性的, 惰性机制, 从上向下
- # 6.send 相当于 next + 传值, 第一次触生成器的时候, 如果使用 send(None) # 值必须是 None, 一般我建议你们使用__next__ # 7. python2 iter() next() # python3 iter() next() __next__() __iter__()
- # 8.yield from 将可迭代对象元素逐个返回
- # 2. 推导式: # 总结: # 列表 # 集合 {
- 1,2,3
- } # 字典 {
- 1:2,2:4
- }
- # 看着像元组的其实是一个 生成器推导式
- # 1. 外部需要容器包一下, 里边第一个位置 结果 剩下位置都是语句
- # 2. 推导式 -- 面试 实现小的需求时可以使用推导式, 推导式节省代码
- # 3. 推导式不要写太长, 可读性查.
来源: http://www.bubuko.com/infodetail-2989417.html