迭代鏈表索引
需要迭代鏈表索引的話,如下所示結合使用 range() 和 len():
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print i, a[i]
...
0 Mary
1 had
2 a
3 little
4 lamb
循環中的else
循環可以有一個 else 子句;它在循環迭代完整個列表 (對於 for) 後或執行條件爲 false (對於 while) 時執行,但循環被 break 中止的情況下不會執行。以下搜索素數的示例程序演示了這個子句:
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print n, 'equals', x, '*', n/x
... break
... else:
... # loop fell through without finding a factor
... print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
#(Yes, 這是正確的代碼。看仔細: else 語句是屬於 for 循環之中, 不是 if 語句。)
函數參數的默認值
默認值在函數 定義 作用域被解析,如下所示:
i = 5
def f(arg=i):
print arg
i = 6
f()
將會輸出 5。
重要警告: 默認值只被賦值一次。這使得當默認值是可變對象時會有所不同,比如列表、字典或者大多數類的實例。例如,下面的函數在後續調用過程中會累積(前面)傳給它的參數:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
這將會打印:
[1]
[1, 2]
[1, 2, 3]
如果你不想在隨後的調用中共享默認值,可以像這樣寫函數:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
使用元組/字典傳遞參數
引入一個形如 **name 的參數時,它接收一個字典(參見 typesmapping ),該字典包含了所有未出現在形式參數列表中的關鍵字參數。這裏可能還會組合使用一個形如 *name (下一小節詳細介紹)的形式參數,它接收一個元組(下一節中會詳細介紹),包含了所有沒有出現在形式參數列表中的參數值。( *name 必須在 **name 之前出現)例如,我們這樣定義一個函數:
def cheeseshop(kind, *arguments, **keywords):
print "-- Do you have any", kind, "?"
print "-- I'm sorry, we're all out of", kind
for arg in arguments:
print arg
print "-" * 40
keys = sorted(keywords.keys())
for kw in keys:
print kw, ":", keywords[kw]
它可以像這樣調用:
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper='Michael Palin',
client="John Cleese",
sketch="Cheese Shop Sketch")
當然它會按如下內容打印:
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch