print[iforiinzrange]
代码的运行结果为:

其实,通过下面代码可以看出,list类型也是按照上面的方式,list本身是一个可迭代对象,通过iter()方法可以获得list的迭代器对象:

在Python中,使用可以很方便的支持迭代器协议。通过函数产生,函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。
也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。
下面看看的使用:

在这个例子中,定义了一个函数,函数返回一个对象,然后就可以通过for语句进行迭代访问了。
其实,函数返回的迭代器。 “的迭代器”这个术语通常被称作””。要注意的是就是一类特殊的迭代器。作为一个迭代器,必须要定义一些方法,其中一个就是next()。如同迭代器一样,我们可以使用next()函数来获取下一个值。
执行流程
下面就仔细看看是怎么工作的。
从上面的例子也可以看到,函数跟普通的函数是有很大差别的。
结合上面的例子我们加入一些打印信息,进一步看看的执行流程:

通过结果可以看到:
当调用函数的时候,函数只是返回了一个对象,并没有 执行。
当next()方法第一次被调用的时候,函数才开始执行,执行到yield语句处停止
next()方法的返回值就是yield语句处的参数(yielded value)
当继续调用next()方法的时候,函数将接着上一次停止的yield语句处继续执行,并到下一个yield处停止;如果后面没有yield就抛出StopIteration异常
表达式
在开始介绍表达式之前,先看看我们比较熟悉的列表解析( List comprehensions),列表解析一般都是下面的形式。
[expr foriter_var initerable ifcond_expr]
迭代iterable里所有内容,每一次迭代后,把iterable里满足cond_expr条件的内容放到iter_var中,再在表达式expr中应该iter_var的内容,最后用表达式的计算值生成一个列表。
例如,生成一个list来保护50以内的所以奇数:
[iforiinrange(50)ifi%2]
表达式是在python2.4中引入的,当序列过长, 而每次只需要获取一个元素时,应当考虑使用表达式而不是列表解析。表达式的语法和列表解析一样,只不过表达式是被()括起来的,而不是[],如下:
(expr foriter_var initerable ifcond_expr)
看一个例子:

表达式并不是创建一个列表, 而是返回一个,这个在每次计算出一个条目后,把这个条目”产生”(yield)出来。 表达式使用了”惰性计算”(lazy evaluation),只有在检索时才被赋值(evaluated),所以在列表比较长的情况下使用内存上更有效。
继续看一个例子:

从这个例子中可以看到,表达式产生的,它自身是一个可迭代对象,同时也是迭代器本身。
递归
可以向函数一样进行递归使用的,下面看一个简单的例子,对一个序列进行全排列:
defpermutations(li):
iflen(li)== 0:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-59867-2.html
这是在中国不是在美国
成天都在更新
反分裂法已经为台独分子定好下场了