分享9个好用的Python技巧
大家好,本篇文章主要讲的是分享9个好用的Python技巧,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
目录
1.引言
2.Trick 1
3.Trick 2
4.Trick3
5.Trick4
6.Trick5
7.Trick6
8.Trick7
9.Trick8
10.Trick9
11.总结
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:
1 2 | names = [ 'John' , 'Bard' , 'Jessica' 'Andres' ] lower_names = [name.lower() for name in names] |
生成Set:
1 2 | names = [ 'John' , 'Bard' , 'Jessica' 'Andres' ] lower_names = {name.lower() for name in names} |
生成Dict:
1 2 | names = [ 'John' , 'Bard' , 'Jessica' 'Andres' ] lower_names = {name:name.lower() for name in names} |
个人建议:
仅当for语句、函数调用和方法调用的数量较少时使用。
3.Trick 2
有时,我们需要获得两个列表对象之间的所有可能组合。
我们首先想到的实现可能如下:
1 2 3 4 5 6 | l1 = [ 1 , 2 , 3 ] l2 = [ 4 , 5 , 6 ] combinations = [] for e1 in l1: for e2 in l2: combinations.append((e1, e2)) |
或者简化一下,如下:
1 | combinations = [(e1, e2) for e1 in l1 for e2 in l1] |
上述实现已经很简洁了,但标准库itertools提供product函数,从而提供了相同的结果。如下所示:
1 2 3 4 | from itertools import product l1 = [ 1 , 2 , 3 ] l2 = [ 4 , 5 , 6 ] combinatios = product(l1, l2) |
4.Trick3
假设有一个元素列表,我们需要在每对相邻元素之间比较或应用一些操作,这有时称为2个元素的滑动窗口。我们可以采用以下方式:
1 2 3 4 5 6 7 8 9 10 11 | 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 3 4 5 | ( 1 , 2 ) ( 2 , 3 ) ( 3 , 4 ) ( 4 , 5 ) ( 5 , 6 ) |
5.Trick4
有时,我们会需要一个类来存储信息,但是如果我们觉得创建一个类并定义其__init__()函数太麻烦时,我们不妨选择使用dataclass。如下所示:
1 2 3 4 5 6 | from dataclasses import dataclass @dataclass class Person: name: str age: int address: str |
上述代码创建了一个具有默认构造函数的类,该类以与声明相同的顺序接收相应字段的赋值。
1 | person = Person(name = 'John' , age = 12 , address = 'nanjing street' ) |
dataclass的另一个优点是,默认情况下,会生成特殊方法,如__str__、repr、__eq__等。关于dataclass的更多用法,可以参考官网。
值得一提的是我们在类中声明的成员变量的类型注释(str、int等)并不强制在构造函数中传递的值属于这种类型。也就是说dataclasses构造对象时并不执行数据类型的检查。
6.Trick5
我们有时希望将一个对象上的操作视为tuple上的操作,一种选择是使用collections.namedtuple,但也存在更类似于dataclass的实现。如下:
1 2 3 4 | from typing import NamedTuple class Coordinate(NamedTuple): x: int y: int |
上述定义了一个标准的类可以被当做tuple来使用,如下:
1 2 3 | 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 即可,如下:
1 2 3 4 5 6 | from pydantic.dataclasses import dataclass @dataclass class Person: name: str age: int address: str |
这将生成一个类,该类具有根据成员变量声明的类型进行输入数据的解析和类型验证。Pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误提醒。
8.Trick7
在某些情况下,我们需要生成一些容器中元素频率的基本统计信息。在这种情况下,您可以使用标准结构Counter来接收iterable并根据元素的频率生成相应的统计信息。
1 2 3 4 5 6 | 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中的元素对做相应的函数处理,我们最容易想到的方法如下:
1 2 3 4 | l1 = [ 1 , 2 , 3 ] l2 = [ 4 , 5 , 6 ] for (e1, e2) in zip (l1, l2): f(e1, e2) |
但是使用函数map可以让代码更加简洁一些。
1 2 3 | l1 = [ 1 , 2 , 3 ] l2 = [ 4 , 5 , 6 ] map (f, l1, l2) |
10.Trick9
有时候我们需要从一个list中随机选择一个元素,此时我们使用random.choice.如下所示:
1 2 3 | from random import choice l = [ 1 , 2 , 3 ] random = choice(l) |
如果我们需要随机选择多个元素呢?当然是使用random.choices.
1 2 3 | from random import choices l = [ 1 , 2 , 3 , 4 , 5 ] random_elements = choices(l, k = 3 ) |
上述代码中的参数k为我们随机选择元素的个数。
11.总结
本文重点介绍了在python中9个和迭代相关的使用技巧,可以方便提升大家的工作效率。
到此这篇关于分享9个好用的Python技巧的文章就介绍到这了
原文链接:https://blog.csdn.net/sgzqc/article/details/121869348