15.python的for循环与迭代器、生成器

  在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了。之所以拖到现在是因为for循环对前面讲过的序列、字典、集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手。

  首先,for循环和while循环一样,都是在满足一定条件的时候对其内层的代码进行循环执行。不同的是,while循环判断的是条件,而for判断的是迭代对象。

  我们先来看for循环的代码:

a = (1, 2, 3, 4, 5)
for x in a:
    print x

  我们以序列中的元祖为例,发现其输出了这些,那么这段代码的逻辑是怎么样的?为了方便大家理解,我画了这样一个图:

  我写了一个收租的小故事,方便大家理解。不知道为什么写的时候感觉眼角有点湿润。

  for循环其实就是不断的去可迭代对象中拿去元素,而可迭代对象在每次迭代的时候都会把指针下移一格,也就是下次再来拿的时候,拿的是下一个。而这是因为可迭代对象有这样行为,才称其为可迭代。

  这个时候我又要问一个问题,在迭代循环结束以后,x的值是否还存在?

  当然还在,都说了作用域是函数的东西,迭代循环并不是函数。按照for循环的思路,x的值是不断更新的,所以在循环结束的时候,x应该等于最后一次迭代的值。以这里为例,x在循环结束的时候,其值应该为5。即x=5。

a = (1, 2, 3, 4, 5)
for x in a:
    print x
print ‘----‘,x
print a

  

  另外,虽说交租是交了出去自己没有了,但是迭代循环并不会改变a本身,也就是相当于借给别人看一眼,东西还是自己的。

  当然现实中没有这样的福利就是了。

  序列的迭代都和上面的一样,其都是按照索引的顺序依次给出。而字典和集合都是无序的,所以循环得到的顺序和我们代码写的顺序是不同的。但是我在字典篇中说过,字典的无序体现在其保存上,也就是一旦保存以后,其顺序虽然和我们代码写的顺序不同,但也不会每次循环得到的顺序都不同。如果每次循环得到的顺序都不同那要多大工程,浪费多少计算资源,这显然不符合python化繁为简的哲学。

  另外,这里提醒一句,字典循环得到的键,而集合没有键的概念,所以得到的元素。



 1.迭代器和生成器

  你可能会看到这样的写法:

for x in range(1,5):
    print x

  range()是什么鬼,我们先进交换模式看一下先:

  

  直接返回了一个列表,也就是这个函数是快速生产列表的咯,for循环就相当于迭代了列表了咯,这就好理解了。

  还可能会有这个写法:

for x in xrange(1,5):
    print x

  

  xrange()又是什么鬼?

  返回了自己。

  好吧,这里解释一下,什么是迭代器和生成器了。



1.迭代器

  迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。

  而在for循环中,会自动调用 iter()将我们要迭代的对象转化为可迭代对象,每次循环都会调用 .next() 方法获取新元素,当引发StopIteration错误的时候自动退出循环,这就for循环的内部操作。

  常用的数据类型,如:str、tuple、list、dict、set,都能进行迭代循环,因为其内部都有相应的方法,如list中的:

  所以我们自己也可以创建一个可迭代的类:

class Text():
    def __init__(self,list_input):  #初始化函数
        self.list = list_input
        self.i = 0

    def __iter__(self):
        return self

    def next(self):
        if self.i == len(self.list):    #如果索引到了最后,说明迭代完毕
            self.i = 0  #将索引归0
            raise StopIteration     #触发错误
        #如果索引没到最后
        self.i += 1 #索引先后移一位
        return self.list[self.i - 1]    #取出前一位的值
a = Text([1,2,3])
for x in a:
    print x

  这就是迭代器了。



2.生成器

  xrange()就是生成器。

  所谓的生成器就是每次调用的时候返回一个对象,而不是一次性在内存中创建,从而达到节约内存的作用。

  而生成器靠yield关键字实现,生成器的编写类似于函数,只不过将函数的return改成了yield:

def scq():
    yield 1
    yield 2
    yield 3
