Python核心編程第八章筆記

條件表達式("三元操作符")

>>>smaller = x if x < y else y

>>>smaller

3

===使用項和索引迭代===

>>>nameList = ['Donn', 'Shirley', 'Ben', 'Janice',

...

'David','Yen', 'Wendy']

>>>for i, eachLee in enumerate(nameList):

...

print"%d %s Lee" % (i+1, eachLee)


用於迭代器類型

迭代器對象有一個next()方法,調用後返回下一個條目.所有條目迭代完後,迭代器引發一

StopIteration異常告訴程序循環結束.for語句在內部調用next()並捕獲異常.



與序列相關的內建函數

sorted(),reversed(), enumerate(), zip()

下邊是使用循環相關和序列相關函數的例子.爲什麼它們叫"序列相關"?是因爲其中兩個函

(sorted()zip())返回一個序列(列表),而另外兩個函數(reversed()enumerate())

返回迭代器(類似序列)

>>albums = ('Poe', 'Gaudi', 'Freud', 'Poe2')

>>>years = (1976, 1987, 1990, 2003)

>>>for album in sorted(albums):

...

printalbum,

>>>for album in reversed(albums):

...

printalbum,

>>>for i, album in enumerate(albums):

...

printi, album

>>>for album, yr in zip(albums, years):

...

printyr, album


迭代器和iter()函數

>>myTuple = (123, 'xyz', 45.67)

>>>i = iter(myTuple)

>>>i.next()

123

>>>i.next()

'xyz'

>>>i.next()

45.67

>>>i.next()

Traceback(most recent call last):

File"", line 1, in ?

StopIteration


列表解析

map(lambdax: x ** 2, range(6))

[0,1, 4, 9, 16, 25]

等效的列表解析

>>>[x ** 2 for x in range(6)]

[0,1, 4, 9, 16, 25]


>>seq = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12]

>>>filter(lambda x: x % 2, seq)

[11,9, 9, 9, 23, 9, 7, 11]

等效的列表解析

>>>[x for x in seq if x % 2]

[11,9, 9, 9, 23, 9, 7, 11]


計算單詞個數:

>>>f = open('hhga.txt', 'r')

>>>len([word for line in f for word in line.split()])

91


每個單詞的長度加起來,得到和

>>>f.seek(0)

>>>sum([len(word) for line in f for word in line.split()])

408



生成器表達式

列表解析:

[exprfor iter_var in iterable if cond_expr]

生成器表達式:

(exprfor iter_var in iterable if cond_expr)

生成器並不會讓列表解析廢棄,它只是一個內存使用更友好的結構,基於此,有很多使用生成器地方.

>>>sum(len(word) for line in data for word in line.split())

408

我們所做的只是把方括號刪除:少了兩字節,而且更節省內存...非常地環保!


f= open('/etc/motd', 'r')

allLineLens= [len(x.strip()) for x in f]

f.close()

return  max(allLineLens)

這裏唯一的問題就是你一行一行迭代f的時候,列表解析需要文件的所有行讀取到內存中,

然後生成列表.我們可以進一步簡化代碼:使用生成器表達式替換列表解析,然後把它移到max()

函數裏,這樣,所有的核心部分只有一行:

f= open('/etc/motd', 'r')

longest= max(len(x.strip()) for x in f)

f.close()

return  longest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章