python中哪个函数能生成集合_python 生成器、列表/字典/集合解析式区别

一、列表解析

列表解析也叫列表推导式,是python编程中常用到的语法糖。列表推导是一个将一个列表(实际上是任意可迭代对象)转换成另一个列表的工具。在转换时,每个元素都可以按照某个条件被包含在新的列表中,并根据需要做出一些变换。

先看一例子,比如我想把某列表中的每项值都乘以2

# 迭代列表for方法

nlist = range(5) # 用range内置函数快速生成列表[0, 1, 2, 3, 4]

mlist = list() # 创建新的空列表对象

for i in mlist:

mlist.append(i)

print mlist

[0, 2, 4, 6, 8]

# 利用列表推导式,只需一行代码,6得不行,python就那么屌

mlist = [i * 2 for i in range(5)]

print mlist

[0, 2, 4, 6, 8]

列表推导式结合if关键字可以为我们做一些过滤

# 过滤掉列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中值为奇数的项

lst = [i for i in range(11) if i % 2 == 0]

print lst

[0, 2, 4, 6, 8, 10]

列表推导式的嵌套循环

# [[1, 2, 3], [4, 5, 6]] --> [1, 2, 3, 4, 5, 6]

nlist = [[1, 2, 3], [4, 5, 6]]

lst = [i for item in nlist for i in item]

print list

[1, 2, 3, 4, 5, 6]

列表推导式是不是很6很屌啊 ~~

* 注: * 内置的map函数调用比等效的for循环要快两倍,而列表解析往往比map调用要

二、字典解析

字典的形式是: {key: val},所以字典解析式也是用花括号括起来的

# 快速生成值是键二倍的字典

ndict = {x: x*2 for x in range(5)}

print ndict

{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}

三、集合解析

python中集合也是用花括号括起来的,所以集合解析式: {x for x in iter}

# 快速生成1-10的集合

nset = {x for x in range(1, 11)}

print nset

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

四、生成器

1、何为生成器

和返回一个值并退出的常规函数不同,生成器是可以从其退出的地方继续的函数。用到的关键字:yield

2、生成器函数应用

def test(num):

for i in range(num):

a = yield i * 2

print a

g = test(5)

g

next(g)

0

next(g)

2

next(g)

4

next(g)

8

next(g)

StopIteration ... # 已迭代完,继续迭代所以抛异常

下面我们看看生成器函数的协议:`send`和 `next`

``` python

def test(num):

for i in range(num):

a = yield i * 2

if a == 22:

print '剪刀手最2...'

print a

x = test(5)

next(x)

0

x.send(11)

11

1

x.send(22)

剪刀手最2…

2

next(x)

3

用send方法,编写一个能够被它的调用着终止的生成器。

3、生成器表达式

类似列表推导式,但用的的圆括号:()

g = (x * 2 for x in range(5))

g

at 0x7f2e1e80a410>

next(g)

0

next(g)

1

注:生成器是单迭代器对象

g = gg = (x * 2 for x in range(5))

next(g)

0

next(g)

1

next(gg)

2

4、生成器 VS 列表推导式

列表推导式是一次性创建所有数据的,而生成器是生成对象,需要我们调用next方法逐一获取元素。假设我创建的数据很大很大(比如一千万),列表推导式会一次性创建,需要分配很大的内存空间存放这一千万数据,而生成器不会,只是创建了一个生成器对象,所以生成器更节省内存。

你可能感兴趣的:(python中哪个函数能生成集合_python 生成器、列表/字典/集合解析式区别)