python none Python 迭代器和(2)

电脑杂谈  发布时间:2018-01-11 20:05:38  来源:网络整理

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 大泷进矢
      大泷进矢

      反分裂法已经为台独分子定好下场了

    • 张柳荫
      张柳荫

      这是在中国不是在美国

    热点图片
    拼命载入中...