2019实战第二期-函数读书打卡
抽象之函数
函数可以尽量避免重复的代码,简化代码。函数式结构化编程的核心。
函数执行特定的操作并返回一个值
def hello(name):
return 'Hello, ' + name + '!'
print(hello('world))
运行这些代码后,将有一个名为 hello 的新函数。它返回一个字符串,其中包含向唯一参数
指定的人发出的问候语
给函数编写文档:以确保其他人能够理解,可添加注释(以#打头的内容)
def square(x):
'Calculates the square of the number x.'
return x * x
# 可以像下面这样访问文档字符串:
print(square.__doc__)
'Calculates the square of the number x.'
#__doc__ 是函数的一个属性。属性将在第7章详细介绍。属性名中的双下划线表示这是一个特殊的属性
有些函数什么都不返回,可以称为过程。如果没有声明其返回值,则默认返回None
参数魔法
在函数内部给参数赋值对外部没有任何影响
>>> def try_to_change(n):
... n = 'Mr. Gumby'
...
>>> name = 'Mrs. Entity'
>>> try_to_change(name)
>>> name
'Mrs. Entity'
字符串(以及数和元组)是不可变的(immutable),这意味着你不能修改它们(即只能替换
为新值)。
1.为何要修改参数
在提高程序的抽象程度方面,使用函数来修改数据结构(如列表或字典)是一种不错的方式。
def store(data, full_name):
names = full_name.split()
if len(names) == 2: names.insert(1, '')
labels = 'first', 'middle', 'last'
for label, name in zip(labels, names):
people = lookup(data, label, name)
if people:
people.append(full_name)
else:
data[label][name] = [full_name]
函数 store 执行如下步骤。
(1) 将参数 data 和 full_name 提供给这个函数。这些参数被设置为从外部获得的值。
(2) 通过拆分 full_name 创建一个名为 names 的列表。
(3) 如果 names 的长度为2(只有名字和姓),就将中间名设置为空字符串。
(4) 将 'first' 、 'middle' 和 'last' 存储在元组 labels 中(也可使用列表,这里使用元组只是为
了省略方括号)。
(5) 使用函数 zip 将标签和对应的名字合并,以便对每个标签名字对执行如下操作:
获取属于该标签和名字的列表;
将 full_name 附加到该列表末尾或插入一个新列表。
2.如果参数是不可变的
如果一定要修改参数,可玩点花样,比如将值放在列表中
3.关键字参数和默认值
有时候,参数的排列顺序可能难以记住,尤其是参数很多时。为了简化调用工作,可指定参
数的名称。主要优点是有助于澄清各个参数的作用。
参数指定默认值后,调用函数时可不提供它!可以根据需要,一个参数值也不提供、
提供部分参数值或提供全部参数值。
4.收集参数
允许用户提供任意数量的参数很有用。
def print_params(*params):
print(params)
def print_params_4(x, y, z=3, *pospar, **keypar):
print(x, y, z)
print(pospar)
print(keypar)
其效果与预期的相同。
>>> print_params_4(1, 2, 3, 5, 6, 7, foo=1, bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params_4(1, 2)
1 2 3
()
{}