1
0
wiki/docs/开发/Python/函数.md
2022-02-10 17:58:49 +08:00

140 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
```