函数应用实战
# 函数应用实战
## 实例1:随机验证码
```python
import random
import string
ALL_CHARS = string.digits + string.ascii_letters
def generate_code(*, code_len=4):
"""生成指定长度的随机验证码"""
return ''.join(random.choices(ALL_CHARS, k=code_len))
# 测试
for _ in range(5):
print(generate_code()) # 默认4位
print(generate_code(code_len=6)) # 指定6位
```
> `string.digits` = `'0123456789'`
> `string.ascii_letters` = 所有英文字母
## 实例2:判断素数
```python
def is_prime(num: int) -> bool:
"""判断一个数是否为素数"""
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
```
> **技巧**:只需检查到 √n,因子是成对出现的。
## 实例3:最大公约数和最小公倍数
```python
def gcd(x: int, y: int) -> int:
"""欧几里得算法求最大公约数"""
while y % x != 0:
x, y = y % x, x
return x
def lcm(x: int, y: int) -> int:
"""最小公倍数"""
return x * y // gcd(x, y)
```
## 实例4:数据统计函数
```python
def mean(data):
"""算术平均数"""
return sum(data) / len(data)
def median(data):
"""中位数"""
temp = sorted(data)
n = len(temp)
if n % 2 == 0:
return (temp[n//2 - 1] + temp[n//2]) / 2
return temp[n // 2]
def variance(data, ddof=1):
"""方差(ddof=1为样本方差,ddof=0为总体方差)"""
x_bar = mean(data)
return sum((x - x_bar) ** 2 for x in data) / (len(data) - ddof)
def std(data, ddof=1):
"""标准差"""
return variance(data, ddof) ** 0.5
def describe(data):
"""输出描述性统计"""
print(f'均值: {mean(data):.2f}')
print(f'中位数: {median(data):.2f}')
print(f'标准差: {std(data):.2f}')
```
## 实例5:双色球函数化
```python
import random
RED_BALLS = list(range(1, 34))
BLUE_BALLS = list(range(1, 17))
def choose():
"""生成一组双色球号码"""
reds = sorted(random.sample(RED_BALLS, 6))
blue = random.choice(BLUE_BALLS)
return reds, blue
def display(reds, blue):
"""格式化输出号码"""
print(' '.join(f'\033[031m{r:02d}\033[0m' for r in reds), end=' ')
print(f'\033[034m{blue:02d}\033[0m')
n = int(input('生成几注: '))
for _ in range(n):
reds, blue = choose()
display(reds, blue)
```
## 总结
- 将**重复使用的功能封装为函数**,调用时无需关注内部实现
- 函数设计原则:**单一职责**(一个函数只做一件事)、**适当的大小**(不过于冗长)
- Python 标准库已有 `statistics`、`math`、`random` 等模块,优先复用