python3 笔记12 尝试编程2 迭代器与生成器


一、迭代器的使用

1.尝试写一个迭代器

#!/usr/bin/python3

list = [1,2,3,4]
print(type(list))
it = iter(list)
print(type(it))
print(next(it))
print(next(it))
str = 'string'
istr = iter(str)
print(type(istr))
print(next(istr))
print(next(istr))
tup = 1,2,3,4,5,6
print(type(tup))
itup = iter(tup)
print(next(itup))
set1 = {1,2,3,4,5}
print(type(set1))
iset = iter(set1)
print(next(iset))

 

2.迭代器可以使用常规for语句进行遍历

#!/usr/bin/python3
list1 = [1,23,4,5,6]
it = iter(list1)
for x in it:
    print(x,end="|")

3.while中使用next()函数遍历:

#!/usr/bin/python3

list = [1,3,4,5,67,78,78]
print(list)
it = iter(list)
while 1 == 1:
    try:
        print(next(it))
    except StopIteration:
        print('clear!')
        #此处的break如果与try同缩进将是一次循环
        break
        #使用该方法需要 import sys模块
        #sys.exit()

二、创建一个迭代器

      1.

         1.把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__().

         2.类都有一个构造函数,python的构造函数为 __init__(),它会在对象初始化的时候执行。

        __iter__()返回一个特殊的迭代对象,这个迭代器对象实现了 __next__()方法,并通过 StopIteration 异常标识迭代的完成

        __next__() 返回下一个迭代器对象(通python2里的next())

#!/usr/bin/python3

#self放这儿可能是固定格式换其它def 会有警告(Method should have "self" as first argumentpylint(no-self-argument)), self.a 这种后续再讨论
class test1:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        a = self.a
        self.a += 1
        return a

myclass = test1()
myiter = iter(myclass)

print('当前',myiter,'的type',type(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

        2.StopIteration

         StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后出发StopIteration异常来结束迭代。

#!/usr/bin/python3

class test2:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 10:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration

myclass = test2()
myiter = iter(myclass)

for x in myiter:
    print(x)

        3.生成器

在python中,使用了yield的函数被称为生成器(generator)

跟普通函数不同的是,生成器是一个返回迭代器的函数,只用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到yield时韩数据就会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法是从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

使用yield实现斐波那契数列:

#!/usr/bin/python3

import sys

def fibonacci(n):#生成器函数 - 斐波那契
    a , b , counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b  = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,有生成器返回生成

while True:
    try:
        print(next(f),end=" ")
    except StopIteration:
        sys.exit()

 

 

 


总结

本文仅仅简单介绍了迭代器与生成的使用,而迭代器今后将可能被使用,未完待续。

  •  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值