亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

詳解Python迭代和迭代器

2020-01-04 17:34:34
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了Python迭代和迭代器,感興趣的小伙伴們可以參考一下
 

我們將要來學習python的重要概念迭代和迭代器,通過簡單實用的例子如列表迭代器和xrange。

可迭代

一個對象,物理或者虛擬存儲的序列。list,tuple,strins,dicttionary,set以及生成器對象都是可迭代的,整型數是不可迭代的。如果你不確定哪個可迭代哪個不可以,你需要用python內建的iter()來幫忙。

>>> iter([1,2,3])<listiterator object at 0x026C8970>>>> iter({1:2, 2:4})<dictionary-keyiterator object at 0x026CC1B0>>>> iter(1234)Traceback (most recent call last): File "<pyshell#145>", line 1, in <module>  iter(1234)TypeError: 'int' object is not iterable

iter()為list返回了listiterator對象,為dictionary返回了dictionary-keyiterator對象。類似對其他可迭代類型也會返回迭代器對象。

iter()用在自定義的類型會怎樣呢?我們先自己定義一個String類:

class String(object): def __init__(self, val):  self.val = val def __str__(self):  return self.valst = String('sample string')

那么,st是可迭代的嗎?

>>> iter(st)TypeError: 'String' object is not iterable

你可能會有幾個問題要問:

怎么讓自定義的類型可迭代?
iter()究竟做了些什么?

讓我們補充String類來找找答案

class String(object):  def __init__(self, val):    self.val = val  def __str__(self):    return self.val  def __iter__(self):    print "This is __iter__ method of String class"    return iter(self.val) #self.val is python string so iter() will return it's iterator>>> st = String('Sample String')>>> iter(st)This is __iter__ method of String class<iterator object at 0x026C8150>

在String類中需要一個'__iter__'方法把String類型變成可迭代的,這就是說'iter'內部調用了'iterable.__iter__()'

別急,不是只有增加'__iter()'方法這一種途徑

class String(object):  def __init__(self, val):    self.val = val  def __str__(self):    return self.val  def __getitem__(self, index):    return self.val[index]>>> st = String('Sample String')>>> iter(st)<iterator object at 0x0273AC10>

‘itr'也會調用'iterable.__getitem__()',所以我們用'__getitem__'方法讓String類型可迭代。

如果在String類中同時使用'__iter__()'和'__getitem__()',就只有'__iter__'會起作用。

自動迭代

for循環會自動迭代

for x in iterable:  print x

我們可以不用for循環來實現嗎?

def iterate_while(iterable):  index = 0  while(i< len(iterable)):    print iterable[i]    i +=1

這樣做對list和string是管用的,但對dictionary不會奏效,所以這絕對不是python式的迭代,也肯定不能模擬for循環的功能。我們先看迭代器,等下回再過頭來。

迭代器

關于迭代器先說幾條………..

1. 迭代器對象在迭代過程中會會產生可迭代的值,`next()`或者`__next()__`是迭代器用來產生下一個值的方法。
2. 它會在迭代結束后發出StopIteration異常。
3. `iter()`函數返回迭代器對象
4. 如果`iter()`函數被用在迭代器對象,它會返回對象本身
我們試一試模仿for循環

def simulate_for_loop(iterable):  it = iter(iterable)  while(True): try:   print next(it) except StopIteration:   break>>> simulate_for_loop([23,12,34,56])23123456

前面我們看過了iterable類,我們知道iter會返回迭代器對象。

現在我們試著理解迭代器類的設計。

class Iterator:  def __init__(self, iterable)    self.iterable = iterable  .  .  def __iter__(self): #iter should return self if called on iterator    return self  def next(self): #Use __next__() in python 3.x    if condition: #it should raise StopIteration exception if no next element is left to return      raise StopIteration

我們學了夠多的迭代和迭代器,在python程序中不會用到比這更深的了。

但是為了學習的目的我們就到這兒。。。。

列表迭代器

你可能會在面試中寫這個,所以打起精神來注意了

class list_iter(object):  def __init__(self, list_data):    self.list_data = list_data    self.index = 0  def __iter__(self):    return self  def next(self):  #Use __next__ in python 3.x    if self.index < len(self.list_data):      val = self.list_data[self.index]      self.index += 1       return val    else:      raise StopIteration()

我們來用`list_iter`自己定義一個列表迭代器

class List(object):  def __init__(self, val):    self.val = val  def __iter__(self):    return list_iter(self.val)>>> ls = List([1,2,34])>>> it = iter(ls)>>> next(it)1>>> next(it)2>>> next(it)34>>> next(it)Traceback (most recent call last): File "<pyshell#254>", line 1, in <module>  next(it) File "<pyshell#228>", line 13, in next  raise StopIteration()StopIteration

xrange

從一個問題開始——xrange是迭代還是迭代器?

我們來看看

>>> x = xrange(10)>>> type(x)<type 'xrange'>

幾個關鍵點:

1. `iter(xrange(num))`應該被支持
2. 如果`iter(xrange(num))`返回同樣的對象(xrange類型)那xrange就是迭代器
3. 如果`iter(xrange(num))`返回一個迭代器對象那xrange就是迭代

>>> iter(xrange(10))<rangeiterator object at 0x0264EFE0>

它返回了rangeiterator,所以我們完全可以叫它迭代器。

讓我們用最少的xrange函數實現自己的xrange

xrange_iterator

class xrange_iter(object):  def __init__(self, num):    self.num = num    self.start = 0  def __iter__(self):    return self  def next(self):    if self.start < self.num:      val = self.start      self.start += 1      return val    else:      raise StopIteration()

my xrange

class my_xrange(object):  def __init__(self, num):    self.num = num  def __iter__(self):    return xrange_iter(self.num)>>> for x in my_xrange(10): print x,0 1 2 3 4 5 6 7 8 9

