标签:
‘‘‘
迭代器从对象的第一个元素一直到最后,只能从前往后退,
循环到那一次,就只能访问之后的数据。
迭代器最大的优点,不需要准备事先准备的元素
迭代的元素,仅仅可以在需要迭代的时候使用,
特别适合用于对读大文件
cat/vi,cat使用迭代器
vi打开大文件的时候需要很长时间,cat不需要
cat就是通过迭代的形式来读文件
读一行显示一行,这样就比较省内存。10个g的文件,再循环读取下一行。
迭代器的特点
不能随机访问某个值,
访问到一半的时候是不能回退的
便于循环比较大的数据
迭代器里面没有其他方法,仅仅有一个next方法
生成器
这个函数返回的结果就是一个生成器
‘‘‘
names=iter([1,2,3])
print(names)
print(names.__next__())
print(names.__next__())
print(names.__next__())
‘‘‘
f=open(‘test.log‘,‘w‘)
f.write("sdfdfdf")
for line in f:
print(line)
f.close()
这个相当于迭代器的功能这种方法读取文件会
比较节省内存空间,读取较快
‘‘‘
def cash_money(amount):
while amount >0 :
amount-=100
yield 100
print("取钱")
a=cash_money(500)
print(type(cash_money(100)))
print(a.__next__())
print(‘来吧‘)
print(a.__next__())
print(a.__next__())
‘‘‘
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
‘‘‘
‘‘‘
第六次就会出现失败
程序多是串行,按照以前的方法,如果卡住,需要等待
在这里存在一个异步的需求。
生成器可以保存上一次运行的结果
可以在运行print(‘来吧‘)后再运行其他的
正常的程序对于循环是不可以跳出的
yield不但可以返回值,还可以接受一个值
在底层执行的过程中依然还是串行的。
‘‘‘
def consumenr(name):
while True:
print(‘准备吃包子啦‘)
boazi=yield
print("包子被吃啦")
print(name)
print(boazi)
def shengchan(name):
c=consumenr(‘a‘)
c1=consumenr(‘b‘)
c.__next__()
c1.__next__()
print(‘老子开始做包子‘)
for i in range(10):
print("做啦两个包子",i)
c.send(i)
c1.send(i)
shengchan(‘alex‘)
C:\Python34\python.exe "C:/Users/Admin/PycharmProjects/untitled1/第5 天/迭代器.py"
<list_iterator object at 0x0228F670>
1
2
3
<class ‘generator‘>
100
来吧
取钱
100
取钱
100
准备吃包子啦
准备吃包子啦
老子开始做包子
做啦两个包子 0
包子被吃啦
a
0
准备吃包子啦
包子被吃啦
b
0
准备吃包子啦
做啦两个包子 1
包子被吃啦
a
1
准备吃包子啦
包子被吃啦
b
1
准备吃包子啦
做啦两个包子 2
包子被吃啦
a
2
准备吃包子啦
包子被吃啦
b
2
准备吃包子啦
做啦两个包子 3
包子被吃啦
a
3
准备吃包子啦
包子被吃啦
b
3
准备吃包子啦
做啦两个包子 4
包子被吃啦
a
4
准备吃包子啦
包子被吃啦
b
4
准备吃包子啦
做啦两个包子 5
包子被吃啦
a
5
准备吃包子啦
包子被吃啦
b
5
准备吃包子啦
做啦两个包子 6
包子被吃啦
a
6
准备吃包子啦
包子被吃啦
b
6
准备吃包子啦
做啦两个包子 7
包子被吃啦
a
7
准备吃包子啦
包子被吃啦
b
7
准备吃包子啦
做啦两个包子 8
包子被吃啦
a
8
准备吃包子啦
包子被吃啦
b
8
准备吃包子啦
做啦两个包子 9
包子被吃啦
a
9
准备吃包子啦
包子被吃啦
b
9
准备吃包子啦
Process finished with exit code 0
标签:
原文地址:http://www.cnblogs.com/xwl65/p/5187148.html