a = scq()
print a.next()
print a.next()
print a.next()

  每次调用a.next()的时候得到的都是不同的值。

  当然我们也可以像函数一样处理它:

  总之,yield的核心在于冻结函数,一旦遇到,冻结这个函数;而return在于结束函数,一旦遇到,返回结果,函数整个退出,下次调用时重新开始执行。

  当然,到了最后一个的时候也会触发错误:

  可以看出,生成器是每次调用的时候生成一个对象,所以生成器比迭代器更节约内存,但也更耗费cpu,因为代码需要运算。不过一般情况下,使用生成器会有更高的效率。



  最后补充range和xrange两个函数的用法:

  range和xrange都接受三个参数:

  

  其中start和stop表示开始和结束,同样不包括结束的那个值,后面的只是个分界线而已。当只给一个参数的时候,默认从0开始,即start=0。

  而step表示步长,和序列中的一样,表示走几步执行生成一次。



  暂时先写这么多,后面有什么错误和补充的会继续完善。

  参考和转载的文献:戳这里

时间: 2024-11-03 03:33:12

15.python的for循环与迭代器、生成器的相关文章

python学习第十三天 迭代器 生成器

1.函数复习总结 # 函数 -- 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs # 站在实参的角度上 : 按照位置传,按照关键字传 # 返回值:没有返回值 返回一个值 返回多个值 # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收 # 闭包函数 -- 在内部函数引用外部函数的变量 # 装饰器函

Python基础(7)——迭代器&生成器

1.列表生成式 1 [i*2 for i in range(10)] 2 [fun(i) for i in range(10)] 2.生成器 1 # Author Qian Chenglong 2 3 #列表生成器 4 a=(i*2 for i in range(10)) 5 #a[1]#只是将算法存储了,只有在调用时才会生成相应的数据,不能直接读取 6 a.__next__()#生成器只能一个一个往后取,且只存储当前值 7 8 #函数生成器 9 10 # def fib(max): 11 #

python学习第四节 迭代器 生成器 面向过程编程

1:什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. 对迭代器来讲,有一个__next()就够了.在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next__()方法,直到监测到一个StopIteration异常. >>> L = [1,2,3]>

Python 全栈开发五 迭代器 生成器 装饰器

一.迭代器 迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器,生成迭代器的方法是iter(): >>li = [1,2,3,4,5] >>it = iter(li) #生成一个迭代器 >>it.__next__() 1 >>next(it) #以上两种next都可以使用 2 >

python - 条件语句/循环语句/迭代器

条件测试:if 条件表达式python 的比较操作        所有的python对象都支持比较操作            可用于测试相等性.相对大小等            如果是复合对象,python会检查其所有部分,包括自动遍历各级嵌套对象,知道可以得出最终结果.        测试操作符            '=='操作符测试值得相等性               'is'    表达式测试对象的一致性.       python 中不同类型的比较方法            数字:通

Python 基础第十三天(迭代器,生成器)

今日主要内容: 1.可迭代对象 2.迭代器 3.生成器 1.可迭代对象 什么是可迭代对象:内部含有__iter__方法的对象,就是可迭代对象. 查看__iter__方法:dir(对象) 可迭代对象就遵循可迭代协议. 接触过的可迭代对象有:str,list,tuple,dict,set,range 迭代器:f1文件句柄 如何判断 法一: 例:s = 'laonanhai' print('__iter__' in dir(s)) 法二: 例:l = [1, 2, 3, 4]from collecti

python基础之循环与迭代器

循环 python 循环语句有for循环和while循环. while循环while循环语法 while 判断条件: 语句 #while循环示例 i = 0 while i < 10: i += 1; print(i) while else 语句 语法 while 判断条件: 语句 else: 语句 #while else 示例 n = 0 while n < 10: n += 1; print(n); else: print("n不小于10") for循环 for循环可以

python开发函数进阶:可迭代的&amp;迭代器&amp;生成器

一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 --对应的标志 __iter__ 2.判断一个变量是不是一个可迭代的 # print('__iter__' in dir(list))# print('__iter__' in dir([1,2,3])) 3.可迭代协议--凡是可迭代的内部都有一个__iter__方法 二,迭代器 1.将可迭代的转化成迭代器 1 #!/usr/bin/env python 2

Python学习笔记8(迭代器、生成器、装饰器)

1.列表生成式 要想学习生成器和迭代器,首先得了解另外一个概念,列表生成式. 想要生成一个0~9的列表的时候,首先想到的就是range(0,10) >>>a = range(0,10) >>>print(a) #3.0输出结果 range(0,10) #2.0输出结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 在3.0的版本呢当中range只是用来生成一个迭代器了,但是在2.0的版本里可以使用range来快速生成list. 但是想要生成一个[1*1,