python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...
前言
列表推導式構建列表的快捷方式,而生成器表達式則可以用來創建其他任何類型的序列。自python2.7以后,列表推導和生成器表達式的概念就應用到了字典上,所以就有了字典推導,以后我們還會遇到集合推導(此處暫不討論)。因此,如果想要更好的學習字典推導,需要對列表推導和生成器表達式進行充分對掌握。
為什么使用推導式,推導式的應用讓代碼的可讀性更強。接下來,我們就一同來驗證為什么說“可讀性更強”。
1.列表推導
示例1:把letter字符串變成Unicode碼位的列表
In [1]: letter='abcdefghr'
In [2]: codes=[]
In [3]: for letter in letter:
...: codes.append(ord(letter))
...:
In [4]: codes
Out[4]: [97, 98, 99, 100, 101, 102, 103, 104, 114]
示例2:把letter字符串變成Unicode碼位的列表的另外一個寫法(即列表推導)
In [1]: letter='abcdefghr'
In [2]: codes=[ord(letter) for letter in letter]
In [3]: codes
Out[3]: [97, 98, 99, 100, 101, 102, 103, 104, 114]
如上兩個示例,最終達到的效果是一致的。但是明顯可以看出,示例2的可讀性更強。大家可能會問,是不是以后就使用列表推導不再使用for循環來呢?其實不然。通常的原則是,只用列表推導來創建新的列表,并且盡量保持簡短。如果列表推導的代碼超過了兩行,可能就要考慮是不是要用for循環重寫了。實際上,沒有硬性規則要求什么時候用什么,或者必須用什么,如何用怎么用,還是需要自己把握。
2.生成器表達式
與列表推導相比,生成器表達式是初始化元組、數組或其他序列類型的更好選擇。原因是生成器表達式遵守了迭代器協議,它是逐個的產出元素,而不是構造完整列表后,把列表傳遞到函數里。生成器表達式與列表推導的語法差不多,不同的是列表推導使用方括號,而生成器表達式使用的是圓括號。
示例1:使用生成器表達式初始化元組和數組
#初始化元組
In [1]: letter='abcdefghr'
In [2]: tuple=tuple(ord(letter) for letter in letter)
In [3]: tuple
Out[3]: (97, 98, 99, 100, 101, 102, 103, 104, 114)
#初始化數組
In [4]: import array
In [5]: array.array('I',(ord(letter) for letter in letter))
Out[5]: array('I', [97, 98, 99, 100, 101, 102, 103, 104, 114])
如果生成器表達式是函數調用的唯一參數,則不需要再加另外一個圓括號。
array的構造方法有兩個參數,第一個參數確定了數字的存儲方式。與初始化元組不同,該處有兩個參數,所以生成器表達式需要用圓括號括起來。
3.字典推導
字典推導可以從任何以鍵值對作為元素的可迭代對象中構建出字典。
下面例子就展示了利用字典推導可以把一個裝滿元組的列表編程兩個不同的字典。
創建一個包含成對數據的data_name列表,它將直接用在后續字典的構造方法中,具體如下:
In [1]: data_name=[(1561,'祁俊超'),(1560,'鄧亞鑫'),(1559,'黎榮梅'),(1557,'盧雪'),
(1556,'武曉蒙'),(1555,'黃國全'),(1554,'黎榮梅'),(1551,'姚文通'),
(1550,'曾丹丹'),(1548,'武曉蒙')]
In [2]: data_name
Out[2]:
[(1561, '祁俊超'),
(1560, '鄧亞鑫'),
(1559, '黎榮梅'),
(1557, '盧雪'),
(1556, '武曉蒙'),
(1555, '黃國全'),
(1554, '黎榮梅'),
(1551, '姚文通'),
(1550, '曾丹丹'),
(1548, '武曉蒙')]
更改data_name列表中數據對的左右位置,姓名為鍵,編號為值。具體如下:
In [3]: name_code={name:code for code,name in data_name}
In [4]: name_code
Out[4]:
{'祁俊超': 1561,
'鄧亞鑫': 1560,
'黎榮梅': 1554,
'盧雪': 1557,
'武曉蒙': 1548,
'黃國全': 1555,
'姚文通': 1551,
'曾丹丹': 1550}
同上面的操作相反,用編號為鍵,姓名為值,并且過濾掉編號大于或等于1560的姓名。具體如下:
In [5]: {code:name for name,code in name_code.items() if code>=1560}
Out[5]: {1561: '祁俊超', 1560: '鄧亞鑫'}
如果對列表推導對概念以及書寫方式已熟知,那么理解字典推導相對容易些。如果對列表推導還不熟知,那么現在應該是掌握它導時候了,因為字典推導導表達形式在其他數據類型中慢慢得以體現。同時,使用列表推導和字典推導可以實現對數據的過濾效果。
總結
以上是生活随笔為你收集整理的python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql输入命令1002无标题_Lin
- 下一篇: php配置mysql集群_mysql的集