Python 以其简洁优雅的语法受到广泛欢迎,然而,即便是老手,也难免有时会遗漏一些高效的 Python 技巧。
今天,我就来分享 20 个超实用的 Python 小技巧,帮助你写出更简洁、更优雅、更高效的代码!
1. 一行代码实现变量互换
想象一下,你有两个变量,一个是字符串 "text"
,一个是整数 100
,如果想要交换它们的值,传统的方法可能需要借助一个临时变量,比如这样:
temp = a
a = b
b = temp
但在 Python 里,我们可以用一行代码搞定:
a, b = b, a
这样,a
和 b
的值就直接互换了!
甚至,你可以用同样的方式交换三个变量:
a, b, c = c, b, a
是不是超级方便?
2. 颠倒字符串和列表
有时候,我们需要把一个字符串或者列表的顺序颠倒,Python 提供了一个简单的方法:
reversed_list = my_list[::-1] # 颠倒列表
reversed_string = my_string[::-1] # 颠倒字符串
这比使用 reversed()
方法更加简洁直观。
3. 让字符串“无限”重复
如果你想快速生成多个相同的字符串,例如打印 20 个 "A"
,你可能会这样写:
shout = "A" * 20
结果就是 "AAAAAAAAAAAAAAAAAAAA"
。如果你想重复整个单词,比如 "Hello"
5 次:
result = "Hello " * 5
输出:Hello Hello Hello Hello Hello
是不是比手动拼接更高效?
4. 一行代码搞定条件判断
通常,我们会用 if-else
来判断一个数是奇数还是偶数:
num = 10
if num % 2 == 0:
result = "偶数"
else:
result = "奇数"
但你可以直接写成一行:
result = "偶数" if num % 2 == 0 else "奇数"
Python 让代码变得更简洁直观!
5. 一行代码合并字符串
假设你有一组邮箱地址的列表,现在你想把它们拼接成一条 ,
分隔的字符串:
emails = ["a@example.com", "b@example.com", "c@example.com"]
result = ", ".join(emails)
print(result)
输出:a@example.com, b@example.com, c@example.com
使用 join()
方法可以避免手动拼接字符串,提高代码的可读性。
6. 更安全地获取字典中的值
在操作 Python 字典时,如果你尝试访问一个不存在的键,Python 会抛出 KeyError
,但你可以使用 .get()
方法安全获取值:
data = {"name": "Alice", "age": 25}
age = data.get("age", "默认值") # 如果 'age' 存在,则返回其值,否则返回 '默认值'
print(age) # 输出 25
7. 自动创建字典默认值
如果你要读取某个字典的键,并希望在键不存在时设置默认值,你可以使用 setdefault()
方法:
scores = {"Alice": 90, "Bob": 85}
bob_score = scores.setdefault("Bob", 0) # 如果 Bob 存在,则返回其值,否则设置为 0
james_score = scores.setdefault("James", 0) # James 不存在,则创建键并设为 0
print(scores) # 输出 {'Alice': 90, 'Bob': 85, 'James': 0}
8. 统计列表中元素出现的次数
假设你有一个列表,想知道其中某个元素出现的次数,最简单的方法是使用 collections.Counter
:
from collections import Counter
letters = ["a", "b", "c", "a", "b", "a"]
counter = Counter(letters)
print(counter) # 输出 {'a': 3, 'b': 2, 'c': 1}
print(counter.most_common(1)) # 获取出现次数最多的元素 [('a', 3)]
9. 给 enumerate()
设置起始值
通常,我们在遍历列表时会使用 enumerate()
,默认情况下,它从 0
开始计数:
names = ["Alice", "Bob", "Charlie"]
for index, name in enumerate(names):
print(index, name)
但如果你想让索引从 1
开始,可以这样做:
for index, name in enumerate(names, start=1):
print(index, name)
输出:
1 Alice
2 Bob
3 Charlie
10. 一行代码合并两个字典
如果你想合并两个字典,传统方法是:
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged = {**dict1, **dict2}
但 Python 3.9 以后,你可以用 |
运算符更简洁地合并字典:
merged = dict1 | dict2
这样,你就得到了合并后的字典!
11. 让大数字更易读
如果你需要在代码中写入一个大数字,比如 1000000
,可能会因为数零太多而感到困惑。Python 允许你使用 下划线 _
作为分隔符,让数字更易读:
big_number = 1_000_000 # 这个和 1000000 是一样的
print(big_number) # 输出 1000000
这不会影响计算,Python 会自动忽略这些下划线。但它极大地提高了代码的可读性!
你还可以使用格式化字符串来让输出更直观:
print(f"{big_number:_}") # 输出 1_000_000
12. 让类像函数一样调用
Python 允许你创建可调用的类,这样类的实例可以像函数一样使用。这是通过 __call__
方法实现的:
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, value):
return self.factor * value
double = Multiplier(2) # 创建一个倍数器
print(double(10)) # 输出 20
这里 double(10)
直接调用了 Multiplier
类的实例,就像调用函数一样,是不是很有趣?
13. 方法链式调用
如果你写过 OOP(面向对象编程),你可能会遇到这样的情况:一个类有多个方法,你需要连续调用它们。这时,我们可以返回 self
,从而支持链式调用:
class Person:
def__init__(self, name, age):
self.name = name
self.age = age
defset_name(self, new_name):
self.name = new_name
returnself# 关键:返回 self 以支持链式调用
defset_age(self, new_age):
self.age = new_age
returnself# 关键:返回 self
bob = Person("Bob", 25)
bob.set_name("Alice").set_age(30) # 一行代码完成两次修改
print(bob.name, bob.age) # 输出:Alice 30
通过链式调用,我们可以让代码更简洁优雅!
14. 让列表输出更美观
假设你有一个列表,想要以更直观的方式打印出来,你可以使用 *
运算符结合 print()
:
foods = ["苹果", "香蕉", "橘子"]
print(*foods, sep=", ") # 输出:苹果, 香蕉, 橘子
sep
关键字参数用于指定元素之间的分隔符,让输出格式更友好。
15. 让对象打印更可读
在 Python 里,如果直接打印一个对象,默认会返回类似 <__main__.Person object at 0x7ff6d8e1f9d0>
这样的信息,根本没法看懂。我们可以定义 __repr__
方法,让它返回更有意义的字符串:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
bob = Person("Bob", 25)
print(bob) # 输出:Person(name=Bob, age=25)
这样,当我们打印对象时,能清楚地看到它的内容。
16. 一行代码获取列表的首尾元素
假设你有一个列表 people = ["Bob", "Alice", "Charlie", "David"]
,想要获取第一个和最后一个元素,你可以这样做:
first, *middle, last = people
print(first, last) # 输出:Bob David
*middle
会捕获中间所有的元素,而 first
和 last
则分别获取开头和结尾的元素。
17. 超方便的调试技巧
调试代码时,我们经常会打印变量的值,例如:
name = "Alice"
age = 25
print(f"name={name}, age={age}")
但 Python 3.8 以后,你可以这样写:
print(f"{name=}, {age=}")
输出:
name='Alice', age=25
它会直接显示变量名和值,省去了手动输入 name=...
的麻烦,非常适合调试!
18. 数字四舍五入的新玩法
Python 提供了 round()
函数来进行四舍五入。例如:
print(round(3.14159, 2)) # 输出:3.14
但你可能不知道,它不仅可以保留小数位数,还能对整数部分进行四舍五入:
print(round(12345, -2)) # 输出:12300
-2
表示保留到百位,类似于“银行家舍入法”,让数据更加易读。
19. 字符串替换的正确姿势
如果你想替换某个单词,比如:
sentence = "The quick red fox jumps over the lazy red dog."
new_sentence = sentence.replace("red", "blue")
print(new_sentence)
输出:
The quick blue fox jumps over the lazy blue dog.
但有时候,替换某个特定单词时,可能会误替换掉子字符串。正确做法是添加空格,避免误替换:
sentence = "The quick red fox jumps over the lazy red dog."
new_sentence = sentence.replace(" red ", " blue ")
20. 按自定义规则找最大/最小值
Python 内置的 max()
和 min()
支持自定义规则。例如,找出字母 a
出现最多的名字:
names = ["Timothy", "Bob", "James", "Zebra", "Amanda", "Anna", "Luigi"]
most_a_name = max(names, key=lambda x: x.lower().count("a"))
print(most_a_name) # 输出:Amanda
还可以按字符串长度查找最短和最长的名字:
shortest_name = min(names, key=len)
longest_name = max(names, key=len)
print(shortest_name, longest_name) # 输出:Bob Timothy
总结
今天我们分享了 20 个超实用的 Python 技巧,能让你的代码更简洁、更高效、更 Pythonic!
你最喜欢哪个技巧呢?欢迎在评论区留言分享!
文末福利
- 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!
- ① Python所有方向的学习路线图,清楚各个方向要学什么东西
- ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
- ③ Python实战案例,学习不再是只会理论
- ④ Python漫画教程,手机也能学习