2019实战第二期-函数读书打卡

2019-03-19  本文已影响0人  tipire

抽象之函数

函数可以尽量避免重复的代码,简化代码。函数式结构化编程的核心。

函数执行特定的操作并返回一个值

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
()
{}
上一篇下一篇

猜你喜欢

热点阅读