Python 零基础教程

Python 内置模块

Python 标准库(Standard Library)是一个庞大的预编写模块集合,它为各种各样的编程任务提供了现成的功能。你不必从头开始为常见的操作编写代码,只需导入并使用这些模块即可,这能节省大量的时间和精力。

本章将为你介绍标准库中三个不可或缺的模块:mathdatetimerandom。这三个模块分别用于在 Python 程序中执行数学计算、操作日期和时间以及生成随机数。

1. 模块与导入回顾

在深入探讨具体的模块之前,让我们先回顾一下什么是模块以及如何导入它们。正如你在上一课中学到的,模块就是一个包含 Python 定义和语句的文件。模块允许你将代码组织成可复用的组件,从而提升代码的模块化和可维护性。

要使用一个模块,你需要使用 import 语句导入它。以下是几种常见的方法:

  • import 模块名: 导入整个模块。然后你需要使用点号语法(例如 模块名.函数名)来访问其函数和变量。
import math
# 计算 16 的平方根
result = math.sqrt(16)
print(result)  # 输出: 4.0
  • from 模块名 import 特定项: 仅导入模块中的特定函数或变量。之后你可以直接使用它,无需点号语法。
from math import sqrt
# 计算 25 的平方根
result = sqrt(25)
print(result)  # 输出: 5.0
  • from 模块名 import *: 导入模块中的所有项。虽然方便,但通常不推荐这种做法,因为它容易导致命名空间冲突,并使代码难以理解。
from math import *
# 计算 pi 的值
result = pi
print(result)  # 输出: 3.141592653589793
  • import 模块名 as 别名: 使用不同的名称(别名)导入模块。这在缩短长模块名或解决命名冲突时非常有用。
import datetime as dt
# 获取当前日期和时间
now = dt.datetime.now()
print(now)  # 输出当前的日期和时间

2. math 模块:数学函数

math 模块提供了广泛的数学函数,包括三角函数、对数函数、指数函数和舍入函数。它还定义了一些有用的数学常量,如 pie

2.1 常量

  • math.pi: 代表数学常数圆周率 (π),约等于 3.14159。
  • math.e: 代表数学常数自然对数的底数 (e,欧拉数),约等于 2.71828。
import math
print(math.pi)  # 输出: 3.141592653589793
print(math.e)   # 输出: 2.718281828459045

示例:计算圆的周长:

import math
radius = 5
circumference = 2 * math.pi * radius
print(circumference)  # 输出: 31.41592653589793

2.2 基础算术函数

  • math.ceil(x): 向上取整,返回大于或等于 x 的最小整数。
  • math.floor(x): 向下取整,返回小于或等于 x 的最大整数。
  • math.fabs(x): 返回 x 的绝对值(浮点数形式)。
  • math.factorial(x): 返回 x 的阶乘。如果 x 不是整数或为负数,则引发 ValueError
  • math.fmod(x, y): 返回 x / y 的浮点数余数。
import math
print(math.ceil(4.2))     # 输出: 5
print(math.floor(4.8))    # 输出: 4
print(math.fabs(-5.5))    # 输出: 5.5
print(math.factorial(5))  # 输出: 120 (即 5*4*3*2*1)
print(math.fmod(10.5, 3)) # 输出: 1.5

示例:计算总天数能转换成多少个完整的星期:

import math
days = 20
weeks = math.floor(days / 7)
print(weeks)  # 输出: 2

2.3 指数与对数函数

  • math.exp(x): 返回 e 的 x 次幂 ($e^x$)。
  • math.log(x[, base]): 返回以 base 为底 x 的对数。如果未指定 base,则返回自然对数(以 e 为底)。
  • math.log10(x): 返回以 10 为底 x 的对数。
  • math.pow(x, y): 返回 xy 次幂 ($x^y$)。(注意:对于简单的幂运算,通常更推荐使用 ** 运算符)。
  • math.sqrt(x): 返回 x 的平方根。
import math
print(math.exp(2))      # 输出: 7.38905609893065
print(math.log(10))     # 输出: 2.302585092994046
print(math.log(10, 2))  # 输出: 3.3219280948873626 (以2为底)
print(math.log10(100))  # 输出: 2.0
print(math.pow(2, 3))   # 输出: 8.0
print(math.sqrt(25))    # 输出: 5.0

