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 ...
随机推荐
- APP爬虫(2)把小姐姐的图片down下来
APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...
- 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享
目录 最新版表白墙博客地址 1.微信小程序前台展示 2.功能介绍 3.后台管理 4.后端语言采用 JAVA 开发 5.体验此微信小程序 扫描下方二维码 6.如何联系我或需要源码进行联系 最新版表白墙博 ...
- 自动装配、JavaConfig、XML 三种方案之间,怎么导入和混合配置?
在 Spring 中,这些配置方案都不是互斥的.完全可以将 JavaConfig 的组件扫描和自动装配/或 XML 配置混合在一起. Q:如何在 JavaConfig 中引用 XML 配置? Q:怎么 ...
- 如何使用JSP访问MySQL数据库
<%@page import="java.sql.*" import ="java.util.*" import ="java.io.*&quo ...
- PHP与ECMAScript_3_常用字符串函数
PHP ECMAScript 长度 strlen($str) str.length 查找类 $str[n] ...
- Linux中bash shell环境变量
别名 别名是命令的快捷方式.为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用.语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令.重要的 ...
- 脱壳0-FSG壳-详细流程
目录 @ 1 拿到当前加壳程序,用exeinfo/PeID 看一下信息 可以看出是很老的壳FSG. 分析: Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...
- Hadoop MapReduce的Shuffle过程
一.概述 理解Hadoop的Shuffle过程是一个大数据工程师必须的,笔者自己将学习笔记记录下来,以便以后方便复习查看. 二. MapReduce确保每个reducer的输入都是按键排序的.系统执行 ...
- HC-08 BLE资料
1.1 特点简介 HC-08蓝牙串口通信模块是新一代的基于Bluetooth Specification V4.0 BLE蓝牙协议的数传模块.无线工作频段为 2.4GHz ISM,调制方式是 GFSK ...
- awk文本处理
一.前言 (一).awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理,数据可以来自标准输入.一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进 ...