# 6.1 懶惰即美德



# 6.2 抽象和結構
程序應該是非常抽象的,就像“下載網頁、計算頻率、打印每個單詞的頻率”一樣易懂,事實上,我們現在就能把這段描述翻譯成Python程序:
~~~
page = download_page()
freqs = compute_frequencies(page)
for word.freq in freqs:
print word.freq
~~~
# 6.3 創建函數

里面說 callable 在 Python 3.0 中不在可用,但3.4.3 里可用啊。

## 6.3.1 記錄函數
如果想要給函數寫文檔,讓后面使用該函數人能理解的話,可以加入注釋(以#開頭)。另外一個方式就是直接寫上字符串。如果在函數的開頭寫下字符串,它就會作為函數的一部分進行存儲,這稱為文檔字符串。

## 6.3.2 并非真正函數的函數
數學意義上的函數,總在計算其參數后返回點什么。Python 的有些函數卻不返回任何東西。在其他語言中(比如Pascal),這類函數可能有其他名字(比如過程)。但是Python的函數就是函數,即便它從學術上講并不是函數。沒有return語句,或者有return語句但return后邊沒有跟任何值的函數不返回值。

# 6.4 參數魔法
## 6.4.1 值從哪里來
## 6.4.2 我能改參數嗎

參數存儲在局部作用域(local scope)內。

字符串(以及數字和元組)是不可變的,即無法被修改(也就是說只能用新的值覆蓋)。如果將可變的數據結構如列表用作參數,其會被改變。

為了防止這種情況出現,我們可以復制一個副本。

參數n包含一個副本,而原始的列表是安全的。
1.為什么我想要修改參數

上面這些煩瑣的過程怎樣用函數來簡化:

上面例子沒看懂。
2.如果我的參數不可變呢

## 6.4.3 關鍵字參數和默認值


## 6.4.4 收集參數

參數前星號將所有值放置在同一個元組中。

星號的意思就是”收集其余的位置參數“。如果不提供任何供收集的元素,params 就是個空元組。

二個星返回的是字典。



## 6.4.5 反轉過程


## 6.4.6 練習使用參數



# 6.5 作用域




警告:像這樣引用全局變量是很多錯誤的引發原因,慎重使用。


嵌套作用域

類似multiplyByFactor函數存儲子封閉作用域的行為叫閉包(closure).
# 6.6 遞歸
## 6.6.1 兩個經典:階乘和冪

## 6.6.2 另外一個經典:二元查找
# 6.7 小結
map(func, seq[, seq, ...]):對序列中的每個元素應用函數
filter(func, seq):返回其函數為真的元素的列表
reduce(func, seq[, initial]):等同于func(func(func(seq[0], seq[1]),seq[2])...)
sum(seq):返回seq中所有元素的和
apply(func[, args[, kwargs]]):調用函數,可以提供參數