函数让我们把代码分成多个小任务,模块则让我们把一个较大的程序分成多个文件。
在拆分之前,需要先弄清楚:变量在哪里可以使用?
在函数内部创建的变量通常是局部变量,只能在函数内部使用:
def calculate_total():
price = 100
quantity = 3
total = price * quantity
print(total)
calculate_total()
如果在函数外访问 total:
print(total)
程序会出现 NameError,因为函数外部看不到这个局部变量。
二、全局变量
在函数外创建的变量叫全局变量:
tax_rate = 0.06
def calculate_tax(price):
return price * tax_rate
函数可以读取全局变量,但不建议在函数中随意修改它。更清晰的方式是通过参数传入:
def calculate_tax(price, tax_rate):
return price * tax_rate
这样函数需要什么数据一目了然,也更方便测试。
三、同名变量不会互相替代
name = "Linda"
def show_name():
name = "Python"
print(f"函数内部:{name}")
show_name()
print(f"函数外部:{name}")
输出:
函数内部:Python
函数外部:Linda
函数内部的 name 与外部的 name 位于不同作用域。
四、导入标准库
Python 自带许多可以直接使用的模块,称为标准库。
导入整个模块:
import math
print(math.sqrt(16))
print(math.pi)
只导入需要的内容:
from math import sqrt
print(sqrt(16))
使用别名:
import random as rd
print(rd.randint(1, 10))
初学阶段更推荐 import 模块名,因为能清楚看出函数来自哪个模块。
五、random 模块
生成随机整数:
import random
number = random.randint(1, 100)
print(number)
从列表中随机选择一个元素:
names = ["Linda", "小明", "小红"]
winner = random.choice(names)
print(winner)
打乱列表:
random.shuffle(names)
print(names)
六、创建自己的模块
新建 calculator.py:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
在同一文件夹中新建 main.py:
import calculator
print(calculator.add(10, 5))
print(calculator.subtract(10, 5))
一个文件就是一个模块。把计算逻辑与主程序分开,项目会更容易维护。
七、主程序入口
你可能会看到这种写法:
if __name__ == "__main__":
print("程序从这里开始运行")
当文件被直接运行时,这段代码会执行;当文件被其他模块导入时,它不会自动执行。
现阶段不必死记,只需要知道它常用于区分“直接运行”和“被导入”。
基础练习
- 3. 使用
random.randint() 模拟掷骰子。 - 4. 使用
random.choice() 从名单中随机选人。 - 5. 把两个计算函数放进独立模块,再从主程序导入。
今日项目:模块化随机抽奖器
创建 lottery.py:
import random
def choose_winners(names, winner_count=1):
if winner_count > len(names):
return []
return random.sample(names, winner_count)
创建 main.py:
import lottery
names = ["Linda", "小明", "小红", "小刚", "小美"]
winner_count = int(input("请输入获奖人数:"))
winners = lottery.choose_winners(names, winner_count)
if len(winners) == 0:
print("获奖人数不能超过参与人数")
else:
print("获奖名单:")
for winner in winners:
print(winner)
查漏测试
- 3.
import math 与 from math import sqrt 有什么区别? - 5.
if __name__ == "__main__" 有什么作用?
模块化的目标不是把文件拆得越多越好,而是让每个文件承担清楚的职责。