列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况

列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如果需要获取数据,可以使用next()函数来获取,但是需要注意,一旦next()函数获取不到数据,会导致出现StopIteration异常错误,可以使用for循环遍历列表生成器,获取所有数据

需要视情况而定,如果数据量比较大,推荐使用生成器

python2.7中就是range(生成式) 和 xrange(生成器)的区别

列表生成式是快速生成一个列表的一些公式

在列表中存放0~100的数:

普通的列表生成:

numbers=[]

for x in range(0,101):

numbers.append(x)

print(numbers)

用列表生成式生成列表:[要放入列表的数据 简单的表达式1 表达式2]

#x for x in range(0,101) for循环遍历出来的值,放入列表中

numbers=[x for x in range(0,101)]

print(numbers)

列表中存放0~100的偶数:

普通方法生成列表:

for x in range(0,101):

if x%2==0:

numbers.append(x)

print(numbers)

用列表生成式生成列表:

#for循环遍历0~101的数字,如果数字对2取余==0,表示是偶数,x放在列表中

numbers=[x for x in range(0,101)if x%2==0]

print(numbers)

找出列表list1=['asd','adf','dafg','acbo']带有a的字符

普通写法:

rs_list=[]

for s in list1:

if 'a' in s:

rs_list.append(s)

print(rs_list)

列表生成式:

list2=[x for x in list1 if 'a' in x]

列表生成式支持双层for循环

list3=[x*y for x in range(0,10) for y in range(20)]

print(list3)

生成器构造实例

# 使用类似列表生成式的方式构造生成器

g1 = (2*n + 1 for n in range(3, 6))

# 使用包含yield的函数构造生成器

def my_range(start, end):

for n in range(start, end):

yield 2*n + 1

g2 = my_range(3, 6)

print(type(g1))

print(type(g2))

输出结果:

生成器的调用方式

要调用生成器产生新的元素,有两种方式:

调用内置的next()方法

使用循环对生成器对象进行遍历(推荐)

调用生成器对象的send()方法

实例1:使用next()方法遍历生成器

print(next(g1))

print(next(g1))

print(next(g1))

print(next(g1))

输出结果:

7

9

11

Traceback (most recent call last):

File "***/generator.py", line 26, in

print(next(g1))

StopIteration

print(next(g2))

print(next(g2))

print(next(g2))

print(next(g2))

输出结果:

7

9

11

Traceback (most recent call last):

File "***/generator.py", line 31, in

print(next(g2))

StopIteration

可见,使用next()方法遍历生成器时,最后是以抛出一个StopIeration异常终止。

实例2:使用循环遍历生成器

for x in g1:

print(x)

for x in g2:

print(x)

两个循环的输出结果是一样的:

7

9

11

可见,使用循环遍历生成器时比较简洁,且最后不会抛出一个StopIeration异常。因此使用循环的方式遍历生成器的方式才是被推荐的。

需要说明的是:如果生成器函数有返回值,要获取该返回值的话,只能通过在一个while循环中不断的next(),最后通过捕获StopIteration异常

实例3:调用生成器对象的send()方法

def my_range(start, end):

for n in range(start, end):

ret = yield 2*n + 1

print(ret)

g3 = my_range(3, 6)

print(g3.send(None))

print(g3.send('hello01'))

print(g3.send('hello02'))

输出结果:

7

hello01

9

hello02

11

print(next(g3))

print(next(g3))

print(next(g3))

输出结果:

7

None

9

None

11

结论:

next()会调用yield,但不给它传值

send()会调用yield,也会给它传值(该值将成为当前yield表达式的结果值)

需要注意的是:第一次调用生成器的send()方法时,参数只能为None,否则会抛出异常。当然也可以在调用send()方法之前先调用一次next()方法,目的是让生成器先进入yield表达式。

生成器与列表生成式对比

既然通过列表生成式就可以直接创建一个新的list,那么为什么还要有生成器存在呢?

因为列表生成式是直接创建一个新的list,它会一次性地把所有数据都存放到内存中,这会存在以下几个问题:

内存容量有限,因此列表容量是有限的;

当列表中的数据量很大时,会占用大量的内存空间,如果我们仅仅需要访问前面有限个元素时,就会造成内存资源的极大浪费;

当数据量很大时,列表生成式的返回时间会很慢;

而生成器中的元素是按照指定的算法推算出来的,只有调用时才生成相应的数据。这样就不必一次性地把所有数据都生成,从而节省了大量的内存空间,这使得其生成的元素个数几乎是没有限制的,并且操作的返回时间也是非常快速的(仅仅是创建一个变量而已)。

我们可以做个试验:对比一下生成一个1000万个数字的列表,分别看下用列表生成式和生成器时返回结果的时间和所占内存空间的大小:

import time

import sys

time_start = time.time()

g1 = [x for x in range(10000000)]

time_end = time.time()

print('列表生成式返回结果花费的时间: %s' % (time_end - time_start))

print('列表生成式返回结果占用内存大小:%s' % sys.getsizeof(g1))

def my_range(start, end):

for x in range(start, end):

yield x

time_start = time.time()

