每天都在用的20个Python技巧,让你从此告别平庸!

今天我将向大家分享日常工作中常用的20个Python技巧,小巧而优雅,让你的代码更加 Pythonic👍

目录

Tip1:单行代码实现变量值交换

Tip2:序列反转很简单

Tip3:字符串乘法

Tip4:单行代码实现条件赋值

Tip5:字符串连接有妙招

Tip6:使用 get 方法获取字典元素不报错

Tip7:使用 setdefault 方法给字典设置默认值

Tip8:简单便捷的元素计数器

Tip9:便捷高效的 Enumerate

Tip10:字典合并很简单

Tip11:千分位标识符——让你输入长串数字时不再眼花缭乱

Tip12:__call__ 特殊方法——让类的实例直接可调用

Tip13:创建你自己的方法链技术

Tip14:让你的控制台输出更友好可读

Tip15:__repr__ 特殊方法——让类实例具象化

Tip16:更优雅的获取序列首尾元素

Tip17:简洁高效的控制台输出方式——你的调试好帮手

Tip18:round——四舍五入还可以这么用

Tip19:字符串替换

Tip20:自定义获取元素最大最小值的方式



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 Counterletters: 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 = valuedef __call__(self, other_value: int) -> int:return self.value * other_valuedouble: 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 Selfclass Person:def __init__(self, name: str, age: int) -> None:self.name = nameself.age = agedef modify_name(self, new_name: str) -> Self:self.name = new_namereturn selfdef modify_age(self, new_age: int) -> Self:self.age = new_agereturn selfjack: 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 = nameself.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 = nameself.age = agedef __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)

Tip16:更优雅的获取序列首尾元素

正常情况下,对于初学者来说,如果想要获取序列的首尾元素,一般通过下标索引获取,像这样:

first = target_sequence[0]
last = target_sequence[-1]

但是还有更加Pythonic的方式:

people: list[str] = ['John', 'Doe', 'James', 'Bob', 'Smith', 'Stefan']
first_person, *_, last_person = people
print(first_person, last_person)    # Output: John Stefan
print(_)    # 你猜这会输出什么?

Tip17:简洁高效的控制台输出方式——你的调试好帮手

如果控制台输出能像下面这样的话,我相信你的调试会更加直观明了:

name: str = 'Jack'
age: int = 29
print(f'{name=}')   # 等价于 print(f'name={name}'),下同
print(f'{age=}')
print(f'{5+10=}')
Output:
name='Jack'
age=29
5+10=15

Tip18:round——四舍五入还可以这么用

number: float = 1314521.56789
print(round(number, 2))     # 这种用法 我们的熟悉,保留小数点后2位
print(round(number, -1))
print(round(number, -3))

第一种用法是我们所熟知的,即保留n位小数。那么你猜猜后面两行会输出什么呢?🤭🤭

Tip19:字符串替换

与前面 Tip13类似,其实字符串替换很简单,而且还支持方法链技术。这个例子只是演示字符串的替换,同时警示替换时要格外小心,否则会出现不期望的结果。

sentence: str = 'The tired red fox on the red farm ate a bored red pig.'
print(sentence.replace('red', 'XXX'))
print(sentence.replace(' red', ' blue'))
Output:
The tiXXX XXX fox on the XXX farm ate a boXXX XXX pig.
The tired blue fox on the blue farm ate a bored blue pig.

如果 red 的前面不加空格的话,就会将我们不想替换的部分也替换掉。像这样:

print(sentence.replace('red', ' blue'))

图片

Tip20:自定义获取元素最大最小值的方式

假设有一个字符串列表,你想要获取它的最大最小值,可以通过内置的 max 和 min 方法实现,默认按照字母顺序排序。

names: list[str] = ['John', 'Doe', 'Jack', 'Bob', 'Smith','Timothy', 'Amanda', 'Zebra']
# 默认按字母顺序排序
print('Max: ', max(names))  # Output: Max:  Zebra
print('Min: ', min(names))  # Output: Min:  Amanda

假设我们想按照字符串长度获取最大最小值,则可以给 max 和 min 方法的 key 参数传递排序行为即可:

for name in names:print(name, len(name), sep=': ')print('Max: ', max(names, key=len))
print('Min: ', min(names, key=len))
John: 4
Doe: 3
Jack: 4
Bob: 3
Smith: 5
Timothy: 7
Amanda: 6
Zebra: 5
Max:  Timothy
Min:  Doe

