1.迭代器原理及使用
迭代器&生成器
迭代器
迭代器是访问集合元素的一种方式.且带起对象从集合的第一个元素开始访问,知道所有的元素被访访问玩结束,迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退,另外迭代器的一大优点是不要求事先准备好整个迭代过程,中所有的元素,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元祖可以不存在或者被销毁,这个特点使得他特别适合用于便利一些巨大的或是无限的集合,比如几个G的文件.
特点:
1.访问者不需要关心迭代器内部的结构,仅需要通过next()方法不断取下一个内容.
2.不能随机访问集合中的某个值,只能从头到尾依次访问
3.访问到一半时不能方回退
4.便于循环比较大的数据集合,节省内存.
迭代器不能通过下标的方式来取值的,
1 __author__ = 'Administrator' 2 a = iter(['aa','bb','cc']) 3 print(a[1]) 4 ------------------------------------------------------------------------------------ 5 输出: 6 Traceback (most recent call last): 7 File "E:/python/day1/day4/迭代器.py", line 3, in <module> 8 print(a[1]) 9 TypeError: 'list_iterator' object is not subscriptable 10 可见迭代器不能用这方方法来取, 11 12 ------------------------------------------------------------------------------------ 13 __author__ = 'Administrator' 14 a = iter(['aa','bb','cc']) 15 print(a.__next__()) 16 print(a.__next__()) 17 print(a.__next__()) 18 ------------------------------------------------------------------------------------ 19 输出: 20 aa 21 bb 22 cc
生成器generator
定义: 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
1 __author__ = 'Administrator' 2 def cash_money(amount): 3 while amount > 0: 4 amount -=100 5 yield 100 6 print("aaasdfasdfsadfaaaa") 7 # print(" mei qian le!!!") 8 9 atm = cash_money(500) 10 print(type(atm)) 11 print(atm.__next__()) 12 print(atm.__next__()) 13 print(atm.__next__()) 14 print(atm.__next__()) 15 print(atm.__next__()) 16 print(atm.__next__()) 17 -------------------------------------------------------------------------------- 18 #生面定义了一个函数,函数调用的时候返回的是迭代器(generator),然后函数中包含了 yield 语法 所以就变成了生成器 19 #生成器在调用的时候就用到了next() 20 21 #输出: 22 #输出的是函数返回的 类型 23 <class 'generator'> 24 #提示第一次取钱 25 100 26 #当第二次取钱的时候就会执行print 中的内容,由此可以说明,当第一次执行完之后,程序并没有结束, 27 aaasdfasdfsadfaaaa 28 100 29 aaasdfasdfsadfaaaa 30 100 31 aaasdfasdfsadfaaaa 32 100 33 aaasdfasdfsadfaaaa 34 100 35 aaasdfasdfsadfaaaa 36 #当打印到第五次的时候表示已经没有值了 所以会有了以下的提示 37 Traceback (most recent call last): 38 File "E:/python/day1/day4/迭代器.py", line 16, in <module> 39 print(atm.__next__()) 40 StopIteration