# 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]]):调用函数,可以提供参数