條件表達式(即"三元操作符")
>>>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