列表生成式

  列表生成式,是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学习——列表生成式,生成器和迭代器的更多相关文章

  1. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  2. python 学习2:生成器,迭代器,装饰器

    1.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万  个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那 ...

  3. python 基础 列表生成式 生成器

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  4. Python学习之旅—生成器与迭代器案例剖析

    前言 前面一篇博客笔者带大家详细探讨了生成器与迭代器的本质,本次我们将实际分析一个具体案例来加深对生成器与迭代器相关知识点的理解. 本次的案例是一个文件过滤操作,所做的主要操作就是过滤出一个目录下的文 ...

  5. Python学习日记(十) 生成器和迭代器

    使用dir()我们可以知道这个数据类型的内置函数有什么方法: print(dir(int)) print(dir(bool)) print(dir([])) print(dir({})) print( ...

  6. Python之列表生成式、生成器、可迭代对象与迭代器

    本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...

  7. 【转】Python之列表生成式、生成器、可迭代对象与迭代器

    [转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...

  8. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...

  9. python基础——列表生成式

    python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...

随机推荐

  1. 2019暑假集训 BLO

    题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. 输入 输入n<=100000 ...

  2. 蓝牙Beacon广播数据包格式以及解析

    目录 1. 获取原始蓝牙广播包 2. 安装WireShark软件 3. 分析Beacon广播包数据 3.1 第一个数据包格式 3.2 第二个数据包格式 3.3 Android程序开发中的蓝牙广播包 4 ...

  3. 《C# 语言学习笔记》——定义属性

    属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...

  4. 如何在Windows上使用Python进行开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 一直以来C#都是微软在编程语言方面最为显著的Tag,但时至今日Python ...

  5. 深入学习OpenCV检测及分割图像的目标区域

    准备1:OpenCV常用图片转换技巧 在进行计算机视觉模型训练前,我们经常会用到图像增强的技巧来获取更多的样本,但是有些深度学习框架中的方法对图像的变换方式可能并不满足我们的需求,所以掌握OpenCV ...

  6. mysql语句汇总

      MySQL常用命令: show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop database ...

  7. 【Android Studio】使用 Genymotion 调试出现错误 INSTALL_FAILED_CPU_ABI_INCOMPATI

    RT -- 解决方法参考: https://my.oschina.net/u/242764/blog/375909 http://blog.csdn.net/wjr2012/article/detai ...

  8. Mac 使用小结

    小白使用 Mac 的点点滴滴总结,更新中…… 1. 显示/隐藏 文件的命令: a) 显示文件: defaults write com.apple.finder AppleShowAllFiles -b ...

  9. Where is the clone one and how to extract it?

    One cannot be in two places at once. Do you know what's "Dual Apps"? Manufactures like Xia ...

  10. java高并发系列 - 第21天:java中的CAS操作,java并发的基石

    这是java高并发系列第21篇文章. 本文主要内容 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用ja ...