8个超实用的Python代码技巧:从变量交换到条件判断优化
最近有读者通过私信询问:“除了使用 print 进行调试之外,还有哪些好用的 Python 小技巧呢?”。今日为大家整理了 8 个极为实用的 Python 代码技巧,每一个都包含着实实在在的有用内容,建议大家将其收藏起来,然后慢慢学习!

一、变量交换还在用第三个变量?老铁你Out啦!
还在这样写变量交换吗?
# 老掉牙的写法
temp = a
a = b
b = temp
学会这招,一行代码搞定:
# 运行一下试试:
a, b = 3, 5
print(f"交换前:a={a}, b={b}")
a, b = b, a # 这行就够了!
print(f"交换后:a={a}, b={b}")
二、批量处理文件还在用for循环?列表推导式一把梭!
有一堆文本文件要改名,你可能会这么写:
# 老式写法
new_names = []
for name in files:
if name.endswith('.txt'):
new_names.append(name.replace('.txt', '.md'))
试试这个一行代码的魔法:
# 来测试一下:
files = ['笔记1.txt', '笔记2.txt', '照片.jpg']
new_names = [name.replace('.txt', '.md') for name in files if name.endswith('.txt')]
print(f"处理后的文件名:{new_names}")
三、字典取值总怕报错?dict.get()来帮你!
看到这种代码就头大:
# 容易出错的写法
try:
value = user_data['age']
except KeyError:
value = 0
一行代码搞定,还能自定义默认值:
# 实战体验:
user_data = {'name': '小明'}
age = user_data.get('age', 18) # 找不到就返回18
print(f"用户年龄:{age}")
四、用枚举类型让代码更优雅
看到这种代码就想骂人:
# 各种魔法数字,看得头晕
if user_status == 0:
print("未注册")
elif user_status == 1:
print("已注册")
elif user_status == 2:
print("已认证")
来看看优雅的写法:
from enum import Enum
class UserStatus(Enum):
UNREGISTERED = 0
REGISTERED = 1
VERIFIED = 2
# 实际使用起来很清晰
status = UserStatus.REGISTERED
print(f"用户状态:{status.name}")
五、条件判断太多?字典映射来救场!
这种代码看着就烦:
if grade >= 90:
level = "A"
elif grade >= 80:
level = "B"
elif grade >= 70:
level = "C"
else:
level = "D"
用字典映射,既优雅又高效:
# 实战测试:
grade_map = {
lambda x: x >= 90: "A",
lambda x: 80 <= x < 90: "B",
lambda x: 70 <= x < 80: "C",
lambda x: x < 70: "D"
}
def get_level(score):
从 grade_map 的键值对中,遍历每个键 k 和值 v,如果 k(score) 为真,就返回下一个值 v。
打印出("85 分的等级:" + 获取等级(85))
六、处理JSON数据还在手动解析?
别再这样写了:
# 又臭又长的老写法
name 等于 data 中 'user' 下 'profile' 里的 'name'
学会这个神器:
from functools import reduce
from operator import getitem
定义一个函数 deep_get,它接受一个字典 dictionary、一个键的列表 keys 以及一个默认值 default(默认为 None)。这个函数的作用是在字典中按照键的顺序进行深度查找,如果能够找到所有的键,则返回对应的值;如果找不到某些键,则返回默认值。
使用 reduce 函数,传入一个 lambda 表达式,该表达式中,当 d 是字典类型时,获取 d 中键为 key 的值,如果不存在则返回 default,否则直接返回 default;然后对一系列字典或其他可迭代对象进行操作,最终得到一个结果。
使用 keys 进行分割操作,分割的依据是 '.',同时涉及到 dictionary 这个对象。
# 实战一下:
data = {
'user': {
'profile': {
'name': '张三',
'age': 25
}
}
}
从 data 中通过 deep_get 方法获取到 'user.profile.name' 对应的内容并赋值给 name
print(f"用户名:{name}")
七、文件处理的正确姿势
不要再这样写了:
f = open('data.txt', 'r')
# 处理文件
f.close() # 经常忘记关闭
用上下文管理器,既安全又优雅:
# 实战演示:
打开名为“demo.txt”的文件,以写入模式进行操作,将文件对象赋值给变量 f 。
f.write('这才是正确的打开方式!')
print("文件已自动关闭,无需担心!")
八、函数参数还在傻傻写默认值?
这种写法太业余了:
创建用户时,需要传入姓名、年龄(可为空)、城市(可为空)和爱好(可为空)等信息。如果只传入姓名,年龄、城市和爱好可为空;如果传入姓名和年龄,城市和爱好可为空;如果传入姓名、年龄和城市,爱好可为空;如果传入姓名、年龄、城市和爱好,则这些信息都将被使用。
if age is None:
age = 18
if city is None:
city = "北京"
# ...更多判断
用字典解包,代码立马高级起来:
def create_user(**kwargs):
defaults = {
'age': 18,
'city': '北京',
'hobby': '编程'
}
params 是由 defaults 和 kwargs 组合而成的。params 包含了 defaults 中的所有内容,同时也包含了 kwargs 中的所有内容。
return params
# 测试一下:
创建了一个名为“小明”的用户,这个用户被赋值给了 user1 。
创建了一个名为“小红”、年龄为 20 的 user2
print(f"用户1:{user1}")
print(f"用户2:{user2}")
最后说两句:
这些技巧并非是为了卖弄,而是为了能够写出更为简洁且更为健壮的代码。建议大家首先挑选一两个自己最为感兴趣的技巧,在实际的项目当中进行多次尝试,渐渐地就能感受到其中的美妙之处。