函数应用实战
实例1:随机验证码
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:判断素数
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:最大公约数和最小公倍数
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:数据统计函数
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:双色球函数化
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等模块,优先复用