python学习——列表生成式,生成器和迭代器
列表生成式
列表生成式,是python内置的非常简单却强大的可以用来创建list的生成式。它可以极大的简化语句。
"""列表生成式""" # 若要生成[, , , , , , , , , ]可以用list(range(,)) print(list(range(, ))) # 但是若要生成[*, *, *, ... ,*],可以有两种方法:.循环, .列表生成式 # 这是使用循环来产生特定的列表
L = []
for x in range(, ):
L.append(x*x)
print(L) # 而使用列表生成式则可以使语句大大简化,仅使用一条语句即可。
L = [x*x for x in range(, )]
print(L) # 列表生成式中不仅可以添加for循环,还可以加上if判断,进行筛选。 # 筛选出偶数的平方
L = [x*x for x in range(, ) if x % == ]
print(L) # 同时还可以使用两层循环,来生成全排列
L = [m + n for m in 'ABC' for n in 'XYZ']
print(L)
# 即列表生成式可以使用两个甚至更多变量
生成器
列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。当创建较大容量的列表时,不仅占用很大的内存空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。因此python中有一种一边循环一边计算的机制,称为生成器:generator。只有在使用时才生成,不使用时是不会产生的。
"""生成器""" # 创建一个生成器,有很多种方法。.只要把列表生成式的[]改为(),就创建了一个生成器
L = [x * x for x in range()]
print(L)
# [, , , , , , , , , ]
g = (x * x for x in range())
print(g)
# <generator object <genexpr> at 0x00000009EB8AF2B0> 这就变成了生成器了 # 我们可以直接打印出列表中的每一个元素,但是生成器不能,如果要一个一个打印生成器,name可以通过next()函数获得生成器的下一个返回值
print(next(g))
#
print(next(g))
#
print(next(g))
#
print(next(g))
#
print(next(g))
#
print(next(g))
#
# 可以一直这样调用,但是当计算到最后一个元素,没有更多的元素时,抛出StopIteraton的错误 # 如果一直用上面的方法调用,相信我你会疯掉的,正确的操作应该是使用for循环,因为生成器是可迭代对象
for n in g:
print(n)
# 我们创建了一个生成器之后,基本上永远不会地哦啊用next(),而是通过for循环来迭代它,并且不用关心StopIteration的错误
"""生成器函数""" # .通过yield将函数变成生成器
# 例如编写输出前n个斐波那契数列,先用函数实现一下 def fib(max):
n, a, b = , ,
while n < max:
print(b)
a, b = b, a + b
n = n +
return 'done' # fib函数实际上是定义了菲波那切数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,与生成器很类似
# 那么我们只需要把print(b)改为yield b 就可以了 def fib(max):
n, a, b = , ,
while n < max:
yield b
a, b = b, a + b
n = n +
return 'done' # 这就是定义生成器的另一种方法,如果一个函数中包含yield关键字,那么这个函数就再也不是一个普通函数了,而是一个生成器 # 最难理解的来了:就是在生成器和函数的执行过程不一样。函数是顺序执行,遇到return语句就会返回。而变成生成器的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处执行
# 当使用for循环时,发现拿不到生成器的return语句的返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
g = fib()
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
# 则可以捕获到错误,且可以访问到返回值
迭代器
我们知道可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如:list, tuple, dict, set, str等;二类是生成器,包括生成器和带yield的生成器函数,这些直接作用于for循环的对象统称为可迭代对象。可以使用isinstance()判断一个对象是否是可迭代对象。生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。这种可以被next()函数不断调用并返回下一个值的对象称为迭代器。生成器都是迭代器,但是list, dict,str虽然是可迭代对象但是不是迭代器。但是集合数据类型可以通过iter()函数获得一个迭代器对象。
python学习——列表生成式,生成器和迭代器的更多相关文章
- Python学习笔记之生成器、迭代器和装饰器
这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...
- python 学习2:生成器,迭代器,装饰器
1.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万 个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那 ...
- python 基础 列表生成式 生成器
列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...
- Python学习之旅—生成器与迭代器案例剖析
前言 前面一篇博客笔者带大家详细探讨了生成器与迭代器的本质,本次我们将实际分析一个具体案例来加深对生成器与迭代器相关知识点的理解. 本次的案例是一个文件过滤操作,所做的主要操作就是过滤出一个目录下的文 ...
- Python学习日记(十) 生成器和迭代器
使用dir()我们可以知道这个数据类型的内置函数有什么方法: print(dir(int)) print(dir(bool)) print(dir([])) print(dir({})) print( ...
- Python之列表生成式、生成器、可迭代对象与迭代器
本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- python基础——列表生成式
python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...
随机推荐
- tomcat启动成功但是没有监听8080端口
查看tomcat日志 cd tomcat/logs tailf -1000 catlina.out 错误如下: /home/work/jdk/jdk-10.0.1/jre/bin/java: No s ...
- Linnux命令大全(vim)
vim复制和粘贴的基本命令(注:需先退出编辑模式) yy复制游标所在行整行.或大写一个Y. (常用) 2yy或y2y复制两行. (常用) y^复制至行首,或y0.不含游标所在处字元. ...
- linux初学者-Apache篇
linux初学者-Apache篇 Apache提供了超文本传输协议http,httpd是Apache超文本传输协议的主服务器.下文将对httpd的安装和配置进行简单的叙述. ...
- 熟悉软件的生命周期AND测试工程师的工作流程
1.软件的生命周期 *软件生命周期(SDLC)是软件开始研制到最终被废弃不用所经历的各个阶段.在不同阶段里,由不同的组织.个人和资源进行着明确的任务. 2.生命周期的模型 *常见的生命周期模型有:瀑布 ...
- vue教程二 vue组件(1)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script ...
- 运行sh文件
记下在Ubuntu下安装*.sh和*.bin的简单方法. *.sh文件安装方法: 运行终端到文件目录下 1.在终端输入:sudo sh *.sh直接运行 2.在终端输入:sudo chmod +x * ...
- 在.NET CORE中使用配置文件:对 ConfigurationBuilder 的使用说明
示例:ASP.NET MVC 使用示例: 如何覆写默认行为?如取消热更新支持,方法如下: 示例:控制台 使用应用程序参数 使用键值对枚举(这里以字典来说明) 使用JSON文件 注册配置文件中的某一个段 ...
- dubbo文档笔记
配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...
- java并发编程(九)----(JUC)CyclicBarrier
上一篇我们介绍了CountDownlatch,我们知道CountDownlatch是"在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待",即CountDownL ...
- 笑谈CSS的伪元素
今晚上我们来简单的聊一聊CSS的伪元素,多说无益,开聊 GG: 话说盘古开天辟地之时. QQ:嗨,咱今天还能讲的完吗?您给来点实际的啊. GG:要听实际的是吧,得嘞,那今天咱就来聊一聊CSS里的伪元素 ...