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 ...
随机推荐
- python基础-python解释器多版本共存-变量-常量
一.编程语言的发展史 机器语言-->汇编语言-->高级语言,学习难度及执行效率由高到低,开发效率由低到高 机器语言:二进制编程,0101 汇编语言:用英文字符来代替0101编程 高级语言: ...
- <<Modern CMake>> 翻译 1. CMake 介绍
<<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...
- PHP-- B/S结构
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简 ...
- spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...
- win10安装.NET Framework 3.5方法
win10下默认没有.NET Framework 3.5,但是有时候我们运行一些网络相关的软件要用到它,下面是它的具体安装方法(绝对可以成功) 将系统镜像挂载到虚拟光驱 复制虚拟光驱下的\source ...
- 续集:白菜的内涵,更新nand分区为ubifs,替换overlay
在上一篇真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记中附带了128M nand的空间图示,在ar71xx profil ...
- 自定义 Button 选择器
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- Letters Shop
B. Letters Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 【POJ - 2385】Apple Catching(动态规划)
Apple Catching 直接翻译了 Descriptions 有两棵APP树,编号为1,2.每一秒,这两棵APP树中的其中一棵会掉一个APP.每一秒,你可以选择在当前APP树下接APP,或者迅速 ...
- python3从入门到精通之数据类型,布尔类型介绍
数据的类型 为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的. Number(数字) int(整型) float(浮点型) complex(复数) bool(布尔) String( ...