python攻城狮006-- 迭代器 & 生成器

你好, 之前的五篇见链接
001-函数技巧\变量\包\标准库
002-高阶函数技巧-lambda\filter\map\reduce 函数
003–文件の读写
004–面向对象
005–装饰器



迭代器介绍

  • 迭代(iterate):意味着重复多次,如循环那样
  • 迭代器: 实现了__iter__的对象是可迭代的,而实现了__next__的对象是迭代器
  • 调用方法__next__时,或next(),迭代器返回其下一个值
  • 如果迭代器没有可供返回的值,出发Stoplteration异常

这部分内容逻辑比较复杂,需要沉下心来研究.

如何从迭代器创建序列

  • 通过刻碟带对象调用内置函数iter可获得一个迭代器

__next__()方法演示代码如下:

# 没有迭代器的时候
l=[1,2,3,4]
for i in l:
	print(i)
>>> 1
>>> 2
>>> 3
>>> 4

# 用迭代器
ll = iter(l)
ll.__next__()
>>> 1
ll.__next__()
>>> 2
ll.__next__()
>>> 3
ll.__next__()
>>> 4
ll.__next__()
>>>报错:StopIteration:  因为四个元素取完了

next()方法演示代码如下:

l=[1,2,3,4]
mm=iter(l)
next(mm)  # 1
next(mm)  # 2
next(mm)  # 3
next(mm)  # 4
next(mm)  # 报错:StopIteration:  因为四个元素取完了

迭代器计算演示

列表返回平方值 下边代码包含三种方法

class PowNumber(object):
   """
   迭代器
   生成1,2,3,4,5,... 数的平方
   """
   value = 0

   def __next__(self):
       self.value += 1
       if self.value > 10:
           raise StopIteration
       return self.value * self.value

   def __iter__(self):
       return self


if __name__ == '__main__':
   pow = PowNumber()
   print(pow.__next__())
   print(pow.__next__())
   print(pow.__next__())
   print(pow.__next__())
   print(next(pow))
   print(next(pow))
   print(next(pow))
   print(next(pow))
# 循环迭代器
   for i in pow:
       print(i)
   

生成器介绍

  • 生成器是一种使用普遍函数语法定义的迭代器
  • 包含yield语句的函数都被称为生成器
  • 不适用return返回一个值,而是可以生成多个值,每次一个
  • 每次使用yield生成一个值后,函数都将冻结,即在此停止执行
  • 被重新唤醒后, 函数将从停止的地方开始继续执行

一种生成器

l3 = [x*x for x in [1,2,3,4,5]]
l3 #[1, 4, 9, 16, 25]
l4 = (x*x for x in [1,2,3,4,5])
l4 #圆括号后,产生的是生成器.类型是 <generator object <genexpr> at 0x10dff5f50>
l4.__next__()  #1
l4.__next__()  #4
next(l4)       #9

yield作用演示

# yield 演示
def pow():
    yield 11
    yield 12
    yield 13
    yield 14
    
if __name__ == '__main__':
    rest=pow()
    print(rest)
    print(next(rest))
    print(next(rest))
    print(next(rest))
    print(next(rest))
    print(next(rest))
    
    #<generator object pow at 0x10e00c050>
    #11
    #12
    #13
    #14
    #报错 StopIteration: 

用生成器做平方的计算

def pow_number():
    return(x*x for x in [1,2,3,4,5])

def pow_number2():
    for x in [1,2,3,4,5]:
        yield x*x

if __name__ == '__main__':	
    rest=pow_number2()
    print(next(rest))
    # 1
    print(next(rest))
    # 4
    print(next(rest))
    # 9
    print(rest.__next__())
    # 16

用生成器模拟range函数

方式1 ,较复杂,建立nextiter两个函数
class IterRange(object):
    """ 使用迭代器来模拟range函数 """
    def __init__(self, start, end):
        self.start = start - 1
        self.end = end

    def __next__(self):
        self.start += 1
        if self.start >= self.end:
            raise StopIteration
        return self.start

    def __iter__(self):
        return self

if __name__ == '__main__':
    iter = IterRange(5, 10)
    print(next(iter)) #5
    print(next(iter)) #6
    print(next(iter)) #7
    print(next(iter)) #8
    print(next(iter)) #9
    print(next(iter)) #StopIteration: 
    l = list(iter)    
    print(l)          #在上边内容注释掉的情况下:[5, 6, 7, 8, 9]
方式二: 面向对象方式
class GenRange(object):
    """ 使用生成器来模拟range函数 """
    def __init__(self, start, end):
        self.start = start - 1
        self.end = end

    def get_num(self):
        while True:
            if self.start >= self.end - 1:
                break
            self.start += 1
            yield self.start

if __name__ == '__main__':
    gen = GenRange(5, 10).get_num()   #<generator object GenRange.get_num at 0x10e00cbd0>
    print(gen)        #<generator object GenRange.get_num at 0x10e00cbd0>
    print(next(gen))  # 5
    print(next(gen))  # 6
    print(next(gen))  # 7
    print(next(gen))  # 8
    print(list(gen))  #在上边注释掉的情况下 [5, 6, 7, 8, 9]
方式三:优化掉还要加.get_num这部分, 函数方式
def get_num(start, end):
    start -= 1
    while True:
        if start >= end - 1:
            break
        start += 1
        yield start
if __name__ == '__main__':
    gen_f = get_num(5, 10)
    print(gen_f)          #<generator object get_num at 0x10e00c9d0>
    print(list(gen_f))    #[5, 6, 7, 8, 9]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,让我们来谈谈 Python 中的异常处理。在 Python 中,异常是程序在运行时遇到的错误或问题,它会导致程序停止运行并抛出一个异常。为了避免这种情况,我们可以使用 try/except 块来捕获并处理异常。例如: ``` try: # some code that might raise an exception except SomeException: # handle the exception ``` 其中,SomeException 是你想要捕获的异常类型。当代码运行到 try 块中的代码时,如果出现了 SomeException 异常,那么 except 块中的代码就会被执行。 接下来,让我们来谈谈 Python 中的对象。在 Python 中,一切都是对象,包括数字、字符串、函数等等。对象有一个类型,它定义了对象可以执行的操作。例如,数字类型可以执行加、减、乘等操作,字符串类型可以执行拼接、切片等操作。你也可以创建自己的对象,并定义它们的类型和操作。 最后,让我们来谈谈 Python 中的迭代器迭代器是一种对象,它可以让你逐个访问一个序列中的元素。Python 中的迭代器是通过 __iter__ 和 __next__ 方法实现的。__iter__ 方法返回一个迭代器对象,__next__ 方法返回序列中的下一个元素。例如: ``` class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration result = self.data[self.index] self.index += 1 return result my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item) ``` 在上面的例子中,我们创建了一个名为 MyIterator 的迭代器对象。它有一个 data 属性,表示要迭代的序列,以及一个 index 属性,表示当前迭代的位置。__iter__ 方法返回 self,表示它本身就是一个迭代器对象。__next__ 方法返回序列中的下一个元素,并将 index 属性加 1。当迭代器遍历到序列末尾时,会抛出 StopIteration 异常,表示迭代结束。 希望这些信息能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MINUS大大

你的鼓励是我写下去的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值