以上就是本文的全部內容,希望對大家學習掌握Python迭代和迭代器有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品自拍视频| 伊人久久男人天堂| 日本人成精品视频在线| 日韩激情视频在线播放| 亚洲自拍偷拍一区| 日韩精品在线免费观看视频| 欧美激情亚洲自拍| 日韩免费中文字幕| 福利微拍一区二区| 法国裸体一区二区| 69久久夜色精品国产69| 尤物精品国产第一福利三区| 国产97在线播放| 亚洲国产美女精品久久久久∴| 国产+成+人+亚洲欧洲| 成人中心免费视频| 91探花福利精品国产自产在线| 97视频在线免费观看| 欧美大片免费观看| 欧美做受高潮电影o| 日韩电影中文 亚洲精品乱码| 91亚洲精品在线观看| 北条麻妃99精品青青久久| 欧美一级大片在线免费观看| 午夜精品一区二区三区在线视频| 国产成人一区二| 亚洲精选一区二区| 久久久久久久久91| 亚洲自拍另类欧美丝袜| 欧美国产日韩中文字幕在线| 亚洲视频电影图片偷拍一区| 国产精品爽爽爽爽爽爽在线观看| 一区二区成人精品| 色偷偷噜噜噜亚洲男人的天堂| 国产欧美一区二区三区久久人妖| 日韩精品免费视频| 51色欧美片视频在线观看| 国产成人av在线播放| 亚洲欧洲在线看| 欧美又大又粗又长| 日本伊人精品一区二区三区介绍| 亚洲欧美日韩天堂一区二区| 国产一区二区免费| 韩国三级电影久久久久久| 狠狠色噜噜狠狠狠狠97| 成人精品网站在线观看| 91免费在线视频网站| 美女撒尿一区二区三区| 亚洲女人天堂视频| 91九色国产社区在线观看| 孩xxxx性bbbb欧美| 国产精品手机播放| 国产精品高清在线| 色av中文字幕一区| 欧美天堂在线观看| 国产亚洲欧洲高清一区| 欧美夫妻性视频| 国产精品偷伦视频免费观看国产| 久久电影一区二区| 亚洲精品mp4| 9.1国产丝袜在线观看| 久热精品视频在线观看一区| 久久久久久中文字幕| 最近日韩中文字幕中文| 欧美一级高清免费播放| 亚洲最新中文字幕| 亚洲精品97久久| 国产美女久久精品香蕉69| 国产成人精品日本亚洲| 亚洲国产小视频在线观看| 国产亚洲精品久久久久久牛牛| 日本中文字幕成人| 日韩h在线观看| 永久免费精品影视网站| 日本aⅴ大伊香蕉精品视频| 亚洲精品久久久久久久久久久| 国产精品福利在线| 亚洲欧美在线一区| 欧美午夜精品久久久久久人妖| 日韩美女视频免费在线观看| 欧美在线日韩在线| 久久视频精品在线| 国产欧美精品va在线观看| 亚洲精品国产免费| 欧美电影在线观看网站| 精品欧美一区二区三区| 日韩欧美综合在线视频| 久久精品成人动漫| 成人国产精品免费视频| 中文字幕精品www乱入免费视频| 九九九久久国产免费| 欧美在线观看网站| 在线观看国产精品91| 欧美人与性动交a欧美精品| 97国产精品视频| 欧美成人免费va影院高清| 在线观看国产成人av片| 国产精品亚洲激情| 成人免费视频97| 一区三区二区视频| 亚洲xxxxx性| 久久免费福利视频| 国产999精品久久久| 欧美性猛交xxxx免费看漫画| 国产啪精品视频网站| 国产亚洲欧美另类中文| 日日狠狠久久偷偷四色综合免费| 日本亚洲欧美成人| 成人国产精品免费视频| 麻豆国产精品va在线观看不卡| 国产精品久久久久久久久免费| 欧美视频中文在线看| 国产成人精品电影久久久| 亚洲精品电影网| 久久99青青精品免费观看| 国产v综合v亚洲欧美久久| 亚洲曰本av电影| 午夜剧场成人观在线视频免费观看| 精品中文字幕视频| 欧美黑人xxxⅹ高潮交| 久久久久久久香蕉网| 日韩精品极品视频免费观看| 日韩亚洲欧美中文在线| 91香蕉电影院| 亚洲精品美女视频| 久久99青青精品免费观看| 91久久在线观看| 日韩久久精品成人| 久久久电影免费观看完整版| 欧美人交a欧美精品| 久久精品色欧美aⅴ一区二区| 日韩欧美一区二区三区| 色伦专区97中文字幕| 久久精品国产一区二区三区| 欧美最猛黑人xxxx黑人猛叫黄| 久久久国产影院| 91精品国产乱码久久久久久久久| 亚洲色图50p| 国产成人小视频在线观看| 欧美精品18videos性欧| 亚洲深夜福利网站| 国产精品99久久久久久久久| 韩国视频理论视频久久| 欧美日韩国产一区二区| 亚洲美女av黄| 成人国产在线激情| 免费97视频在线精品国自产拍| 国产激情综合五月久久| 精品久久久久久久久久ntr影视| 久久精品国产欧美激情| 日本久久中文字幕| 精品人伦一区二区三区蜜桃免费| 亚洲全黄一级网站| 欧美做受高潮电影o| 欧美精品第一页在线播放| 久久视频国产精品免费视频在线| 久久久久免费视频| 欧美孕妇与黑人孕交| 亚洲视频第一页| 精品久久在线播放| 亚洲精品自在久久| 免费成人高清视频| 欧美电影在线免费观看网站| 国模精品一区二区三区色天香|