
你写Python代码的时候,是不是总觉得有些地方可以更优雅?
说实话,我之前也是这样。
看着自己写的一大堆代码,总觉得不够简洁。
直到我发现了这些技巧,代码一下子变得清爽多了。
Python这门语言最棒的地方就是简洁优雅。
同样的功能,用Python写可以比其他语言少写很多代码。
但是,很多开发者并没有充分利用Python的特性。
这就好比买了辆跑车,却只当自行车骑。
今天分享的15个技巧,能让你的开发效率提升50%以上。
好代码不是写出来的,是打磨出来的。
你想生成一个字典,把数字和它的平方对应起来。
传统写法是这样的:
squares = {}
for i in range(5):
squares[i] = i * i要写4行代码。
但是,用推导式一行就够了:
squares = {i: i * i for i in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}简单、直观、一眼就能看懂。
你需要把变量插入到字符串里。
以前用 .format() 方法:
name, age = "Alice", 25
print("My name is {} and I'm {} years old".format(name, age))虽然能用,但总觉得有点繁琐。
现在用 f-string:
print(f"My name is {name} and I'm {age} years old")是不是舒服多了?
就像说话一样自然。
这个太常用了。
你要同时给多个变量赋值:
a, b, c = 1, 2, 3最酷的是交换两个变量:
a, b = b, a就这么简单。
不需要什么temp变量。
Python就是这么贴心。
你想遍历一个列表,同时需要索引和元素。
不推荐的写法:
fruits = ['apple', 'banana', 'cherry']
for i in range(len(fruits)):
print(i, fruits[i])看着就累。
用 enumerate 多清爽:
for idx, fruit in enumerate(fruits, start=1):
print(idx, fruit)还能指定从1开始计数。
你有两个列表,想同时遍历它们。
传统写法:
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for i in range(len(names)):
print(names[i], ages[i])用 zip:
for name, age in zip(names, ages):
print(name, age)瞬间变得优雅。
你要统计单词出现的次数。
传统写法要判断键是否存在:
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
counter = {}
for w in words:
counter[w] = counter.get(w, 0) + 1用 defaultdict:
from collections import defaultdict
counter = defaultdict(int)
for w in words:
counter[w] += 1自动初始化,多省心。
你想知道列表里有没有偶数,或者是不是所有数都是正数。
numbers = [1, 2, 3, 4, 5]
has_even = any(n % 2 == 0 for n in numbers) # True
all_positive = all(n > 0 for n in numbers) # True一行搞定。
比写循环清楚多了。
你的函数需要接受任意数量的参数。
def log(*args, **kwargs):
print("Positional:", args)
print("Keywords:", kwargs)
log(1, 2, 3, name="Alice", age=25)位置参数和关键字参数都能收。
超级灵活。
你想给字典添加键,但键不存在时先初始化。
传统写法:
data = {}
if 'count' not in data:
data['count'] = 0
data['count'] += 1用 setdefault:
data = {}
data.setdefault('count', 0)
data['count'] += 1简洁明了。
你要创建一个简单的数据类。
以前要写一堆样板代码。
现在用 dataclass:
from dataclasses import dataclass
@dataclass(slots=True)
class Person:
name: str
age: int
email: str | None = None
p = Person("Alice", 25)
print(p) # Person(name='Alice', age=25, email=None)自动生成 __init__、__repr__ 等方法。
slots=True 还能节省内存。
上面10个是基础,再来5个进阶的。
在表达式里完成赋值。
减少重复计算和IO操作:
import sys, re
total = 0
while chunk := sys.stdin.read(8192):
errors = re.findall(r'ERROR', chunk)
total += len(errors)
print('ERROR 出现次数:', total)这是Python 3.8+的新特性。
统计大文件行数时,别用列表推导式。
用生成器表达式,内存占用恒定:
from pathlib import Path
file = Path('big.log')
line_cnt = sum(1 for _ in file.open(encoding='utf-8', errors='ignore'))
print('总行数:', line_cnt)哪怕文件有10GB,也不怕。
递归函数重复计算很耗时。
加个缓存装饰器,瞬间提速:
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n: int) -> int:
return n if n < 2 else fib(n-1) + fib(n-2)
print(fib(100)) # 瞬间返回
print(fib.cache_info()) # 查看命中情况用 match-case 写条件判断:
def parse(cmd: str):
match cmd.split():
case ['quit' | 'exit']:
return 'SHUTDOWN'
case ['add', x, y] if x.isdigit() and y.isdigit():
return int(x) + int(y)
case _:
return 'UNKNOWN'
print(parse('add 3 5')) # 8
print(parse('quit')) # SHUTDOWN比一堆 if-elif 清晰多了。
下载100张图片,用异步并发:
import asyncio, aiohttp, time
from pathlib import Path
async def fetch(url: str, session: aiohttp.ClientSession, dst: Path):
async with session.get(url) as resp:
dst.write_bytes(await resp.read())
async def bulk_download(urls: list[str], folder='imgs'):
Path(folder).mkdir(exist_ok=True)
async with aiohttp.ClientSession() as session:
tasks = [
fetch(u, session, Path(folder) / f'{i:03}.jpg')
for i, u in enumerate(urls)
]
await asyncio.gather(*tasks)
if __name__ == '__main__':
urls = [f'https://picsum.photos/200/300?random={i}' for i in range(100)]
start = time.perf_counter()
asyncio.run(bulk_download(urls))
print('全部下载完成,耗时:', time.perf_counter() - start, 's')速度直接翻倍。
把这些技巧组合起来,能做很多事。
比如统计各类别的平均价格:
from collections import defaultdict
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
category: str
products = [
Product("Laptop", 999.99, "Electronics"),
Product("Phone", 699.99, "Electronics"),
Product("Book", 19.99, "Books"),
Product("Chair", 149.99, "Furniture"),
Product("Table", 199.99, "Furniture"),
]
# 按类别聚合价格
group = defaultdict(list)
for p in products:
group[p.category].append(p.price)
# 字典推导式计算平均价
avg_price = {c: sum(prices) / len(prices) for c, prices in group.items()}
print(avg_price)
# {'Electronics': 849.99, 'Books': 19.99, 'Furniture': 174.99}代码是不是很优雅?
这些技巧看起来简单,但威力巨大。
在实际开发中逐步应用,你会发现:
好代码不是炫技,是恰到好处。
根据具体场景选择最适合的方法。
你平时最喜欢用哪个Python技巧? 评论区聊聊吧~
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!