函数和模块
# 函数和模块
## 函数基础
函数是对"功能独立且会重复使用"的代码的封装。通过函数可以:1)减少重复代码;2)提高代码可读性;3)便于团队协作。
```python
# 定义函数
def fac(num):
"""计算num的阶乘"""
result = 1
for n in range(2, num + 1):
result *= n
return result
# 调用函数
print(fac(5)) # 120
print(fac(7)) # 5040
```
## 函数的参数
### 位置参数和关键字参数
```python
def greet(name, greeting='你好'):
print(f'{greeting}, {name}!')
greet('Alice') # 位置参数
greet(name='Bob', greeting='Hello') # 关键字参数
```
### 默认值参数
```python
def roll_dice(n=2):
"""掷n颗骰子,默认2颗"""
import random
return sum(random.randrange(1, 7) for _ in range(n))
print(roll_dice()) # 默认掷2颗
print(roll_dice(3)) # 掷3颗
```
> **注意**:默认值参数必须放在非默认值参数之后。
### 可变参数
```python
# 可变位置参数
def add(*args):
return sum(args)
print(add(1, 2, 3)) # 6
# 可变关键字参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f'{key}: {value}')
print_info(name='Alice', age=30, city='Beijing')
```
## 模块管理
### 什么是模块
每个 `.py` 文件就是一个模块,模块可以避免命名冲突:
`module1.py`:
```python
def foo():
print('hello')
```
`module2.py`:
```python
def foo():
print('goodbye')
```
`main.py`:
```python
import module1
import module2
module1.foo() # hello
module2.foo() # goodbye
```
### 导入方式
```python
import math # 导入整个模块
from math import factorial # 导入特定函数
from math import factorial as f # 导入并取别名
from math import * # 导入所有(不推荐)
```
## 常用内置函数
| 函数 | 说明 |
|------|------|
| `abs(x)` | 绝对值 |
| `max(iterable)` | 最大值 |
| `min(iterable)` | 最小值 |
| `sum(iterable)` | 求和 |
| `len(thing)` | 长度 |
| `pow(x, y)` | x 的 y 次方 |
| `round(x, n)` | 四舍五入保留 n 位小数 |
| `type(obj)` | 对象类型 |
| `isinstance(obj, type)` | 类型判断 |
| `input(prompt)` | 读取输入 |
| `print(*args)` | 打印输出 |
## 总结
- 函数用 `def` 定义,`return` 返回值,无 `return` 返回 `None`
- 参数类型:位置参数、关键字参数、默认值参数、可变参数
- 用模块管理函数,避免命名冲突
- Python 标准库提供了大量模块,优先使用现成实现(不要重复发明轮子)