今天我将向大家分享日常工作中常用的15个Python技巧,让你的代码更加 Pythonic👍
Tip1:单行代码实现变量值交换
学过 C 语言的朋友应该知道,要想交换两个变量的值,总是需要借助第三个变量缓存,像这样:
a = 3; b = 4; c = a; a = b; b = c;
但是在Python中,你可以直接调换顺序完成变量值交换:
a: str = 'I love you' b: int = 520 print(f'Before swap: a = {a}, b = {b}') a, b = b, a print(f'After swap: a = {a}, b = {b}') # 多个变量同样适用 c: str = 'Every single night' a, b, c = c, a, b print(f'After swap: a = {a}, b = {b}, c = {c}')
Output: Before swap: a = I love you, b = 520 After swap: a = 520, b = I love you After swap: a = Every single night, b = 520, c = I love you
Tip2:序列反转很简单
对于列表或字符串这类序列,想要反转其元素,其实很简单,只需要通过切片索引即可一步实现:
numbers: list[int] = [1, 2, 3, 4, 5] greeting: str = 'Hello, Jack!' print(numbers[::-1]) # [5, 4, 3, 2, 1] print(greeting[::-1]) # !kcaJ ,olleH
-1表示从后往前逐一遍历元素。
Tip3:字符串乘法
有些时候,你可能需要输出同一个字符串多次,初学者可能会老老实实的手动输入n次目标字符串。比如,输出5次“love”,你可能会这样:
target = 'lovelovelovelovelove'
但其实,你可以通过字符串乘法轻松搞定,达到目的的同时代码还更简洁,可读性更强:
target: str = 'loveloveloveloveloveyou!' target2: str = ('love' * 5) + 'you!' # 等价于 target print(target) # loveloveloveloveloveyou! print(target2) # loveloveloveloveloveyou!
Tip4:单行代码实现条件赋值
假设你需要判断一个整数是奇数还是偶数,并将结果赋给另一个变量,常规的做法是这样:
number: int = 10 result: str = None if number % 2 == 0: result = 'Even' else: result = 'Oddd'
但其实你可以通过单行代码完成条件赋值:
nubmer: int = 10 result: str = 'Even' if nubmer % 2 == 0 else 'Odd' print(result) # Even
Tip5:字符串连接有妙招
假设有如下由字符串构成的列表:
names: list[str] = ['John', 'Doe', 'Jack', 'Bob', 'Smith']
需要你用指定分隔符(比如逗号)连接后输出,初学Python时,只会老老实实的用加号这样连接:
result: str = '' for name in names: result = result + name + ', ' print(result)
但实际上,调用字符串的内置函数 join()
可以轻松实现按照指定分隔符连接字符串,简单高效:
# 可以使用任何指定分隔符 print(f'Names: {", ".join(names)}') print(f'Names: {"---".join(names)}')
Output: Names: John, Doe, Jack, Bob, Smith Names: John---Doe---Jack---Bob---Smith
Tip6:使用 get 方法获取字典元素不报错
获取字典元素的常规方法是通过中括号加键值的方式,但是如果访问的键值不存在时,则会报 KeyError
错误,中止代码运行。而如果改用字典的 get
方法的话,则可以完全避免这个问题,并且对于不存在的键值,还可以设置个性化返回默认值。
info: dict[str, str] = {'Name': 'John', 'Age': 25} # print(info['job']) # 报 KeyError 错误 print(info.get('job')) # 返回 None print(info.get('job', -1)) # 返回指定的默认值 -1
Tip7:使用 setdefault 方法给字典设置默认值
上一个技巧中,我们讲到了用 get
方法获取字典元素不会报错,但不会对字典本身做任何修改。这里,我们要说的 setdefault
方法也可以根据键值获取字典元素,但是如果键值不存在,它会向字典中添加一个条目。
scores: dict[str, int] = {'Jack': 100, 'Smith': 50} jacks_score: int = scores.setdefault('Jack', 102) print(jacks_score) james_score: int = scores.setdefault('James', 0) print(james_score) print(scores) # 现在 scores 会多出一个条目,即 'James': 0
Output: 100 0 {'Jack': 100, 'Smith': 50, 'James': 0}
提问:你知道为什么最后输出的字典会多出一个新的条目(‘James’: 0)吗?
Tip8:简单便捷的元素计数器
假设我们想对序列中所有元素出现的频次进行计数,可以通过Python内置的 Counter
模块轻松实现。比如:
from collections import Counter letters: list[str] = ['a', 'b', 'c', 'a', 'a', 'c', 'c', 'd'] counter: Counter = Counter(letters) print(counter.total()) # Output: 8 print(counter.most_common()) # Output: 每个元素出现次数构成的列表 print(counter.most_common(n=3)) # Output: 出现频次最高的前3个元素
Output: 8 [('a', 3), ('c', 3), ('b', 1), ('d', 1)] [('a', 3), ('c', 3), ('b', 1)]
Tip9:便捷高效的 Enumerate
很多时候,我们在对序列进行操作的时候,不仅需要获取它的元素,还需要元素的索引位置。你不需要再通过别的循环去实现这个目的,在同一个循环中即可同时获取序列的位置和元素:
names: list[str] = ['John', 'Doe', 'Jack', 'Bob'] for idx, name in enumerate(names): print(f'{idx}: {name}')
Output: 0: John 1: Doe 2: Jack 3: Bob
元素索引默认从0开始,如果你不喜欢,你可以自定义任意起始位置。比如,我们想从1开始,只需要给 enumerate
的 start
参数传入指定的值即可。
for idx, name in enumerate(names, start=1): print(f'{idx}: {name}')
Output: 1: John 2: Doe 3: Jack 4: Bob
Tip10:字典合并很简单
实际工作中,常常会遇到字典合并的情况,我常用的是以下两种方式,都很Pythonic:
a: dict[str, int] = {'a': 1, 'b': 2} b: dict[str, int] = {'c': 3, 'd': 4} c: dict[str, int] = {**a, **b} # 使用双 * 号解包字典并合并 d: dict[str, int] = a | b # 使用竖线(|)符号合并字典 a |= b # 直接就地执行合并操作,等价于 a = a | b print(a) print(c) print(d)
Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4} {'a': 1, 'b': 2, 'c': 3, 'd': 4} {'a': 1, 'b': 2, 'c': 3, 'd': 4}
其中,第二种类似于数值四合运算中的 +=, -=, *=, /=
操作。
Tip11:千分位标识符——让你输入长串数字时不再眼花缭乱
有些时候,在输入一个很大的数字时,你可能想知道位数是否满足,但是肉眼看的话估计让你眼花缭乱。这个时候你可以给数字加上分隔符,Python解释器会忽略分隔符:
big_number: int = 10000000000000000 # 让你数有多少个0你是什么感觉? print(big_number) big_number2: int = 10_000_000_000_000_000 # 解释器会忽略下划线 print(big_number2)
Output: 10000000000000000 10000000000000000
看这个输出也挺糟心的,其实,输出也可以加上千分位标识符:
print(f'{big_number:,}') # 解释器会自动加上千分位标识符
Output: 10,000,000,000,000,000
这样看是不是瞬间就友好很多,不至于想砸键盘了吧!🤭
Tip12:__call__ 特殊方法——让类的实例直接可调用
假设我们想要一个乘法计算器,实例化后调用实例本身即可执行乘法运算,可以像下面这样,只需要在类定义中实现 __call__
特殊方法即可:
class Multiplier: def __init__(self, value: int) -> None: self.value = value def __call__(self, other_value: int) -> int: return self.value * other_value double: Multiplier = Multiplier(2) print(double(10)) # Output: 20 print(double(5)) # Output: 10
Tip13:创建你自己的方法链技术
方法链是一种非常高效、简洁且让你的代码更加Pythonic的技术,实际工作中经常用到。比如,对字符串的操作:
love: str = 'I love you' result: str = love.replace('love', '❤').replace('you', 'u').upper() print(result) # I ❤ U
其实,我们也可以实现自己的方法链技术,只需要在类定义中,将方法的返回值设为实例本身(self
)即可。
from typing import Self class Person: def __init__(self, name: str, age: int) -> None: self.name = name self.age = age def modify_name(self, new_name: str) -> Self: self.name = new_name return self def modify_age(self, new_age: int) -> Self: self.age = new_age return self jack: Person = Person(name='Jack', age=29) print(f'{jack.name}: {jack.age}') # Output: Jack: 29 jack.modify_name('Stefan').modify_age(17) # modify_name返回实例本身,因此可以接着调用类的其他方法 print(f'{jack.name}: {jack.age}') # Output: Stefan: 17
Tip14:让你的控制台输出更友好可读
在做测试时,如果你想让你的控制台输出更加格式化、友好可读,可以这样做:
foods: list[str] = ['Apples', 'Oranges', 'Bananas'] # 可指定任意分隔符 print(*foods, sep=', ', end='.\n') print(*foods, sep=' -- ', end='.\n')
Output: Apples, Oranges, Bananas. Apples -- Oranges -- Bananas.
Tip15:__repr__ 特殊方法——让类实例具象化
一般情况下,当你实例化了一个类后,当你输出该实例化对象后,返回的是该对象在内存中的地址信息。像下面这样:
class Person: def __init__(self, name: str, age: int) -> None: self.name = name self.age = age jack: Person = Person(name='Jack', age=29) print(jack) # Output: <__main__.Person object at 0x0000019454570A10>
如果你想要看到实例对象的具体信息,那么你只需要实现 __repr__
特殊方法即可:
class Person: def __init__(self, name: str, age: int) -> None: self.name = name self.age = age def __repr__(self) -> str: return f'Person(name="{self.name}", age={self.age})' jack: Person = Person(name='Jack', age=29) print(jack) # Output:Person(name="Jack", age=29)
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料和项目源码,给那些想学习 Python 的小伙伴们一点帮助!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python学习视频合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉Python实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方二维码免费领取