示例:计算复利:

import math
principal = 1000  # 本金
rate = 0.05       # 利率
time = 5          # 时间(年)
amount = principal * math.pow((1 + rate), time)
print(amount)  # 输出: 1276.2815625000004

2.4 三角函数

  • math.sin(x): 返回 x 的正弦值(x 需为弧度)。
  • math.cos(x): 返回 x 的余弦值(x 需为弧度)。
  • math.tan(x): 返回 x 的正切值(x 需为弧度)。
  • math.asin(x), math.acos(x), math.atan(x): 分别返回反正弦、反余弦和反正切值(结果为弧度)。
  • math.degrees(x): 将角度 x 从弧度转换为度数。
  • math.radians(x): 将角度 x 从度数转换为弧度。
import math
angle_radians = math.pi / 2  # 90 度
print(math.sin(angle_radians))     # 输出: 1.0
print(math.cos(angle_radians))     # 输出: 6.123233995736766e-17 (极小值,近似于 0)
print(math.degrees(angle_radians)) # 输出: 90.0

示例:将度数转换为弧度并计算正弦值:

import math
angle_degrees = 60
angle_radians = math.radians(angle_degrees)
sine_value = math.sin(angle_radians)
print(sine_value)  # 输出: 0.8660254037844386

(注:math 模块还包含双曲函数如 sinh, cosh 等,通常用于科学和工程计算中。)

3. datetime 模块:日期和时间操作

datetime 模块提供了处理日期、时间和时间间隔的类。它对于记录事件日志、调度任务以及计算持续时间等任务至关重要。

3.1 核心类

  • datetime.date: 表示一个日期(年、月、日)。
  • datetime.time: 表示一个时间(时、分、秒、微秒)。
  • datetime.datetime: 表示日期和时间的组合。
  • datetime.timedelta: 表示两个日期或时间之间的持续时间或差值。

3.2 创建日期和时间对象

  • datetime.date(year, month, day): 创建一个 date 对象。
  • datetime.time(hour, minute, second, microsecond): 创建一个 time 对象。
  • datetime.datetime(year, month, day, hour, minute, second, microsecond): 创建一个 datetime 对象。
  • datetime.datetime.now(): 返回表示当前日期和时间的 datetime 对象。
  • datetime.date.today(): 返回表示当前日期的 date 对象。
import datetime

# 创建一个 date 对象
d = datetime.date(2023, 10, 27)
print(d)  # 输出: 2023-10-27

# 创建一个 time 对象
t = datetime.time(10, 30, 0)
print(t)  # 输出: 10:30:00

# 创建一个 datetime 对象
dt = datetime.datetime(2023, 10, 27, 10, 30, 0)
print(dt)  # 输出: 2023-10-27 10:30:00

# 获取当前日期和时间
now = datetime.datetime.now()
print(now)  # 输出当前的日期和时间

3.3 访问日期和时间组件

你可以使用属性来访问日期和时间对象的各个组成部分:

  • year (年), month (月), day (日)
  • hour (时), minute (分), second (秒), microsecond (微秒)
  • weekday(): 返回星期几(整数形式),星期一为 0,星期日为 6。
  • isoweekday(): 返回星期几(整数形式),星期一为 1,星期日为 7。
import datetime
now = datetime.datetime.now()

print(now.year)      # 输出: 当前年份
print(now.month)     # 输出: 当前月份
print(now.day)       # 输出: 当前日期
print(now.hour)      # 输出: 当前小时
print(now.minute)    # 输出: 当前分钟
print(now.weekday())   # 输出: 星期几 (0-6)
print(now.isoweekday())# 输出: 星期几 (1-7)

3.4 timedelta 对象:日期和时间的算术运算

timedelta 对象表示两个日期或时间之间的差值。你可以使用它来对日期和时间执行加减运算。
语法:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

import datetime

# 创建一个表示 1 天的 timedelta 对象
one_day = datetime.timedelta(days=1)

# 获取今天的日期
today = datetime.date.today()

# 计算明天的日期
tomorrow = today + one_day
print("明天:", tomorrow)

