迭代器vs可迭代對象,推導式vs生成器

迭代器vs可迭代對象,生成式vs生成器,推導式

迭代器vs可迭代對

  • 迭代器(類):凡是實現了__iter__,__next__的對象就是迭代器。

  • 可迭代對象:只實現了__iter__方法

例子:手寫迭代器,實現Range()函數

class Range:
def __init__(self, start, stop=None, step=1):
    if stop is None:
        # 說明沒有傳start的值.
        self.start = 0
        self.stop = start
    else:
        self.start = start
        self.stop = stop

    self.step = step

def __iter__(self):
    return self

def __next__(self):
    # 返回當前值,並更新下一個值
    if self.start < self.stop:
        temp = self.start
        self.start += self.step
        return temp
    else:
        raise StopIteration

注意:
1)iter方法,什麼都不用做,返回它自己
2)next函數,返回當前值,並更新下一個。不滿足條件時拋出StopIteration

例子2:使用迭代器實現斐波那契數列

"""
使用迭代器實現斐波那契數列
"""
class Fab:
	def __init__(self, n):
    	self.prev = 0
    	self.curr = 1
    	self.times = 0
    	self.stop = n

	def __iter__(self):
    	return self

	def __next__(self):
    	if self.times <= self.stop:
        	# 更新
       		temp = self.curr
        	self.prev, self.curr = self.curr, self.prev + self.curr
        	self.times += 1
        	return temp
    	else:
        	raise StopIteration

注意:
1)iter 永遠只返回自己
2)因爲每次都會調用__next__ ,所以裏面不用循環

推導式(生成式) vs 生成器

  • 推導式(生成式)

    • 一行代碼實現for循環

    • 從一個數據序列構建另一個新的數據序列的結構體

    • 有三種: 列表,字典,集合。分三部分:“生成值的表達式”, “循環主體”, “過濾條件表達式”

        列表: [i * 3 for i in range(5) if i % 2 == 0]
        字典: {i: i + 3 for i in range(5)}
        集合: {i for i in range(5)}
      
        #列表生成式
        lis = [x*x for x in range(10)]
      
  • 生成器(函數)

    • 特殊的迭代器(不需要自己實現iter和next方法,每次調用yield會暫停,而可以使用next()函數和send()函數恢復生成器)

    • 函數種含有yield關鍵字

    • “惰性求值”(節省內存)一邊循環一邊計算的機制

    • 最簡單創建:把推導式種的【】變()

        #生成器
        generator_ex = (x*x for x in range(10))
      

例子:使用生成器生成斐波那契數列

"""
使用生成器生成斐波那契數列
"""

def fab(n):
	prev, curr = 0, 1
	times = 0

	while True:
        if times <= n:
        	# 迭代
        	temp = curr
        	prev, curr = curr, curr + prev
        	times += 1
        	yield temp
    	else:
        	break

or
在這裏插入圖片描述

附錄

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章