140 lines
3.6 KiB
Markdown
140 lines
3.6 KiB
Markdown
---
|
||
id: 函数定义
|
||
title: 函数定义
|
||
sidebar_position: 2.5
|
||
data: 2022年2月10日
|
||
---
|
||
|
||
通过白盒/黑盒封装多行代码的实现,一般情况下拥有输入和输出,用来**简化代码**、**重复调用**和**模块化编程**。
|
||
|
||
在 Python 中可以使用`def`关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。函数内的第一条语句是字符串时,该字符串就是**文档字符串**,也称为 docstring。
|
||
|
||
```python
|
||
def fib(n):
|
||
"""输出限定数值内的斐波那契数列函数"""
|
||
a, b = 0, 1
|
||
while a < n:
|
||
print(a, end=' ')
|
||
a, b = b, a+b
|
||
print()
|
||
```
|
||
|
||
### 默认值参数
|
||
|
||
在 Python 中,函数的参数可以有默认值,也支持使用可变参数,所以 Python 并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式。
|
||
|
||
```python
|
||
def add(a=0, b=0, c=0):
|
||
"""三个数相加"""
|
||
return a + b + c
|
||
add(1,2)
|
||
# 3
|
||
```
|
||
|
||
### 键值参数
|
||
|
||
`kwarg=value` 形式的 关键字参数 也可以用于调用函数。函数示例如下:
|
||
|
||
该函数接受一个必选参数(`voltage`)和三个可选参数(`state`, `action` 和 `type`)。
|
||
|
||
```python
|
||
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
|
||
print("-- This parrot wouldn't", action, end=' ')
|
||
print("if you put", voltage, "volts through it.")
|
||
print("-- Lovely plumage, the", type)
|
||
print("-- It's", state, "!")
|
||
|
||
parrot("halo",type="test")
|
||
|
||
# -- This parrot wouldn't voom if you put halo volts through it.
|
||
# -- Lovely plumage, the test
|
||
# -- It's a stiff !
|
||
```
|
||
|
||
### 特殊参数
|
||
|
||
#### 可变参数 *
|
||
|
||
在参数名前面的 * 表示 args 是一个可变参数,可以输入多个参数。
|
||
|
||
```python
|
||
def add2(*args):
|
||
total = 0
|
||
for val in args:
|
||
total += val
|
||
print(total)
|
||
|
||
add2(1,2,3)
|
||
# 6
|
||
```
|
||
|
||
#### 键值参数 **
|
||
|
||
在参数名前面的 ** 表示 args 是一个可变参数,可以输入键值对。
|
||
|
||
```python
|
||
def add2(**arg):
|
||
print(arg)
|
||
|
||
add2(name="halo")
|
||
# {'name': 'halo'}
|
||
```
|
||
|
||
#### 限位置参数 /
|
||
|
||
`/`必须放在形参后面表示限制位置参数,实参必须按照形参位置输入。
|
||
|
||
```python
|
||
def pos_only_arg(arg, /):
|
||
print(arg)
|
||
```
|
||
|
||
#### 限关键字参数 *
|
||
|
||
`*`必须放在形参前面表示限关键字参数,实参必须按键值参数输入。
|
||
|
||
```python
|
||
def kwd_only_arg(*, arg):
|
||
print(arg)
|
||
```
|
||
|
||
特殊参数组合
|
||
|
||
```python
|
||
def combined_example(pos_only, /, standard, *, kwd_only):
|
||
print(pos_only, standard, kwd_only)
|
||
|
||
"""
|
||
运行示例
|
||
"""
|
||
>>> combined_example(1, 2, 3)
|
||
Traceback (most recent call last):
|
||
File "<stdin>", line 1, in <module>
|
||
TypeError: combined_example() takes 2 positional arguments but 3 were given
|
||
|
||
>>> combined_example(1, 2, kwd_only=3)
|
||
1 2 3
|
||
|
||
>>> combined_example(1, standard=2, kwd_only=3)
|
||
1 2 3
|
||
|
||
>>> combined_example(pos_only=1, standard=2, kwd_only=3)
|
||
Traceback (most recent call last):
|
||
File "<stdin>", line 1, in <module>
|
||
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'
|
||
```
|
||
|
||
### Lambda 表达式
|
||
|
||
lambda 关键字用于创建小巧的匿名函数。lambda a, b: a+b 函数返回两个参数的和。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量:
|
||
|
||
```python
|
||
>>> def make_incrementor(n):
|
||
... return lambda x: x + n
|
||
...
|
||
>>> f = make_incrementor(42)
|
||
>>> f(0)
|
||
42
|
||
>>> f(1)
|
||
43
|
||
``` |