迭代器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
在这里插入图片描述

附录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值