python生成1到100的列表_python列表生成式与列表生成器的使用

列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致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,结果所占内存空间的大小相对于列表生成器来说也要小的多。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之异常处理

关于错误和异常 (1)概念:错误是无法通过其他代码进行处理问题,如语法错误和逻辑错误,语法错误是单词或格式等写错,只能根据系统提示去修改相应的代码,逻辑错误是代码实现功能的逻辑有问题&…

python图像质量评价_OpenCV图像质量评价的SSIM算法(图像相似度)

添加函数体。将SSIM函数添加至命名空间后。该函数主要功能是时哟功能ssim算法对两张图像进行比较,并将图像在各通道比较的结果以scalar形式返回。 Scalar getMSSIM(char * imagePatha,char * imagePathb) { Mat i1imread(imagePatha); Mat i2imread(imagePathb); co…

Python 装饰器理解

1、定义: (1)装饰器指的是为被装饰对象添加额外功能的工具/函数。 2、使用装饰器的意义(原因): 如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用…

什么是python标识符_Python:标识符Identifier

什么是标识符? 标识符 (ldentifier) :是一个用来标识变量、函数、类、模块或其他对象的名称。 标识符规范 1)标识符由字母、下划线和数字组成 2)不能以数字开头 3)区分大小写 4)不能使用关键字 命名规则 1、见名知意。…

Python 可变参数*args和**kwargs

多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现 *args:表示的就是将实参中按照位置传值,多出来的值都给args,且以元组的方式呈现, …

springboot security 权限校验_十二、SpringBoot 优雅的集成Spring Security

前言至于什么是Spring security ,主要两个作用,用户认证和授权。即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面。有的用户有权限执行某一操作,而有的用户不能执行则是授权。算是一个项…

python模块下载过程_常用的python模块及安装方法

bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework ctypes:用来调用动态链接库 DBUtils:数据库连接池 django:一个WEB framework docutils:用来…

python3 week4

1 实现四舍五入,禁止使用python内建函数。 func(soure_num, precise),source_num为需要处理的数据,precise为需要保留的位数 """ File: 01四舍五入.py Author: chde_wang Date: 2020-08-09 12:14:59 D…

python如何读取csv文件某几行某几列_关于python:读取.csv文件时,我似乎无法指定列dtypes...

本问题已经有最佳答案,请猛点这里访问。 一个菜鸟问题(修订):我读了一个.csv文件,并尝试按以下方式指定dtypes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14import csv import pandas as pd cdc pd.read_csv(myFile.csv, dtype { Phenoty…

python-week5

1、现在有如下流程:A->B->C->D->E->F,要求根据输入的参数从制定的流程执行下去 """ File: 01流程执行.py Author: chde_wang Date: 2020-08-16 18:51:35 Description:将输入存储到列表中&#xf…

python-week6

1.如下示例, 请用面向对象的形式优化以下代码 def exc1(host,port,db,charset):connconnect(host,port,db,charset)conn.execute(sql)return xxxdef exc2(host,port,db,charset,proc_name)connconnect(host,port,db,charset)conn.call_proc(sql)return xxx # 每次调用都需要重复…

python定义空数组_在numpy数组中设置空值

如何根据条件使numpy数组中的某些值为空? 我不明白为什么我最终得到的是0,而不是不满足条件的null或空值。。。b是用0和1值填充的numpy数组,c是另一个完全填充的numpy数组。所有阵列均为71x71x166a np.empty(((71,71,166))) d np.empty(((7…

excel学习1-查看一列数值是否在另一列中存在

出现次数用COUNTIF 是否出现使用 IFCOUNTIF 加入$的作用是将需要比对的列固定范围。写好一个函数后,使用右下角号,直接下拉就可以。 参考自https://blog.csdn.net/gywtzh0889/article/details/72910377

fx5u以太网通讯设置_操作示例 | 实现S7300和FX5U的数据交换

北辰BCNet-S7300Plus(以下简称BCNet),在BCNet-S7300的基础上,以太网口增加了支持与西门子带网口PLC(S7-200SMART 、S7-1200、S7-1500、S7300PN)之间的通讯功能。这些通讯功能包括基于S7TCP协议的数据交换、ModbusTCP服务器功能、ModbusTCP客户机功能&…

excel基础-固定某一列的输入内容

Office:需要固定的单元格-点击数据-数据有效性-点击,选择有效性条件 允许为:序列,然后需要下拉框内容,并选择下拉框。即可 切记:开源中的逗号为英文逗号。 最后效果如下: 参考自https://jingya…

为什么多个线程不可能同时抢到一把锁_HFL Redis_12_redis分布式锁的3种实现方式...

HotFrameLearning(简称 HFL) Redis_12_redis分布式锁的3种实现方式-一、大致介绍1、昨天介绍完redis的数据结构后,有小伙伴让本人讲讲redis的分布式锁,因此才有了此篇的由来,只是把我的节奏提前了而已;2、接下来我就通过几种方式介…

linux下mysql5.7修改密码

开始修改MySQL用户密码 ① 输入use mysql回车; ② 输入update user set password password(“147258”)where user’root’; “147258”为你自己设置的密码; 执行第二步后如果报错: 执行后报错  ERROR 1…

react项目中的参数解构_重构复杂的React组件:编写高效且可读组件的5个最佳实践...

随着 React.js 的不断进化,现在的它已经成为 Web 组件中最受欢迎的视图库之一。但是你手中的它,是否真的能够正常工作呢?本文将主要描述 5 个关于React 组件的最佳实践,希望对正在关注 React 组件的你有所帮助。我自己是一名从事了…

robotFramework-ride使用1-关键字驱动与数据类型

RF项目结构 项目文件夹(new project) 用例集(test suit) 测试用例(test case) RF基本功能-设置区介绍 项目 --》settings----》Document:添加用例说明 suit setup:执行此测试套件…

opencv threshold_基于深度学习OpenCV与python进行字符识别

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达当我们在处理图像数据集时,总是会想有没有什么办法以简单的文本格式检索图像中的这些字符呢?今天我们就一起看看有没有什么简单的办法可以实现这一…