欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

迭代器vs可迭代对象,推导式vs生成器

程序员文章站 2022-06-08 19:49:12
...

迭代器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
迭代器vs可迭代对象,推导式vs生成器

附录

迭代器vs可迭代对象,推导式vs生成器

相关标签: Python干货