g2 = my_range(0, 10000000)

time_end = time.time()

print('生成器返回结果花费的时间: %s' % (time_end - time_start))

print('生成器返回结果占用内存大小:%s' % sys.getsizeof(g2))

输出结果:

列表生成式返回结果花费的时间: 0.8215489387512207

列表生成式返回结果占用内存大小:81528056

生成器返回结果花费的时间: 0.0

生成器返回结果占用内存大小:88

可见,生成器返回结果的时间几乎为0,结果所占内存空间的大小相对于列表生成器来说也要小的多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python生成1到100的列表_python列表生成式与列表生成器的使用相关推荐

  1. python如何创建一个列表_python怎样快速构建列表?

    来自"专业人士笔记":创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com Python列表是Python程序中广泛使用的一种 ...

  2. python生成的词云没有图案_Python生成词云的实现代码

    1 概述 利用Python生成简单的词云,需要的工具是cython,wordcloud与anaconda. 2 准备工作 包括安装cython,wordcloud与anaconda. 2.1 安装an ...

  3. python数据结构的列表_Python自带数据结构 列表(list)

    Python自带数据结构 列表(list) 列表是Python中最通用的数据类型,可以写成方括号之间的逗号分隔值(项目)列表. 使用列表的重要事项是,列表中的项目不必是相同的类型.也就是说一个列表中的 ...

  4. python函数参数为列表_python函数中把列表(list)当参数时的入坑与出坑

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑. 入坑 挖坑 def f(x,li=[]): for i in range(x): li.append(i ...

  5. python 多个列表_python遍历多个列表生成列表或字典

    key=['a','b','c','d'] value=[1,2,3,4] mydict=dict(zip(key,value))print mydict 输出结果: {'a': 1, 'c': 3, ...

  6. python从random生成列表_Python 学习DAY 17 列表生成式,生成器,迭代器,time模块,random模块...

    ********************************************列表生成式****************** a=[x for x in range(10)]     [0, ...

  7. 用python生成九九乘法表的指令_Python中生成九九乘法表的方法有哪几种?

    九九乘法表是我们计算的基础,在Python中可以生成九九乘法表.大致有三种方法:列表推导式法.for循环法.while嵌套循环法.具体使用代码请看本文. 方法一.列表推导式法for i in rang ...

  8. python 字符串 包含 列表_python中包含字符串列表的列

    好吧,我已经试着找出这个问题的答案有一段时间了,但是结果是空的(基本上没有编写一个小的递归程序来扩展列表),我想这是因为,不管怎么说,乍一看,你试图做的并不是真的那么有效(Jimmy C关于列表可变的 ...

  9. python求1到100偶数和_python 求1-100之间的奇数或者偶数之和的实例

    python 求1-100之间的奇数或者偶数之和的实例 如下所示: i=0 sum1=0 sum2=0 while i<=100: if i%2==0: sum1+=i else: sum2+= ...

最新文章

  1. uboot中添加新型号步骤以及编译方法
  2. 产品经理的每日反省清单
  3. Envoy实现.NET架构的网关(一)静态配置与文件动态配置
  4. true,false组合问题
  5. GprMax 3.1.5 建模的in文件编写详解(2)
  6. 网络安全公司的源代码遭泄露,售价25万美元
  7. EDA技术实用教程 | 复习六 | 过程语句always
  8. (附源码)springboot校园购物网站 毕业设计 041037
  9. bsod错误代码。_如何解决BSOD(蓝屏死机)和Windows Stop错误?
  10. 【数据结构】(二叉树)计算二叉树的高度递归与非递归 三种方法 C语言
  11. html 自动生产,HTML5 Three.js 3D人偶玩具自动化生产车间动画
  12. tiktok也会像Facebook一样封号吗?哪些行为会封号?
  13. 使用stm32配置自定义的HID设备
  14. 神经网络方法研究及应用,神经网络算法实例说明
  15. 每日一讲:C语言getchar函数的用法
  16. 51cto的请看过来
  17. 招才猫显示服务器开小差,梦幻西游:百区平转开启却抢不到服务器?教你几招助你顺利转区...
  18. 数据库原理与应用实验指导书 实验一:熟悉SQL Server 2012数据库管理系统
  19. 华为无线路由器显示无服务器,华为无线路由器怎么设置 WiFi路由器的设置方法...
  20. java 把时间上加一段时间

热门文章

  1. 前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?___请求时,为什么要携带token?
  2. Java 中array.size()_Java ArrayDeque size()方法与示例
  3. java开发利器 源码_Java开发的利器: 反编译工具 JD-GUI
  4. Vue 脚手架配置代理
  5. android的ui怎么做到流畅,android提高UI的流畅度
  6. 背计算机专业英语词汇,计算机专业英语词汇1500词(五)
  7. bool python 运算_python基础知识和pycharm安装
  8. 采用光线跟踪绘制场景 c++_光线追踪的相干性聚集:硬件光线追踪的优势
  9. 药学专业报计算机一级有用吗,全网友泣泪劝阻!高考结束之后,什么专业千万不能报?...
  10. Java基础 线程同步