生成器

我自己想写个可迭代的,——生成器
生成器的本质就是迭代器
因此生成器的所有好处都和迭代器一样
但是生成器是我们自己写的python代码
生成器的实现有两种方式:
1.生成器函数
2.生成器表达式

def func():
return ['衣服1','衣服2000000'] ret = func()
print(ret) def g_func():
yield 1 g = g_func()
print(g) # <generator object g_func at 0x00000000006AAFC0>
generator 生成器 ---> 迭代器
print('__iter__' in dir(g)) # True
print('__next__' in dir(g)) # True
print(g.__next__()) # 1

生成器函数和普通函数之间的区别
生成器函数中含有yield关键字
生成器函数调用的时候不会立即执行,而是返回一个生成器

def g_func():
print('aaaa')
yield 1
print('bbbb')
yield 2 g = g_func()
for i in g:
print(i)
# print(g.__next__())
# print(g.__next__()) def cloth():
for i in range(1000000):
yield '衣服%s'%i g_cloth = cloth()
print(g_cloth.__next__())
print(g_cloth.__next__())

监听文件末尾追加的例子

def tail():
f = open('文件',encoding='utf-8')
# print('__iter__' in dir(f)) # True
# print('__next__' in dir(f)) # True
f.seek(0,2)
while True:
line = f.readline()
if line:
yield line
import time
time.sleep(0.1)
g = tail()
for i in g:
print(i)

send的用法

def func():
print('*'*10)
a = yield 5
print('a :',a)
yield 10 g = func()
num = g.__next__()
print(num)
num2 = g.send('alex') # 相当于next,但是会传值给yield前的变量
print(num2)

send:从哪一个yield开始接着执行,就把一个值传给了哪个yield
send不能用在第一个触发生成器
生成器函数中有多少个yield就必须有多少个next+send

计算移动平均值

def init(func):  # 生成器的预激装饰器
def inner(*args,**kwargs):
g = func(*args,**kwargs)
g.__next__()
return g
return inner @init
def averager():
total = 0.0
count = 0
average = None
while True:
term = yield average
total += term
count += 1
average = total/count g_avg = averager()
# next(g_avg) # g_avg.__next__()
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))

yield from

def func():
a = 'AB'
b = 'CD'
yield from a # 接收一个可迭代对象,相当于下面的for,python3特有
# for i in a:
# yield i
yield from b
# for j in b:
# yield j
g = func()
for i in g:
print(i)

生成器函数:生成一个生成器的函数
生成器的本质才是迭代器
生成器函数的特点:
带有yield关键字,且调用之后,函数内的代码不执行
触发执行的方式:
next
send send(None) == __next__()
for循环

生成器表达式

y = [1,2,3,4,5,6,7,8]
g = (i**2 for i in y )
print(g) # <generator object <genexpr> at 0x00000000006AAFC0>
print(list(g)) # [1, 4, 9, 16, 25, 36, 49, 64]
# for i in g:
# print(i) l = ['鸡蛋%s'%i for i in range(10)]
print(l)
laomuji = ('鸡蛋%s'%i for i in range(10))
for egg in laomuji:
print(egg)

面试题

def demo():
for i in range(4):
yield i g=demo() g1=(i for i in g)
g2=(i for i in g1) print(list(g1)) # [0, 1, 2, 3]
print(list(g2)) # []
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test()
for n in [1,10]:
g=(add(n,i) for i in g)
# n = 1
# g=(add(n,i) for i in test())
# n = 10
# g=(add(10,i) for i in (add(10,i) for i in test())) print(list(g)) # [20, 21, 22, 23]

day14生成器的更多相关文章

  1. day14.生成器迭代器作业

    1.写生成器,从文件中读取内容,再每一行读取的内容前加上 ‘***’之后返回给用户 def func(filename): word = input('输入你想找的内容:') with open(fi ...

  2. day14.生成器进阶,推导式

    生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...

  3. day14 生成器迭代器

    迭代器(iterator) 可迭代对象: 可以使用迭代器取出数据的对象 判断一个对象是否是可迭代对象,就看这个对象有没有实现__iter__方法 所有的容器类型(包括字符串)都是可迭代的 迭代器的使用 ...

  4. day14: 生成器进阶

    1,复习,迭代器:双下方法很少直接调用,一般都是通过其他语法触发的:迭代器一定可迭代,可迭代的通过调用iter()方法皆可以得到一个迭代器. 迭代器很方便使用,所有的数据只可以取一次,节省内存空间.生 ...

  5. day14 生成器的进阶

    一.生成器的两种形式  1.生成器函数的应用 # def cloth(): # for i in range(100): # yield '衣服%s'%i # # g = cloth() # for ...

  6. python基础一 day14 生成器函数进阶

    def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''' ...

  7. python基础一 day14 生成器函数进阶(1)

  8. day14 带参装饰器、迭代器、生成器

    """ 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及w ...

  9. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

随机推荐

  1. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  2. Shell面试题4:扫描网络内存活主机案例

    19.1.4企业Shell面试题4:扫描网络内存活主机案例 写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些? [root@st153 tools]# cat check_ ...

  3. Windows的静态库使用步骤

    windows库程序: 1.静态库程序 - 运行时不独立存在,会被链接到可执行文件或者动态库中,目标程序的归档. 文件扩展名:LIB 2.动态库程序 - 运行时独立存在,不会被链接到可执行文件或其他动 ...

  4. Oracle启动中,startup nomount、 startup mount 有什么差别?

    Oracle启动中,startup nomount. startup mount 有什么差别? 解答: startup nomount:启动实例,读取参数文件,分配内存空间,启动后台进程,打开跟踪文件 ...

  5. PDF解析。。。

    解析出PDF中的文字.用项目名称作Key取对应的值.. 正则匹配 .....:..\n

  6. opencv2.4.9+VS2010配置

    opencv2.4.9 https://pan.baidu.com/s/15b5bEY65R4CptayEYVAG4A 安装包路径:D:\文件及下载相关\文档\Tencent Files\845235 ...

  7. Node.js 入门 资源

    Node.js 入门 <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm ...

  8. hdu3665-Seaside(SPFA,dijkstra,floyd)

    Seaside Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. [原创]adb使用教程v1.1.0-----by-----使用logcat快速抓取android崩溃日志

    原文再续,书接上回:<使用logcat快速抓取android崩溃日志>中提到的工具包可以下载拉~ <使用logcat快速抓取android崩溃日志>:http://www.cn ...

  10. 【转载&总结】后缀数组及广泛应用

    转自:http://blog.csdn.net/yxuanwkeith/article/details/50636898 五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码) 作者:YxuanwKe ...