课程库 › AI 主线 › Python 进阶语法 › 第 4 课
作用域与模块 —— import 在干什么
普通课约 55 分钟
本课导读
两个"一直在用但没细想"的问题,今天说清楚:函数里的变量和外面的变量是什么关系(作用域),以及import 一行字背后发生了什么(模块)。学完后你能避开"函数里改了变量、外面却没变"的经典懵圈,还能打开 Python 自带的百宝箱——标准库,用现成的轮子干活。预计 55 分钟。
一、作用域:变量的"活动范围"
先看一个新手必懵的现象:
为什么?因为函数内部是一个独立的小房间:
- 在函数里赋值的变量是局部变量——只在房间里存在,函数一结束就消失
- 函数外的变量是全局变量——函数里可以读它,但一旦你在函数里给同名变量赋值,Python 就当你要新建一个局部的,跟外面那个从此是两个人
提示
类比记忆:函数是会议室——里面白板上写的东西(局部变量)散会即擦;走廊公告栏(全局变量)大家都能看,但你在会议室白板上写个同名标题,改的只是白板,公告栏不动。
说明
那想在函数里真正修改全局变量怎么办?Python 有 global 关键字,但先别用——依赖它的代码难测试、难排查,是公认的坏味道。正确姿势是你已经会的:参数进,return 出。函数需要什么就传给它,改完的结果 return 回来,由调用方决定放哪。数据流向清清楚楚。
二、import:请外援进场
你写的函数是"自家功夫",但很多活儿早有人写好了——Python 自带一大批模块(module):每个模块就是一包写好的函数和工具。import 就是把这包工具请进场:
import math 之后,用里面的东西都要带前缀 math.——好处是一眼看出 sqrt 是谁家的。三种常见姿势:
import 模块:整包进场,用时带前缀——默认首选from 模块 import 名字:单点引进,直呼其名——常用函数偷个懒import 模块 as 别名:起外号——将来import pandas as pd就是这个姿势,pd 是全行业的默契
提示
类比记忆:import 像请外援团队进驻。整包 import 是"整队进场,工牌前缀区分";from...import 是"只借一位专家,直接喊名字";as 是"名字太长,全公司统一叫他外号"。
三、标准库巡礼:三件常用兵器
Python 自带的模块统称标准库,"自带电池"说的就是它。先认识三件高频兵器:
还有一件你已经用过而不自知:math。这三件记不全没关系——标准库的正确用法不是背,而是"遇到需求先搜一句:Python 标准库能做 X 吗",多数时候答案是能。
说明
模块的另一半故事:你自己的代码也能拆成多个 .py 文件互相 import——这是工程化的起点。但它需要真正的本地文件系统,我们留到 U1.4 本地环境课再实操。现在只需记住:import 的东西,本质上就是别人(或你自己)写好的 .py 文件。
✍️ 练习
练习 1:读代码,判输出
先心算下面代码的输出,再运行验证。想想为什么。
✅ 参考答案
输出"函数里:局部的阿杰"、"函数外:全局的小雨"。函数里的赋值创建了一个局部的 name(会议室白板),外面的全局 name(公告栏)没被碰过。
练习 2:抽奖器
行政小美要办抽奖:从报名列表里随机抽 1 位一等奖;再掷一个 1-6 的骰子决定奖品编号。用 random 模块完成。
✅ 参考答案
import random
players = ["小雨", "阿杰", "老王", "丽丽", "小陈", "大壮"]
winner = random.choice(players)
prize = random.randint(1, 6)
print(f"一等奖:{winner},获得 {prize} 号奖品")
练习 3:倒计时函数(挑战)
写函数 days_until(year, month, day):返回从 2026 年 7 月 8 日到指定日期还有多少天。用它算算到 2026 年 12 月 31 日还有几天。
💡 提示
函数里构造两个 date,相减得到的结果有 .days 属性,把它 return 出来。
✅ 参考答案
from datetime import date
def days_until(year, month, day):
today = date(2026, 7, 8)
target = date(year, month, day)
return (target - today).days
print(f"距离年底还有 {days_until(2026, 12, 31)} 天")
📝 随堂测验
1. x = 5,函数里执行 x = 10 后,函数外的 x 是多少?
2. 函数里“只读取”全局变量(不赋值),会怎样?
3. import random 之后,正确的调用写法是?
4. from math import sqrt 和 import math 的区别是?
5. import pandas as pd 里的 as 是在做什么?
本课小结
- 作用域:函数内赋值 = 局部变量(散会即擦);读全局可以,改全局别用 global——参数进,return 出
import 模块整包进场带前缀(默认首选);from ... import ...单点直呼;as起别名(pandas as pd 是行业默契)- 标准库 = Python 自带的百宝箱:math(数学)、random(随机)、datetime(日期)先混脸熟
- 遇到需求先问一句"标准库能做吗",再动手造轮子
下一课直面每个程序员的日常——报错。学会读 traceback、用 try/except 给程序装上安全气囊。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…