分享9个好用的Python技巧
作者:赵卓不凡 发布时间:2021-03-15 18:43:05
1.引言
本文是Python生态系统中一些有用技巧的分享。大多数技巧只是使用标准库中的包,但其他一些技巧会涉及一些第三方包。
在开始阅读本文内容之前,我们首先来回顾一下Python中的Iterables的概念。
根据Python标准文档,Iterable的概念如下:
一种能够一次返回一个成员的对象。
iterables的示例包括:
所有序列类型(如list、str和tuple)一些非序列类型,如dict、文件对象以及类的实现中定义了__iter__()方法
Iterables是一个需要我们牢记的概念,因为接下来我们展示的许多技巧都使用itertools包。
itertools模块提供了一些函数,用于接收Iterable对象,而不仅仅是打印逐个对象。
2.Trick 1
在工作学习中,我们经常会需要使用一个简单的函数来实现从一个list来生成新的list,set或dict.此时我们就会用到iterables概念。
举例来说:
生成List:
names = ['John', 'Bard', 'Jessica' 'Andres']
lower_names = [name.lower() for name in names]
生成Set:
names = ['John', 'Bard', 'Jessica' 'Andres']
lower_names = {name.lower() for name in names}
生成Dict:
names = ['John', 'Bard', 'Jessica' 'Andres']
lower_names = {name:name.lower() for name in names}
个人建议:
仅当for语句、函数调用和方法调用的数量较少时使用。
3.Trick 2
有时,我们需要获得两个列表对象之间的所有可能组合。
我们首先想到的实现可能如下:
l1 = [1, 2, 3]
l2 = [4, 5, 6]
combinations = []
for e1 in l1:
for e2 in l2:
combinations.append((e1, e2))
或者简化一下,如下:
combinations = [(e1, e2) for e1 in l1 for e2 in l1]
上述实现已经很简洁了,但标准库itertools提供product函数,从而提供了相同的结果。如下所示:
from itertools import product
l1 = [1, 2, 3]
l2 = [4, 5, 6]
combinatios = product(l1, l2)
4.Trick3
假设有一个元素列表,我们需要在每对相邻元素之间比较或应用一些操作,这有时称为2个元素的滑动窗口。我们可以采用以下方式:
from itertools import tee
from typing import Iterable
def window2(iterable: Iterable):
it, offset = tee(iter(iterable))
next(offset)
return zip(it, offset)
l = [1, 2, 3, 4, 5, 6]
dd = window2(l)
for a in dd:
print(a)
运行结果如下:
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
5.Trick4
有时,我们会需要一个类来存储信息,但是如果我们觉得创建一个类并定义其__init__()函数太麻烦时,我们不妨选择使用dataclass。如下所示:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
address: str
上述代码创建了一个具有默认构造函数的类,该类以与声明相同的顺序接收相应字段的赋值。
person = Person(name='John', age=12, address='nanjing street')
dataclass的另一个优点是,默认情况下,会生成特殊方法,如__str__、repr、__eq__等。关于dataclass的更多用法,可以参考官网。
值得一提的是我们在类中声明的成员变量的类型注释(str、int等)并不强制在构造函数中传递的值属于这种类型。也就是说dataclasses构造对象时并不执行数据类型的检查。
6.Trick5
我们有时希望将一个对象上的操作视为tuple上的操作,一种选择是使用collections.namedtuple,但也存在更类似于dataclass的实现。如下:
from typing import NamedTuple
class Coordinate(NamedTuple):
x: int
y: int
上述定义了一个标准的类可以被当做tuple来使用,如下:
coordinate = Coordinate(10, 15)
coordinate.x == coordinate[0] // True
coordinate.y == coordinate[1] // True
7.Trick6
假如我们有一个dataclass,需要验证输入数据是否符合类型注释。在这种情况下,安装第三方软件包pydantic并将
from dataclasses import dataclass 替换为 from pydantic.dataclasses import dataclass 即可,如下:
from pydantic.dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
address: str
这将生成一个类,该类具有根据成员变量声明的类型进行输入数据的解析和类型验证。Pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误提醒。
8.Trick7
在某些情况下,我们需要生成一些容器中元素频率的基本统计信息。在这种情况下,您可以使用标准结构Counter来接收iterable并根据元素的频率生成相应的统计信息。
from collections import Counter
l = [1, 1, 2, 3, 4, 4]
frequencys = Counter(l)
print(frequencys[1]) // Ouput: 2
print(frequencys[2]) // Ouput: 1
print(frequencys[2323]) // Ouput: 0
Counter也提供了一些其他方法,比如如most_common,用于检索最常见的元素。
9.Trick8
如果我们相对两个list中的元素对做相应的函数处理,我们最容易想到的方法如下:
l1 = [1, 2, 3]
l2 = [4, 5, 6]
for (e1, e2) in zip(l1, l2):
f(e1, e2)
但是使用函数map可以让代码更加简洁一些。
l1 = [1, 2, 3]
l2 = [4, 5, 6]
map(f, l1, l2)
10.Trick9
有时候我们需要从一个list中随机选择一个元素,此时我们使用random.choice.如下所示:
from random import choice
l = [1, 2, 3]
random = choice(l)
如果我们需要随机选择多个元素呢?当然是使用random.choices.
from random import choices
l = [1, 2, 3, 4, 5]
random_elements = choices(l, k=3)
上述代码中的参数k为我们随机选择元素的个数。
11.总结
本文重点介绍了在python中9个和迭代相关的使用技巧,可以方便提升大家的工作效率。
来源:https://blog.csdn.net/sgzqc/article/details/121869348


