python列表生成式与列表生成器的运用,的三种推
分类:计算机编程

推导式 comprehensions(又称拆解深入分析式):是 Python 中很苍劲的、相当受迎接的特点,具备语言简洁,速度快等优点。推导式包含:

正文实例呈报了Python列表推导式、字典推导式与集中推导式用法。分享给大家供大家仿照效法,具体如下:

列表生成式:会将有着的结果一切计算出来,把结果寄放到内存中,固然列表中数据相当多,就能够占领过多的内部存款和储蓄器空间,恐怕会促成MemoryError内部存款和储蓄器不当也许变成程序在运维时现身卡顿的景观

推导式comprehensions(又称解析式),是Python的后生可畏种唯有特色。推导式是可以从一个数码系列营造另三个新的多寡体系的构造体。

1. 列表推导式
2. 字典推导式
3. 集合推导式

推导式comprehensions(又称拆解分析式),是Python的生机勃勃种独有特色。推导式是足以从二个数额种类创设另一个新的多寡种类的结构体。 共有两种推导,在Python2和3中皆有支撑:

列表生成器:会成立三个列表生成器对象,不会一回性的把具备结果都总计出来,假若须求获取数据,能够行使next(卡塔尔国函数来赢得,可是供给潜心,后生可畏旦next(卡塔尔(قطر‎函数获取不到数量,会引致现身StopIteration十分错误,能够应用for循环遍历列表生成器,获取具有数据

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

对上述的三种推导式分别举例深入分析:

列表(list)推导式
字典(dict)推导式
集合(set)推导式

供给视景况而定,固然数据量一点都相当的大,推荐使用生成器

列表推导式

生龙活虎、列表推导式


生龙活虎、列表推导式

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

一、使用[]生成list

主导格式

var = [expression for item in iterable if condition]
expression        # 列表生成元素表达式,可以是有返回值的函数。
for item in iterable    #迭代iterable将item传入expression表达式中。
if condition    #根据条件过滤数据,生成想得到的数据

eg:列表生成式

var =[item for item in range(10) if item % 2 == 0]
print(var)

# 输出
[0, 2, 4, 6, 8]      # 输出为列表

 

二、使用()生成generator

将列表推导式的 [] 换来 (卡塔尔(قطر‎ 就能够获得  生成器

eg:生成器表明式

gen=('egg%s' %i for i in range(10) if i > 5)
print(gen)
print(list(gen))

# 输出
<generator object <genexpr> at 0x7f4b7c219d58>  # 生成器对象
['egg6', 'egg7', 'egg8', 'egg9']     # 生成器内的数据

 

 

1、使用 [] 生成 list

例如:

list = [ i for i in range(20) if i%2 == 0 ]
print(list)

#output:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

1、使用[]生成list

列表生成式是火快速生成成多个列表的片段公式

字典推导式

字典推导和列表推导的应用方法是临近的,只不中括号该改成大括号。间接比如表达

eg:大小写key合并

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {
    k.lower(): mcase.get(k.lower(), 0)   mcase.get(k.upper(), 0)
    for k in mcase.keys()
    if k.lower() in ['a','b']
}
print mcase_frequency

# 输出结果
 {'a': 17, 'b': 34}

eg:快捷调换key和value

mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency

# 输出结果
{10: 'a', 34: 'b'}

 

2、使用 () 生成 generator

将列表推导式的 [] 换来 (卡塔尔国 就可以获得生成器。

generator = ( i for i in range(20) if i%2 == 0 )
print(generator)

#output:<generator object <genexpr> at 0x0000000000B5CA40>

由此 next(卡塔尔 就能够依次调用生成器中的数据。

要旨格式

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

会面推导式

跟列表推导式也是近乎的。 唯生龙活虎的不一样在于它应用大括号{}。

eg:

squared = {x**2 for x in [1, 1, 2]}
print(squared)
# 输出结果
# set([1, 4])

 

二、字典推导式


留存 key 和 value,使用的是 {}。

dic = { "A":1, "b":2, "C":3, "d":4 }
new_dic = { k:v for k,v in dic.items() if k <= 'a'}
print(new_dic)

#output:{'C': 3, 'A': 1}

variable = [out_exp_res for out_exp in input_list if out_exp == 2]

万般的列表生成:

三、集结推导式


它跟列表推导式也是接近的。分歧在于它使用大括号 {},何况数据是冬天和无重复的。

Set = { i**2 for i in [1,2,3,4,5,3] }
print(Set)

#output:{16, 1, 4, 9, 25}

out_exp_res:  列表生成成分表明式,能够是有重临值的函数。
for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表明式中。
if out_exp == 2:  依照标准过滤哪些值能够。

numbers=[] 
for x in range(0,101): 
  numbers.append(x) 
print(numbers) 

例一:

用列表生成式生成列表:[要归入列表的多少    简单的表明式1   表明式2]

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
#x for x in range(0,101) for循环遍历出来的值,放入列表中 
numbers=[x for x in range(0,101)] 
print(numbers) 

例二:

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

def squared(x):
  return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print multiples
# Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

平时性方法生成列表:

2、使用()生成generator

for x in range(0,101): 
  if x%2==0: 
    numbers.append(x) 
print(numbers) 

将俩表推导式的[]转移(卡塔尔国就可以拿到生成器。

用列表生成式生成列表:

multiples = (i for i in range(30) if i % 3 is 0)
print(type(multiples))
# Output: <type 'generator'>
#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的字符

字典推导和列表推导的运用形式是相近的,只不中括号该改成大括号。直接举个例子表明:

枯燥没味写法:

例子一:大小写key合并

rs_list=[] 
for s in list1: 
  if 'a' in s: 
    rs_list.append(s) 
print(rs_list) 
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {
  k.lower(): mcase.get(k.lower(), 0)   mcase.get(k.upper(), 0)
  for k in mcase.keys()
  if k.lower() in ['a','b']
}
print mcase_frequency
# Output: {'a': 17, 'b': 34}

列表生成式:

事例二:火速改动key和value

list2=[x for x in list1 if 'a' in x] 
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency
# Output: {10: 'a', 34: 'b'}

列表生成式援助双层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))
squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Output: set([1, 4])

出口结果:

更加多关于Python相关内容感兴趣的读者可查阅本站专项论题:《Python列表(list卡塔尔操作本领总结》、《Python数组操作技巧计算》、《Python字符串操作技术汇总》、《Python函数使用技艺总括》、《Python入门与进级精华教程》及《Python数据结构与算法教程》

<class 'generator'>
<class 'generator'>

指望本文所述对大家Python程序设计具有利于。

生成器的调用格局

你或然感兴趣的稿子:

  • Python列表推导式与生成器表明式用法示例
  • 据悉Python列表剖析(列表推导式卡塔尔(英语:State of Qatar)
  • Python列表推导式的利用办法
  • Python学习小能力之列表项的推导式与过滤操作
  • Python列表生成式与生成器操作示例
  • Python3中的列表生成式、生成器与迭代器实例详细明白
  • python列表生成式与列表生成器的运用
  • 举个例子来讲疏解Python中的迭代器、生成器与列表解析用法
  • 浅谈Python中列表生成式和生成器的分别
  • Python while、for、生成器、列表推导等语句的举办作用测量试验
  • Python列表推导式与生成器用法分析
  1. 要调用生成器发生新的成分,有三种方法:
  2. 调用内置的next(卡塔尔方法
  3. 使用循环对生成器对象开展遍历(推荐)
  4. 调用生成器对象的send(卡塔尔方法

实例1:使用next(卡塔尔(英语:State of Qatar)方法遍历生成器

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 <module>
    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 <module>
    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(卡塔尔(英语:State of Qatar)方法

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

结论:

  1. next(卡塔尔(قطر‎会调用yield,但不给它传值
  2. send(卡塔尔(قطر‎会调用yield,也会给它传值(该值将改为当前yield表明式的结果值)

亟待介怀的是:第三次调用生成器的send(卡塔尔国方法时,参数只可以为None,不然会抛出十二分。当然也足以在调用send(卡塔尔(قطر‎方法在此以前先调用一回next(卡塔尔(英语:State of Qatar)方法,指标是让生成器先步入yield表达式。

生成器与列表生成式相比

既是经过列表生成式就能够直接成立多少个新的list,那么为啥还要有生成器存在吗?

因为列表生成式是一向开立四个新的list,它会叁次性地把具备数据都存放到内存中,那会设有以下多少个难题:

  1. 内存容积有限,由此列表体积是零星的;
  2. 当列表中的数据量异常的大时,会据有多量的内部存款和储蓄器空间,假设咱们只是必要拜望前边有限个要素时,就可以促成内部存款和储蓄器能源的小幅度浪费;
  3. 当数据量非常的大时,列表生成式的归来时间会相当慢;

而生成器中的成分是依据钦点的算法推算出来的,唯有调用时才转移对应的数码。那样就无须二回性地把富有数据都转移,从而省去了大批量的内部存款和储蓄器空间,那使得其变化的要素个数大约是未曾节制的,而且操作的回届期间也是十二分神速的(仅仅是创设一个变量而已)。

大家能够做个考试:相比一下生成贰个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列表推导式与生成器表明式用法示例
  • 基于Python列表剖判(列表推导式卡塔尔国
  • Python列表推导式、字典推导式与聚焦推导式用法实例解析
  • Python列表推导式的施用形式
  • Python学习小技术之列表项的推导式与过滤操作
  • Python列表生成式与生成器操作示例
  • Python3中的列表生成式、生成器与迭代器实例详细明白
  • 比如讲授Python中的迭代器、生成器与列表剖析用法
  • 浅谈Python中列表生成式和生成器的分别
  • Python while、for、生成器、列表推导等话语的实行成效测量试验
  • Python列表推导式与生成器用法剖析

本文由pc28.am发布于计算机编程,转载请注明出处:python列表生成式与列表生成器的运用,的三种推

上一篇:爬虫学习笔记,运营学python之爬虫高档篇 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • 那些年【深入.NET平台和C#编程】
    那些年【深入.NET平台和C#编程】
    一、深入.NET框架 ArrayList (非泛型集合  using System.Collections;) public void Text1(){ ArrayList al = new ArrayList (); al.Add ("刘德化");       //添加元素 al.Add ("张学友
  • 碰着搭建
    碰着搭建
    Appium是移动端的自动化测试工具,类似于前面所说的Selenium,利用它可以驱动Android、iOS等设备完成自动化测试,比如模拟点击、滑动、输入等操作,其官方
  • Django中的CBV和FBV示例介绍
    Django中的CBV和FBV示例介绍
    Django中的CBV和FBV Django中的CBV和FBV示例介绍,djangocbvfbv示例 前言 本文主要给大家介绍了关于Django中CBV和FBV的相关内容,分享出来供大家参考学习,下面话不
  • 将Log4net的配置配置到的独立文件中,Log4Net日志插
    将Log4net的配置配置到的独立文件中,Log4Net日志插
  • Python面向对象编程思想
    Python面向对象编程思想
    Python中的类(一) 1.面向过程编程:计算机通过一系列指令来一步一步完成任务。 面向对象编程——Object OrientedProgramming,简称OOP,是一种程序设计思想。