• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

Python厨书笔记-7

2020-01-24

1. 函数

2. 接受任意数量参数

*:接受任意数量的位置参数

1
2
3
4
5
6
def avg(first, *rest):
return (first + sum(rest)) / (1 + len(rest))

# Sample use
avg(1, 2) # 1.5
avg(1, 2, 3, 4) # 2.5

**:接受任意数量的关键字参数(字典)

  • 一个*参数只能出现在函数定义中最后一个位置参数后面
  • **参数只能出现在最后一个参数
  • 在*参数后面仍然可以定义其他参数

3. 强制使用关键字参数传递

将强制关键字参数放到某个*参数或者单个*后面

很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。考虑下如下一个函数调用

1
msg = recv(1024, False)

如果调用者对recv函数并不是很熟悉,那他肯定不明白那个False参数到底来干嘛用的。 但是,如果代码变成下面这样子的话就清楚多了

1
msg = recv(1024, block=False)

另外,使用强制关键字参数也会比使用**kwargs参数更好,因为在使用函数help的时候输出也会更容易理解

4. 函数参数增加元信息

  • 函数注解只存储在函数的__annotations__ 属性中
  • help()也能查看元信息

5. 默认参数的函数

  • 首先,默认参数的值仅仅在函数定义的时候赋值一次
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> x = 42
    >>> def spam(a, b=x):
    ... print(a, b)
    ...
    >>> spam(1)
    1 42
    >>> x = 23 # Has no effect
    >>> spam(1)
    1 42
  • 默认参数的值应该是不可变的对象,比如None、True、False、数字或字符串
    • 当默认值在其他地方被修改后你将会遇到各种麻烦。这些修改会影响到下次调用这个函数时的默认值

6. 访问闭包中定义的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def sample():
n = 0
# Closure function
def func():
print('n=', n)

# Accessor methods for n
def get_n():
return n

def set_n(value):
nonlocal n
n = value

# Attach as function attributes
func.get_n = get_n
func.set_n = set_n
return func

>>> f = sample()
>>> f()
n= 0
>>> f.set_n(10)
>>> f()
n= 10
>>> f.get_n()
10
>>>
  • nonlocal 声明可以让我们编写函数来修改内部变量的值
  • 函数属性允许我们用一种很简单的方式将访问方法绑定到闭包函数上
  • 相比于类, 闭包更快是因为不会涉及到额外的self变量
  • Cookbook
  • Program Language
  • Python
  • Cookbook
Python入门-1
Python方法:实例、类、静态和抽象
  1. 1. 1. 函数
    1. 1.1. 2. 接受任意数量参数
    2. 1.2. 3. 强制使用关键字参数传递
    3. 1.3. 4. 函数参数增加元信息
    4. 1.4. 5. 默认参数的函数
    5. 1.5. 6. 访问闭包中定义的变量
© 2024 何决云 载入天数...