第十八章 推导式

2019-01-05  本文已影响24人  运维开发_西瓜甜

推导试是从一个或者多个迭代器快速简洁地创建数据结构的一种方法。

> 可以将循环和条件判断相结合,从而避免语法冗长的代码

> 实际上使用推导式更像Python的风格

是 Python 语言中独有的特性,用他们写出来的代码很优雅。

一、列表推导式

语法格式

[expression for item in iterable ]

expression 表达式,比如 单独的变量名,变量名 - 1

item 循环变量

iterable 可迭代对象 其后面可以跟判断条件,如:

[expression for item in iterable if condition]

# 一般传统的方法
In [1]: number_list = list(range(1,5))

In [2]: number_list
Out[2]: [1, 2, 3, 4]

# 列表推导式
In [3]: num_list = [n for n in range(1,7)]

In [4]: num_list
Out[4]: [1, 2, 3, 4, 5, 6]

# 添加有表达式的列表推导式
In [5]: num_list = [n - 1 for n in range(1,7)]

In [6]: num_list
Out[6]: [0, 1, 2, 3, 4, 5]

#  有条件判断的一般传统的方法
In [7]: a_list = []

In [8]: for n in range(1,6):
   ...:     if n % 2 == 1:
   ...:         a_list.append(n)
   ...:

In [9]: a_list
Out[9]: [1, 3, 5]

# 使用有条件判断的列表推导式
In [10]: a_list = [n for n in range(1,6) if n % 2 == 1]

In [11]: a_list
Out[11]: [1, 3, 5]

#  含有嵌套循环的一般方法
In [12]: rows = range(1,4)

In [13]: cols = range(1,3)

In [14]: for row in rows:
    ...:     for col in cols:
    ...:         print(row,col)
    ...:
1 1
1 2
2 1
2 2
3 1
3 2

# 嵌套循环的列表推导式
In [15]: rows = range(1,4)

In [16]: cols = range(1,3)

In [17]: cells = [(row,col) for row in rows for col in cols]

In [18]: for cell in cells:
    ...:     print(cell)
    ...:
(1, 1)
(1, 2)
(2, 1)
(2, 2)
(3, 1)
(3, 2)
    


二、 字典推导式

{key_expression:value_expression for expression in iterable}

# 一个简单的例子
words = 'letters'
w_counts = {w: words.count(w) for w in words}

# 利用 set 集合去重,以减少 words.count(letter) 的次数,以节约资源和时间
w_counts = {w: words.count(w) for w in set(words)}



三、集合推导式

格式和列表、字典推导式的格式一样

>>> a_set = {n for n in range(1,6) if n % 3 == 1}
>>> a_set
{1, 4}
>>> 


三、生成器推导式

也许机智的你已经发现了以上的规律,如果将列表推导式的方括号变成圆括号就可以定义一个元组推导式;

不幸的是,元组是没有推导式的,其实它是一个生成器推导式,它返回的是一个生成器对象,可以直接对其进行迭代。

​ 注意: 一个生成器只能运行一次。list/set/str/dict 都是存储在内存里的,但生成器仅在运行时产生值,不会被保存下来,当然也不能对其备份。

>>> 
>>> number_thing
<generator object <genexpr> at 0x7f25d59f1820>
>>> type(number_thing)
<type 'generator'>

# 可以直接对生成器对象进行迭代
>>> for number in number_thing:
...     print(number)
... 
1
3
5

# 可以对其调用 linst()函数,但是由于上面已经迭代一次了,由于其是无法保存的,所以
# 再次进行迭代,发现它已经不存在了
>>> list(number_thing)
[]

# 再次生成
>>> number_thing = (number for number in range(1,6) if number % 2 == 1)
>>> list(number_thing)
[1, 3, 5]
>>> 

你可以使用生成器推导式产生一个生成器,也可以用生成器的函数产生一个生成器,将会在后面的课程深入讲解。

上一篇下一篇

猜你喜欢

热点阅读