列表推導(dǎo)(list comprehensions)
場(chǎng)景1:將一個(gè)三維列表中所有一維數(shù)據(jù)為a的元素合并,組成新的二維列表。
最簡(jiǎn)單的方法:新建列表,遍歷原三維列表,判斷一維數(shù)據(jù)是否為a,若為a,則將該元素append至新列表中。
缺點(diǎn):代碼太繁瑣,對(duì)于Python而言,執(zhí)行速度會(huì)變慢很多。
針對(duì)場(chǎng)景1,我們首先應(yīng)該想到用列表解析式來解決處理,一行代碼即可解決:
lista = [item for item in array if item[0] == 'a']
那么,何為列表解析式?
官方解釋:列表解析式是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來創(chuàng)建list的生成式。
強(qiáng)大具體如何體現(xiàn)?
可以看到,使用列表解析式的寫法更加簡(jiǎn)短,除此之外,因?yàn)槭荘ython內(nèi)置的用法,底層使用C語言實(shí)現(xiàn),相較于編寫Python代碼而言,運(yùn)行速度更快。
場(chǎng)景2: 對(duì)于一個(gè)列表,既要遍歷索引又要遍歷元素。
這里可以使用Python內(nèi)建函數(shù)enumerate,在循環(huán)中更好的獲取獲得索引。
array = ['I', 'love', 'Python']for i, element in enumerate(array): array[i] = '%d: %s' % (i, seq[i])
可以使用列表推導(dǎo)式對(duì)其進(jìn)行重構(gòu):
def getitem(index, element): return '%d: %s' % (index, element)array = ['I', 'love', 'Python']arrayIndex = [getitem(index, element) for index, element in enumerate(array)]
據(jù)說這種寫法更加的Pythonic。
總結(jié):如果要對(duì)現(xiàn)有的可迭代對(duì)象做一些處理,然后生成新的列表,使用列表推導(dǎo)式將是最便捷的方法。
迭代器和生成器
迭代器(Iterator)
這里的迭代可以指for循環(huán),在Python中,對(duì)于像list,dict和文件等而言,都可以使用for循環(huán),但是它們并不是迭代器,它們屬于可迭代對(duì)象。
什么可迭代對(duì)象
最簡(jiǎn)單的解釋:可以使用for...in...語句進(jìn)行循環(huán)的對(duì)象,就是可迭代對(duì)象(Iterable),可以使用isinstance()方法進(jìn)行判斷。
from collections import Iterable type = isinstance('python', Iterable)print type
什么是迭代器
迭代器指的是可以使用next()方法來回調(diào)的對(duì)象,可以對(duì)可迭代對(duì)象使用iter()方法,將其轉(zhuǎn)換為迭代器。
temp = iter([1, 2, 3])print type(temp)print next(temp)
此時(shí)temp就是一個(gè)迭代器。所以說,迭代器基于兩個(gè)方法:
next:返回下一個(gè)項(xiàng)目 iter 返回迭代器本身可理解為可被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象就是迭代器,在定義一個(gè)裝飾器時(shí)將需要同時(shí)定義這兩個(gè)方法。
迭代器的優(yōu)勢(shì)
在構(gòu)建迭代器時(shí),不是將所有的元素一次性的加載,而是等調(diào)用next方法時(shí)返回元素,所以不需要考慮內(nèi)存的問題。
迭代器應(yīng)用場(chǎng)景
新聞熱點(diǎn)
疑難解答
圖片精選