python-迭代器与生成器的区别
这里涉及几个知识点:迭代器、生成器、yieId
先用个例子看一下迭代器与生成器的区别吧
#L是个list,迭代用for循环即可,L取出来是存放在内存中的,再多次去循环取出都可以
>>> L=[x*x for x in range(3)]
>>> for i in L:
print(i) 0
1
4
>>> for n in L:
print(n) 0
1
4 #把[]换成了()就成了生成器,只不过它只能循环出一次,因为它不是放在内存中的。它是实时生成数据的。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
print (i) 0
1
4
#看我再循环一次,它已是空值
>>> for n in mygenerator:
print(n) >>>
其实我感觉上最大差的几点有以下:
1、list函数调用直接出结果。而生成器是一个对象
>>> L = [1,2,3,4,5,6]
>>> def xh():
for i in L:
print(i) >>> g=xh()
1
2
3
4
5
6
>>> L1=[6,7,8,9,10]
>>> def generator():
yield(L1)
for i in L1:
print(i) >>> g=generator()
>>> next(g)
[6, 7, 8, 9, 10]
这里有个yield的对比,大家感受一下
>>> L1=[6,7,8,9,10]
>>> def generator():
yield(L1) #打印L1的意思
for i in L1:
print(i) >>> g=generator() #这里是一个生成器对象
>>> next(g) #用next打印出来
[6, 7, 8, 9, 10] #生成器第2个例子
>>> def gen2():
for i in L1:
yield(i) #打印i的值
print(i) >>> g=gen2()
>>> print(g)
<generator object gen2 at 0x0000000002EAFD00>
>>> for x in g:
print(x) 6
6
7
7
8
8
9
9
10
10
2、其实想想也挺简单,yield只不过就是个标识,同时打印一次该结果
经典案例:杨辉三角
#将杨辉三角的每一行看成一个list,写一个生成器(generator),不断输出下一行list
def triangel(n):
L=[1] #定义一个list[1]
while True:
yield L #打印出该list
L=[L[x]+L[x+1] for x in range(len(L)-1)] #计算下一行中间的值(除去两边的1)
L.insert(0,1) #在开头插入1
L.append(1) #在结尾添加1
if len(L)>10: #仅输出10行 break #生成一个generator对象,然后通过for循环迭代输出每一行
a=angel(10)
for i in a:
print(i)
#结果
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
python-迭代器与生成器的区别的更多相关文章
- python 迭代器和生成器的区别
迭代器(iterator)是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过 ...
- Python: 迭代器与生成器小结
迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Itera ...
- Python 迭代器和生成器(转)
Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...
- 一文搞懂Python迭代器和生成器
很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...
- Python - 迭代器与生成器 - 第十三天
Python 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...
- 怎么理解Python迭代器与生成器?
怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下: ...
- python中迭代器和生成器的区别
#!/usr/bin/python def power(values): for value in values: print "powing %s" % value yield ...
- python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句
我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...
- Python迭代器和生成器你学会了吗?
在了解什么是迭代器和生成器之前,我们先来了解一下容器的概念.对于一切皆对象来说,容器就是对象的集合.例如列表.元祖.字典等等都是容器.对于容器,你可以很直观地想象成多个元素在一起的单元:而不同容器的区 ...
- Python迭代器,生成器--精华中的精华
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
随机推荐
- 精通Docker的50个必备教程、工具、资源
Docker 已经震惊了软件开发界.它提供了一种根据 DevOps 方法打包和输送应用程序的便捷方法. 最近我们发布了 51 个必备的 Docker 工具列表①,但工具不是完全精通容器化所需的唯一东西 ...
- 使用jquery插件ajaxfileupload一次上传多个文件,示例
@{ ViewBag.Title = "Index"; Layout = ""; } <!DOCTYPE html PUBLIC "-//W3C ...
- 了解HTTP协议栈(实践篇)
关于http协议的理论知识,我在这里就不详细说明了,具体下面给出的链接有.接下来都是用具体的操作显示的,各位可以结合起来看. 一.使用nc打开端口,并使用浏览器进行访问 (对应文章中的HTTP协议详解 ...
- tcp拥堵算法
http://m.blog.csdn.net/article/details?id=6739189
- Nexus 搭建maven 私有仓库
nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如 ...
- 服务器搭建5 Samba实现文件共享
Samba服务器工作原理 客户端向Samba服务器发起请求,请求访问共享目录,Samba服务器接收请求,查询smb.conf文件,查看共享目录是否存在,以及来访者的访问权限,如果来访者具有相应的权限, ...
- Linux内核分析:recv、recvfrom、recvmsg函数实现
先看一下这三个函数的声明: #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, vo ...
- 取出csv文件中的中文评论数据
# -*- coding: utf-8 -*- import csv import re csvfile = 'weibo.csv' def columns_data(path, column): c ...
- js获取系统的根路径实现介绍
js如何获取系统的根路径,在本文给出了详细的方法 function getBasePath(){ var obj=window.location; var contextPath=obj.pathna ...
- python unicode to str and str to unicode
@staticmethod def unicode2str(p_unicode): v = p_unicode.encode('unicode-escape').decode('string_esca ...