用 import 复用代码
模块(module)是一个 Python 文件,其他代码可以使用它里面的名字(函数、常量、类)。import math 会加载标准库中的 math 模块,并以该名字提供给你:之后写 math.sqrt(2)。Python 自带数百个模块,以后安装的东西(如 numpy)也用同样的方式导入。把导入语句放在文件顶部,读者一眼就能看出它依赖什么。
import math
import statistics
# Use a name from a module with module.name
print(math.sqrt(252)) # 15.874507866387544
print(round(math.sqrt(252), 2)) # 15.87
returns = [0.01, -0.02, 0.015, 0.0]
print(round(statistics.stdev(returns), 4)) # 0.0155from ... import 与别名
from datetime import date 只引入一个名字,所以可以不带前缀直接写 date(2025, 1, 2)。import numpy as np 给模块起一个更短的别名,这是到处都能见到的惯例。避免使用 from module import *:它会把一堆未知名字倒进你的文件,还可能悄悄覆盖你自己的名字。优先用清晰的名字,在前缀能说明来源时保留前缀。
from datetime import date
from math import sqrt as square_root
import statistics as stats
# Only the names you asked for are imported
start = date(2025, 1, 2)
end = date(2025, 3, 3)
print((end - start).days) # 60
print(square_root(16)) # 4.0
print(stats.mean([1.0, 2.0, 3.0])) # 2.0你自己的模块
任何 .py 文件都是模块。如果 fees.py 与 main.py 放在一起并定义了 commission,那么 main.py 可以 import fees 并调用 fees.commission(...)。直接运行一个文件时,Python 会把它的 __name__ 设为 "__main__";被导入时,__name__ 是模块名。因此 if __name__ == "__main__": 这个守卫会让代码只在文件被执行时运行,导入时不运行,使演示和测试不会碍事。
# fees.py
RATE = 0.001
def commission(notional):
return notional * RATE
if __name__ == "__main__":
print(commission(10000)) # runs only with: python fees.py
# main.py (next to fees.py)
import fees
print(fees.commission(50000)) # 50.0
print(__name__) # __main__Python 在哪里查找,以及一个经典陷阱
执行 import name 时,Python 先在正在运行的脚本所在的文件夹中查找,然后是标准库和已安装的包(这个列表就是 sys.path)。第一个匹配的获胜。所以你自己的文件如果叫 random.py 或 statistics.py,就会遮住真正的模块,import random 会加载你的文件并以令人困惑的方式失败。千万不要用标准库模块的名字给自己的文件命名。还要避免两个模块在顶部互相导入(循环导入);把共用的部分移到第三个模块里。
import sys
import random
# Imported modules are remembered in sys.modules; sys.path is the search list
print("random" in sys.modules) # True
print(random.__name__) # random
print(len(sys.path) > 0) # True
# A quick tour of useful standard-library modules
import collections, datetime, itertools, pathlib
print(collections.Counter("AAPL")["A"]) # 2
print(datetime.date(2025, 1, 2).weekday()) # 3 (Thursday; Monday is 0)datetime、statistics、csv、json、collections、itertools、pathlib)。经过测试的库代码几乎总比匆忙自制的版本更安全,实验也会把手工拆解日期视为技术错误。import module然后module.name;from module import name引入单个名字;import module as short起别名。- 导入放在顶部;避免
import *。 - 不要用标准库模块名给文件命名;只应直接运行的代码放在
if __name__ == "__main__":下。
下一节:包与项目结构,如何把多个模块组织到可以干净导入的文件夹中。
实验:评分内容
- 用
daily_vol衡量波动率25 分 - 用
annualize_vol把波动率换算为年化25 分 - 用
days_between计算两个日期之间的天数25 分 - 用
is_business_day区分工作日与周末25 分