# 计算 1 周前的日期
one_week_ago = today - datetime.timedelta(weeks=1)
print("一周前:", one_week_ago)

3.5 格式化日期和时间:strftime 与 strptime

  • strftime(format): 将 datetimedatetime 对象格式化(转换)为字符串,格式由参数指定。
  • strptime(date_string, format): 将表示日期和时间的字符串解析(转换)为 datetime 对象,格式由参数指定。

常用格式化代码:

  • %Y: 带有世纪的年份(例如 2023)
  • %m: 补零的十进制月份(01-12)
  • %d: 补零的十进制日(01-31)
  • %H: 24 小时制的小时(00-23)
  • %M: 分钟(00-59)
  • %S: 秒(00-59)
import datetime
now = datetime.datetime.now()

# 将 datetime 对象格式化为字符串
formatted_datetime = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_datetime)  # 输出示例: 2023-10-27 14:30:00

# 将字符串解析为 datetime 对象
date_string = "2023-11-15"
parsed_date = datetime.datetime.strptime(date_string, "%Y-%m-%d")
print(parsed_date)  # 输出: 2023-11-15 00:00:00

示例:通过出生日期计算年龄:

import datetime
birthdate_str = "1990-05-10"
birthdate = datetime.datetime.strptime(birthdate_str, "%Y-%m-%d").date()
today = datetime.date.today()

# 使用布尔值相减技巧:如果今年还没过生日,(today.month, today.day) < (birthdate.month, birthdate.day) 为 True(1),年龄减 1
age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day))
print("年龄:", age)

4. random 模块:随机数生成

random 模块提供了生成伪随机数的函数。这些数字并非绝对真正的随机,但对于大多数应用(如模拟、游戏和数据抽样)来说,其统计学上的随机性已经足够了。

4.1 基础随机数函数

  • random.random(): 返回一个 0.0(包含)到 1.0(不包含)之间的随机浮点数。
  • random.randint(a, b): 返回一个 a(包含)到 b(包含)之间的随机整数。
  • random.uniform(a, b): 返回一个 a(包含)到 b(包含)之间的随机浮点数。
import random
print(random.random())        # 输出: 0.0 到 1.0 之间的浮点数
print(random.randint(1, 10))  # 输出: 1 到 10 之间的整数
print(random.uniform(1, 10))  # 输出: 1 到 10 之间的浮点数

示例:模拟抛硬币:

import random
if random.random() < 0.5:
    print("正面 (Heads)")
else:
    print("反面 (Tails)")

4.2 序列相关的函数

  • random.choice(sequence): 从给定的序列(如列表或元组)中返回一个随机元素。
  • random.shuffle(sequence): 就地打乱序列的元素(直接修改原序列,无返回值)。
  • random.sample(population, k): 从 population 序列中返回一个长度为 k 的包含唯一元素的列表。用于无放回的随机抽样。
import random
my_list = [1, 2, 3, 4, 5]

print(random.choice(my_list))  # 输出: 列表中的一个随机元素

random.shuffle(my_list)
print(my_list)  # 输出: 打乱顺序后的列表

print(random.sample(my_list, 3))  # 输出: 包含 3 个唯一随机元素的列表

示例:抽取彩票号码:

import random
numbers = list(range(1, 50))  # 1 到 49 的数字列表
winning_numbers = random.sample(numbers, 6)
print("中奖号码:", winning_numbers)  # 输出 6 个不重复的随机数

4.3 设置随机数种子 (Seed)

random 模块使用的是伪随机数生成器。为了确保你每次运行代码时都能得到相同的随机数序列(这在测试和调试时非常有用),你可以使用 random.seed() 函数来设置种子。

  • random.seed(x): 使用给定的种子值 x 初始化随机数生成器。如果不提供种子,则默认使用当前的系统时间。
import random

# 设置随机数种子
random.seed(42)

# 生成一些随机数
print("第一次生成:", random.random())
print("第一次生成:", random.randint(1, 10))

# 使用相同的值再次设置种子
random.seed(42)

# 将生成与上面完全相同的随机数
print("第二次生成:", random.random())
print("第二次生成:", random.randint(1, 10))