提问:如果你仔细观察的话,Doe 和 Bob 的长度都为3,为什么最小值是 Doe?你知道原因吗?

此外,如果我们想根据含有某个字符(比如字母‘a’)数量的多少来获取最大最小值,又该如何实现呢?你可以定义一个排序函数,然后传递给参数 key 即可:

for name in names:print(name, name.count('a'), sep=': ')print('Max: ', max(names, key=lambda x: x.count('a')))
print('Min: ', min(names, key=lambda x: x.count('a')))
Output:
John: 0
Doe: 0
Jack: 1
Bob: 0
Smith: 0
Timothy: 0
Amanda: 2
Zebra: 1
Max:  Amanda
Min:  John

提问:类似的问题,有好几个名字中都不含字母‘a’,为什么最小值却是 John?你知道原因吗?

练习:如果长度相同或字母‘a’的数量相同时,我想根据字母顺序排序,该如何实现呢?有兴趣的朋友可以去实践一下,留言给大家分享。

好啦,今天关于Python每天常用的20个技巧就分享到这,感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID(NFC) CLRC663非接触读取芯片GD32/STM32 SPI读取

文章目录 基本介绍硬件配置连接硬件连接详解程序代码代码解释 基本介绍 CLRC663 是高度集成的收发器芯片&#xff0c;用于 13.56 兆赫兹的非接触式通讯。CLRC663 收发器芯片支 持下列操作模式 • 读写模式支持 ISO/IEC 14443A/MIFARE • 读写模式支持 SO/IEC 14443IB • JIS X…

打破误解:走近轻度自闭症患者的真实生活

在自闭症的广阔光谱中&#xff0c;轻度自闭症是一个相对温和但又不可忽视的存在。它像是一层薄薄的雾&#xff0c;轻轻笼罩在患者的世界里&#xff0c;既不影响他们基本的生存能力&#xff0c;又在一定程度上影响着他们的社交互动、情感表达及兴趣范围。 轻度自闭症患者往往能…

【Android】Android模拟器抓包配置

从Android7.0之后开始&#xff0c;用户自行安装的证书在用户目录下&#xff0c;无法进行证书信任&#xff0c;导致Charles无法进行https抓包 方案&#xff1a; 1. 获取手机root权限 有些模拟器可以直接开启root权限&#xff1b; 有些Android手机可以直接开启root权限。 2. …

【ai】学习笔记:电影推荐1:协同过滤 TF-DF 余弦相似性

2020年之前都是用协同过滤2020年以后用深度学习、人工智能视频收费的,不完整,里面是电影推荐 这里有个视频讲解2016年大神分析了电影推荐 :MovieRecommendation github地址 看起来是基于用户的相似性和物品的相似性,向用户推荐物品: 大神的介绍: 大神的介绍: 基于Pytho…

Python3 基础语法快速入门

目录&#xff1a; 一、概述二、运行1、终端启动 Python3 交互式解释器直接执行&#xff1a;2、.py 文件运行&#xff1a;3、可执行文件运行&#xff1a; 三、基础语法1、Python 中文编码&#xff1a;2、注释&#xff1a;3、print 输出&#xff1a;4、变量赋值&#xff1a;5、行…

tcp协议下的socket函数

目录 1.socket函数 2.地址转换函数 1.字符串转in_addr的函数:​编辑 2.in_addr转字符串的函数&#xff1a;​编辑 1.关于inet_ntoa函数 3.listen函数 4.简单的Server模型 1.初步模型 1.sock函数和accept函数返回值的sockfd的区别 2.运行结果和127.0.0.1的意义 2.单进…

【游戏/社交】BFS算法评价用户核心程度or人群扩量(基于SparkGraphX)

【游戏/社交】BFS算法评价用户核心程度or人群扩量&#xff08;基于SparkGraphX&#xff09; 在游戏和社交网络领域&#xff0c;评估用户的核心程度或进行人群扩量是提升用户粘性和拓展社交圈的关键。广度优先搜索&#xff08;BFS&#xff09;算法以其在图结构中评估节点重要性…

[C/C++入门][变量和运算]9、数据类型以及占用存储空间大小

