列表生成式

  列表生成式,是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. Linux 安装MySql——ubuntu版

    这里简单地阐述一下rpm.deb.tar.gz的区别. rpm格式的软件包适用于基于Red Hat发行版的系统,如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于 ...

  2. Java SE API 8

    百度云: 链接:http://pan.baidu.com/s/1pLMwiKz 密码:ep5f 官网网址:http://www.oracle.com/technetwork/java/javase/d ...

  3. kaptcha谷歌验证码工具

    Kaptcha 简介 Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如: 验证码的字体 验证码字体的大小 验证码字体的字体颜色 验证码内容的范围(数字,字母,中文汉字!) 验证 ...

  4. win7 开机网络等待,应用打不开的解决方案

    状况描述:最近,笔记本电脑开机之后,网络图标一直转圈,任何应用程序也打不开,开机关机还是可以的,之前是偶尔发生这种情况,然后重启一下或许就行了,但最近每次开机都是这个情况,很恼火,在网上百度了很久,有 ...

  5. Centos7安装mysql8教程

    网上的教程很多,我也参考了很多,以下是我实践的步骤,真实有效. 1.配置Mysql 8.0安装源: sudo rpm -Uvh https://dev.mysql.com/get/mysql80-co ...

  6. ioc和aop的区别

    IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转.在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决.这个第三方指的就是Spring的容 ...

  7. JWT token 跨域认证

    JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中,将sessio ...

  8. 重入锁的学习 (ReentrantLock)

    重入锁  :(ReentrantLock) 上锁 用reentrantLock.lock 方法 解锁 用reentrantLock.unlock 方法 上锁和解锁 必须配对 可以多重上锁 Reentr ...

  9. 第五章-处理多窗口 | Electron实战

    本章主要内容: 使用JavaScript Set数据结构跟踪多个窗口 促进主进程和多个渲染器进程之间的通信 使用Node APIs检查应用程序运行在那个平台上 现在,当Fire Sale启动时,它为U ...

  10. java并发编程(二十二)----(JUC集合)ConcurrentHashMap介绍

    这一节我们来看一下并发的Map,ConcurrentHashMap和ConcurrentSkipListMap.ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全 ...