今天这篇推文,我们一起从零出发,快速摸清Python最常用的基础:从变量、数据类型、条件语句、循环到函数、列表推导式、生成器、文件操作、异常处理、类与对象、模块和递归。不走弯路,边学边练,学完就能写点小工具!
1. 变量与数据类型:装东西的“盒子”和它们的“材质”
Python里的变量就是给数据起个名字。Python是动态类型语言,变量不需要事先声明类型,赋值就能用。常见数据类型有:int(整数)、float(浮点数)、str(字符串)、bool(布尔)、list(列表)、dict(字典)等。
复制代码
# 变量与数据类型示例
age = 18# int 整数
height = 1.75# float 浮点数
name = "Alice"# str 字符串
is_student = True# bool 布尔值
scores = [95, 88, 76] # list 列表
user = {"id": 1, "name": "Alice"} # dict 字典
print(type(age), type(name)) # 输出变量的类型
运行结果(示意):会打印类似 <class ‘int’> <class ‘str’>。
小贴士:
- 变量名建议用小写加下划线,如 user_name。不要用保留字(如 if、for)。
- 不同类型之间计算要注意,比如字符串不能和数字直接相加。
练习题:
- 创建一个字典,里面包含你的姓名、年龄、城市。打印出来,并打印每个字段的类型。
注意事项:
- 除法区分:
/ 是浮点除法,// 是地板除(向下取整)。
2. 条件语句与循环:代码的“选择”和“重复做”
条件语句用来做判断分支,循环用来重复执行一段代码。
复制代码
# 条件语句与循环示例:计算 1~100 的偶数和
total = 0
for n inrange(1, 101): # range(1, 101) 代表 1 到 100
if n % 2 == 0: # 条件语句,判断是否是偶数
total += n
print("偶数和:", total)
# while 循环示例:找出第一个能被 7 整除的三位数
x = 100
while x < 1000:
if x % 7 == 0:
print("第一个三位且能被7整除的数:", x)
break
x += 1
运行结果(示意):偶数和是 2550;第二段会打印 105。
小贴士:
- Python 用缩进表示代码块,统一使用4个空格,别混用Tab。
- for 循环常搭配
range;while 循环注意终止条件,避免死循环。
练习题:
- 用 for 循环和 if,数一数 1~200 中能被 3 或 5 整除的数有多少个。
3. 函数与 lambda函数:把逻辑“打包”,随时调用
函数是把一段逻辑封装成可重复使用的模块。lambda函数是简化写法的小函数,常用在简单传参场景,比如排序的键函数。
复制代码
# 定义一个函数:计算列表平均值
defavg(nums):
"""返回列表的平均值"""
ifnot nums:
return0
returnsum(nums) / len(nums)
print(avg([10, 20, 30])) # 输出 20.0
# lambda 函数:对字典列表按 age 排序
people = [{"name": "A", "age": 23}, {"name": "B", "age": 18}]
people_sorted = sorted(people, key=lambda p: p["age"])
print(people_sorted) # 输出按 age 升序的列表
运行结果(示意):平均值 20.0;排序后 B 在前 A 在后。
注意事项:
- 函数参数的默认值不要使用可变对象(如列表、字典),容易踩坑。
复制代码
defbad_append(item, bucket=[]): # 不推荐
bucket.append(item)
return bucket
这会导致多次调用共享同一个列表。正确写法:
复制代码
defgood_append(item, bucket=None):
if bucket isNone:
bucket = []
bucket.append(item)
return bucket
练习题:
- 写一个函数
is_palindrome(s),判断字符串是否回文(正反一样)。
4. 列表推导式与生成器:又快又省心的“数据流水线”
列表推导式是快速生成列表的语法,读起来像“我想要某种规则生成的列表”。生成器(generator)则是“懒加载”的数据流,按需产出,省内存。
复制代码
# 列表推导式:平方+过滤偶数
squares_even = [x*x for x inrange(10) if x % 2 == 0]
print(squares_even) # [0, 4, 16, 36, 64]
# 生成器函数:斐波那契数列
deffib(n):
"""产出前 n 个斐波那契数"""
a, b = 0, 1
for _ inrange(n):
yield a # 使用 yield 定义生成器
a, b = b, a + b
for num in fib(5):
print(num, end=" ") # 0 1 1 2 3
小贴士:
- 列表推导式适合简单场景;复杂逻辑不要硬塞进去,影响可读性。
练习题:
- 用列表推导式生成 1~50 中能被 3 整除的数的立方列表。
5. 文件操作与异常处理:数据落地与错误兜底
文件操作让我们读写磁盘上的文件;异常处理(try/except)让程序在出错时有优雅的处理方式。
复制代码
# 写文件
data = ["Alice 95", "Bob 88", "Cindy 76"]
withopen("scores.txt", "w", encoding="utf-8") as f: # with 会自动关闭文件
for line in data:
f.write(line + "\n")
# 读文件 + 异常处理:计算总分
total = 0
try:
withopen("scores.txt", "r", encoding="utf-8") as f:
for line in f:
# 拆分并取分数部分
name, score = line.strip().split()
total += int(score)
print("总分:", total)
except FileNotFoundError:
print("文件不存在,请检查路径")
except ValueError:
print("数据格式有误,请检查内容")
finally:
print("处理完成")
运行结果(示意):打印总分 259,并打印“处理完成”。
小贴士:
- 尽量捕获具体异常类型(如 FileNotFoundError、ValueError),不要一上来就 except Exception。
练习题:
- 从一个文本文件中读取每行数字,求平均值;若遇到非数字行,跳过并记录到另一个日志文件。
6. 类与对象:把数据和行为“打包”在一起
**类(class)**定义一种数据结构和它的行为,**对象(object)**是类的实例。用类可以更好地组织代码。
复制代码
classBankAccount:
"""简单的银行账户类"""
def__init__(self, owner, balance=0):
self.owner = owner
self.balance = balance # 属性
defdeposit(self, amount):
if amount <= 0:
raise ValueError("存款必须为正数")
self.balance += amount
defwithdraw(self, amount):
if amount > self.balance:
raise ValueError("余额不足")
self.balance -= amount
def__repr__(self):
returnf"<BankAccount owner={self.owner} balance={self.balance}>"
acct = BankAccount("Alice", 100)
acct.deposit(50)
acct.withdraw(30)
print(acct) # <BankAccount owner=Alice balance=120>
小贴士:
练习题:
- 写一个
TodoList 类,支持 add、remove、list_all,并把任务保存到文件。
7. 模块与包:代码的“分层收纳箱”
**模块(module)**就是一个 .py 文件,**包(package)**是包含 __init__.py 的文件夹。把功能拆成模块,便于维护和复用。
复制代码
# 使用标准库模块
import math
from random import randint
print(math.sqrt(16)) # 4.0
print(randint(1, 10)) # 输出 1~10 的随机整数
# 入口判断:仅当本文件直接运行时执行
defmain():
print("我是主程序入口")
if __name__ == "__main__":
main()
小贴士:
- 自己写的模块名别与标准库冲突(比如叫 random.py 会出问题)。
- 想分享给别人用,可以了解下虚拟环境和依赖管理(如 venv、pip)。
练习题:
- 新建一个 utils.py,封装常用函数;在主程序里导入并调用。
8. 递归:自己调用自己的函数
递归是函数调用自身的技巧,适合分而治之的场景。关键是有明确的“终止条件”。
复制代码
# 递归求 n!(阶乘)
deffactorial(n):
if n < 0:
raise ValueError("n 不能为负数")
if n == 0or n == 1: # 终止条件
return1
return n * factorial(n - 1)
print(factorial(5)) # 120
注意事项:
- 递归深度过大可能导致栈溢出(RecursionError),可改写为循环或使用生成器。
- 有些问题(如斐波那契)递归会重复计算,需配合记忆化或改迭代。
练习题:
常见坑速记
- 浮点数有精度误差,金额计算尽量用
decimal。 - 列表、字典是可变对象,作为参数传递会“原地修改”,需要时做副本
copy() 或切片 [:]。 - 打印调试多用
print() 或 pprint(结构化输出),逐步验证每一步结果。
学习小技巧
- 把常用片段建立“代码小抄”,比如文件读取模板、异常处理模板。
- 刻意练习:把今天学的内容写成一个小脚本,比如“批量重命名文件”、“简单计时器”。
总结
今天我们用通俗的方式串了一遍Python基础:用变量装数据,理解数据类型;用条件语句做选择、用循环做重复;用函数和lambda函数封装逻辑;用列表推导式和生成器优雅地产生数据;用文件操作和异常处理让程序更可靠;再到类与对象组织代码,以及模块的拆分;最后一瞥递归的思维方式。建议大家把每个小节的练习都动手做一遍,效果立竿见影。
小伙伴们,今天的Python学习之旅就到这里啦! 记得动手敲代码,有问题随时在评论区问XXX哦。祝大家学习愉快,Python学习节节高!