学径XUEJING · 个人学习平台通知设置

课程库 AI 主线 Python 进阶语法 › 第 4

作用域与模块 —— import 在干什么

普通课55 分钟

本课导读

两个"一直在用但没细想"的问题,今天说清楚:函数里的变量和外面的变量是什么关系(作用域),以及import 一行字背后发生了什么(模块)。学完后你能避开"函数里改了变量、外面却没变"的经典懵圈,还能打开 Python 自带的百宝箱——标准库,用现成的轮子干活。预计 55 分钟。

一、作用域:变量的"活动范围"

先看一个新手必懵的现象:

Python

为什么?因为函数内部是一个独立的小房间

  • 在函数里赋值的变量是局部变量——只在房间里存在,函数一结束就消失
  • 函数外的变量是全局变量——函数里可以它,但一旦你在函数里给同名变量赋值,Python 就当你要新建一个局部的,跟外面那个从此是两个人
Python

提示

类比记忆:函数是会议室——里面白板上写的东西(局部变量)散会即擦;走廊公告栏(全局变量)大家都能,但你在会议室白板上写个同名标题,改的只是白板,公告栏不动。

说明

那想在函数里真正修改全局变量怎么办?Python 有 global 关键字,但先别用——依赖它的代码难测试、难排查,是公认的坏味道。正确姿势是你已经会的:参数进,return 出。函数需要什么就传给它,改完的结果 return 回来,由调用方决定放哪。数据流向清清楚楚。

Python

二、import:请外援进场

你写的函数是"自家功夫",但很多活儿早有人写好了——Python 自带一大批模块(module):每个模块就是一包写好的函数和工具。import 就是把这包工具请进场:

Python

import math 之后,用里面的东西都要带前缀 math.——好处是一眼看出 sqrt 是谁家的。三种常见姿势:

Python
  • import 模块:整包进场,用时带前缀——默认首选
  • from 模块 import 名字:单点引进,直呼其名——常用函数偷个懒
  • import 模块 as 别名:起外号——将来 import pandas as pd 就是这个姿势,pd 是全行业的默契

提示

类比记忆:import 像请外援团队进驻。整包 import 是"整队进场,工牌前缀区分";from...import 是"只借一位专家,直接喊名字";as 是"名字太长,全公司统一叫他外号"。

三、标准库巡礼:三件常用兵器

Python 自带的模块统称标准库,"自带电池"说的就是它。先认识三件高频兵器:

Python
Python

还有一件你已经用过而不自知:math。这三件记不全没关系——标准库的正确用法不是背,而是"遇到需求先搜一句:Python 标准库能做 X 吗",多数时候答案是能。

说明

模块的另一半故事:你自己的代码也能拆成多个 .py 文件互相 import——这是工程化的起点。但它需要真正的本地文件系统,我们留到 U1.4 本地环境课再实操。现在只需记住:import 的东西,本质上就是别人(或你自己)写好的 .py 文件

✍️ 练习

练习 1:读代码,判输出

先心算下面代码的输出,再运行验证。想想为什么。

Python
✅ 参考答案

输出"函数里:局部的阿杰"、"函数外:全局的小雨"。函数里的赋值创建了一个局部的 name(会议室白板),外面的全局 name(公告栏)没被碰过。

练习 2:抽奖器

行政小美要办抽奖:从报名列表里随机抽 1 位一等奖;再掷一个 1-6 的骰子决定奖品编号。用 random 模块完成。

Python
✅ 参考答案
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 日还有几天。

Python
💡 提示

函数里构造两个 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)} 天")

📝 随堂测验

随堂测验0 / 5 题正确

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 给程序装上安全气囊。

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…