python迭代器,iter()函数,通关游戏实例

我们在前面的章节介绍过迭代是个什么概念,我们打了个比方,就像爬楼梯,楼梯的台阶是数据序列中的元素,for循环就像爬楼梯的双脚,一个接着一个地触及台阶,该过程就可以想象为遍历和迭代——脚在遍历,台阶在迭代。这一节我们将详细了解这个迭代器,并设计了一个可以通关的小游戏。


python如何判断一个对象是否可以迭代

我们可以用python内置的collections模块中的Iterable的数据类型来判断python的对象是否是一个可迭代的对象。

>>> from collections.abc import Iterable #导入Iterable数据类型
>>> isinstance([],Iterable) #isinstance()函数可以用来验证数据的类型
True #列表是Iterable类型的数据结构,可迭代
>>> isinstance({}, Iterable)
True #字典也是
>>> isinstance('', Iterable)
True #字符串也是
>>> isinstance(set(), Iterable)
True #集合也是
>>> isinstance(tuple(), Iterable)
True #元组也是
>>> isinstance(range(2), Iterable)
True #range类型的数据也是
>>> isinstance(1, Iterable)
False #数字类型的不是

注意1:如果是python3.3及以上的,导入Iterable时,需要用from collections.abc import Iterable的语法,否则会弹出警告warnning,如果是3.3版本以下的,可以用from collections import Iterable。

注意2:字符串、列表、字典、集合、元组等数据类型虽然是Iterable类型的数据,是可迭代的,就像Iterable英文单词的含义,但它们并不是迭代器iterator,而什么是迭代器呢?


python迭代器

迭代器的概念比较抽象,百度百科里的定义是这样的:迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。 这到底应该要怎么理解呢?个人总结了以下:

迭代器将迭代这种操作从for循环的“枷锁”中解脱出来,因为for循环遍历的时候一旦开启,就是从头到尾遍历一遍的,就像前面的爬楼梯,如果是使用for循环进行迭代,那么一般情况下都是要从第一级台阶一直爬到最后一级台阶,停不下来(除非设置条件,如break、continue之类的),而迭代器不用如此,可以更加灵活,通过next()函数,可以“随用随取”,第一级台阶爬完了,不想爬,就停在那里,等想爬了就继续用next()函数。

在列举用迭代器开发可以通关的游戏实例之前,我们先来了解两个函数。


iter()函数

用于创建迭代器,如:it = iter( [1,2,3] ),具体用法看下面的通关游戏实例。

next()函数

用于获取迭代器的下一个元素,如next( it ),第一次next()获取的是it迭代器的第一个元素值,当next()无值可获取的时候,将引发错误,比如获取it迭代器的3元素之后,继续用next()就会发生错误。具体用法同样看下面的通关游戏实例。

游戏实例

前面我们设计过一个猜字的游戏,但是那类似于单机的游戏,现在我们对这个简单的游戏进行改进,变成通关的游戏。


def guessNum(x, y):
    import random

    md = random.randint(x,y)
    start = x
    end = y
    inp = int(input('从%s到%s猜一个数字:' %(start, end)))
    while start > inp or end < inp:
        inp = int(input('请重新输入从%s到%s猜一个数字:' %(start, end)))

    while start <= inp <= end:
        if inp < md:
            start = inp
            inp = int(input('从%s到%s猜一个数字:' %(start,end)))
            while start > inp or end < inp:
                inp = int(input('请重新输入从%s到%s猜一个数字:' %(start, end)))
        elif inp > md:
            end = inp
            inp = int(input('从%s到%s猜一个数字:' %(start,end)))
            while start > inp or end < inp:
                inp = int(input('请重新输入从%s到%s猜一个数字:' %(start, end)))
        else:
            break
            
score = [10,20,30]
i_end = iter([50,100,200]) #iter()内置函数创建可迭代的对象,
n = len(score) #要通关的关数
i_score = iter(score)
x = 0 #
i = 1
sumScore = 0 #用于统计总得分
while i <= n:  #while循环的条件判断,不仅用于终止while循环,也终止了next()获取超出元素个数范围的值,避免引发错误
    print('第%s关!' %i)
    y = next(i_end) #next()函数用于获取迭代器的下一个元素,当一关通过就用next()获取下一个元素作为猜字游戏的end值
    guessNum(x,y) 
    sumScore += next(i_score) #统计总得分
    
    print('恭喜你闯过了第%s关,你目前的得分是%s分'%(i,sumScore))
    i += 1
——————————————————————————————————————————
第1关!
从0到50猜一个数字10
从10到50猜一个数字:20
从10到20猜一个数字:30
请重新输入从10到20猜一个数字15
从15到20猜一个数字:16
从16到20猜一个数字:18
从18到20猜一个数字:19
恭喜你闯过了第1关,你目前的得分是10分
第2关!
从0到100猜一个数字50
从50到100猜一个数字:60
从50到60猜一个数字:55
从55到60猜一个数字:58
从55到58猜一个数字:56
恭喜你闯过了第2关,你目前的得分是30分
第3关!
从0到200猜一个数字100
从100到200猜一个数字:150
从150到200猜一个数字:180
从180到200猜一个数字:190
从180到190猜一个数字:185
从180到185猜一个数字:183
从180到183猜一个数字:182
从180到182猜一个数字:181
恭喜你闯过了第3关,你目前的得分是60分

通关游戏实例解析

如上面游戏实例中的注释,iter()函数用于创建迭代器对象,next()用于获取迭代器的下一个元素,这比起用for循环来要方便许多。

注意:上面的代码要作为一个游戏来说并不完整,比如我们还可以为该游戏设置猜数字的次数,当超过这个次数的时候,游戏就game over,当然,如果只是限定次数,游戏仍然要靠没有依据的猜测,我们可以为游戏玩家设置问答的程序,如果答对了就可以获得缩小数字范围的提示,等等,还有很多可以进行完善的地方,在后面的章节中,如果有机会,我们就来完善这个游戏。


下一章节,我们将继续介绍python的生成器。


全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.