我们都知道&#xff0c;C中包含了多种数据类型 数据类型占用字节数中文名称注释char1字符型存储单个字符&#xff0c;通常为8位。signed char1有符号字符型字符型的有符号版本&#xff0c;可用于表示-128至127之间的整数。unsigned char1无符号字符型字符型的无符号版本&#…

SpringAI简单使用(本地模型+自定义知识库)

Ollama 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在本地机器上构建和运行语言模型&#xff0c;提供了一个简单易用的API来创建、运行和管理模型&#xff0c;同时还提供了丰富的预构建模型库&#xff0c;这些模型可以轻松地应用在多种应用场景中。O…

arm 内联汇编基础

一、 Arm架构寄存器体系熟悉 基于arm neon 实现的代码有 intrinsic 和inline assembly 两种实现。 1.1 通用寄存器 arm v7 有 16 个 32-bit 通用寄存器&#xff0c;用 r0-r15 表示。 arm v8 有 31 个 64-bit 通用寄存器&#xff0c;用 x0-x30 表示&#xff0c;和 v7 不一样…

如何在 PostgreSQL 中处理海量数据的存储和检索?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 如何在 PostgreSQL 中处理海量数据的存储和检索&#xff1f;一、优化表结构设计二、分区技术三、数据压…

ceph log内容解析

log内容构造 如osd的一条log 分别表示 时间戳 线程id 日志等级 子模块 内容实体 剖析源码实现 每条log都是由一个Entry构成 定义在src/log/entry.h中 Entry(short pr, short sub) :m_stamp(clock().now()), // 打印日志时的时间戳m_thread(pthread_self()), // 打印日志的线…

【精品资料】智慧物流园区整体架构方案(46页PPT)

引言&#xff1a;智慧物流园区整体架构方案是一个集现代信息技术、物联网、大数据、云计算及人工智能等前沿科技于一体的综合性物流园区建设蓝图。该方案旨在通过高度集成和智能化的系统&#xff0c;优化物流流程&#xff0c;提升运营效率&#xff0c;降低运营成本&#xff0c;…

智慧新零售移动端收银视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

“信息科技风险管理”和“IT审计智能辅助”两个大模块的部分功能详细介绍:

数字风险赋能中心简介 数字风险赋能中心简介 &#xff0c;时长05:13 大家好&#xff01;我是AI主播安欣&#xff0c;我给大家介绍一下数字风险赋能中心。 大家都知道当前我国政企机构的数字化转型已经进入深水区&#xff0c;数字化转型在给我们带来大量创新红利的同时&#xf…

2024年第二季度 DDoS 威胁趋势报告

2024 年上半年&#xff0c;Cloudflare 缓解了 850 万次 DDoS 攻击&#xff1a;第一季度 450 万次&#xff0c;第二季度 400 万次。总体而言&#xff0c;第二季度 DDoS 攻击数量环比下降了 11%&#xff0c;但同比增长了 20%。 DDoS 攻击分布&#xff08;按类型和手段&#xff09…

Python+Django+MySQL的新闻发布管理系统【附源码,运行简单】

PythonDjangoMySQL的新闻发布管理系统【附源码&#xff0c;运行简单】 总览 1、《新闻发布管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 新闻新增界面2.4 文章编辑界面2.5 新闻详情页2.7 其他功能贴图 3、下载 总览 自己做的项目&…

破解打家劫舍:动态规划与二分查找的高效算法

目录 198. 打家劫舍 解法一:一维动态规划 解法二&#xff1a;二维动态规划 213. 打家劫舍 II 思路分析 代码实现 337. 打家劫舍 III 思路分析 代码实现 2560. 打家劫舍 IV 思路分析 参考博客 198. 打家劫舍 如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统…

【Qt】QWidget核心属性相关API

目录 一. enabled——是否可用 二. geometry——几何位置 window frame 三. windowTitle——窗口标题 四. windowIcon——窗口图标 ​qrc文件 五. windowOpacity——透明度 六. cursor——光标 自定义光标 七. font——字体 八. toolTip——提示栏 九. focusPolic…

【QT】QT 概述(背景介绍、搭建开发环境、Qt Creator、程序、项目文件解析、编程注意事项)

一、Qt 背景介绍 1、什么是 Qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。 它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展。Qt 为开发者提供了一种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和…