# 函数应用实战 ## 实例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` 等模块,优先复用