猜你喜欢
- 一、 存储过程的概念,优点,语法 在写笔记之前,首先需要整理好这些概念性的东西,否则的话,就会在概念上产生陌生或者是混淆的感觉。 概念:将常
- 问题:连续或者单个窗体,如何打印当前显示的记录?当前窗体还有对应的子窗体,也要一起打印出来我在一个窗体里有一个单号,大子窗体里有几组数据,我
- 效果知识点:css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新
- # os 模块os.sep 可以取代操作系统特定的路径分隔符。windows下为 '\\'os.name 
- 爬楼梯(Climbing-Stairs)题干:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同
- 先上网卡数据采集脚本,这个基本上是最大的坑,因为一些数据的类型不正确会导致no datapoint的错误,真是令人抓狂,注意其中几个key的
- 前言任务描述:当前有一份excel表格数据,里面存在缺失值,需要对缺失的数据到es数据库中进行查找并对其进行把缺失的数据进行补全。excel
- 本周SELECT b.item,IFNULL(a.COUNT,0) AS VALUEFROM ( SEL
- 鉴于ASP脚本语言是在服务器端IIS或PWS中解释和运行,并可动态生成普通的HTML网页,然后再传送到客户端供浏览的这一特点。我们要在本机上
- 控制资源访问前文提到threading库在多线程时,对同一资源的访问容易导致破坏与丢失数据。为了保证安全的访问一个资源对象,我们需要创建锁。
- 本文实例讲述了JavaScript实现彩虹文字效果的方法。分享给大家供大家参考。具体如下:<HTML><HEAD>&
- 这个concatenate用于将矩阵合并,他将沿着已经存在的轴合并一个矩阵,相关参数有(a1, a2, ...), axis=0, out=
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- pycharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。接下来小编来和大家分享下PyC
- <script>var d = '2013-07-21';var nd = d.replace(new RegE
- 前言Pandas是python的一个数据分析包,提供了大量的快速便捷处理数据的函数和方法。其中Pandas定义了Series 和 DataF
- Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。降采样:高
- 1069错误(由于登录失败而无法启动服务)解决方法在本版面出现这个问题的频率也算是很高的了,新手通常会比较多遇到这个问题原因很简单,安装SQ
- 相信认真做过网页设计(Web Design),或者关注过页面设计的同行都对“空格”不陌生。“空格”属于一类细节,很容易被忽略,但又比较影响效
- 摘要:不同方法读取excel中的多个不同sheet表格性能比较# 方法1def read_excel(path): df=pd.