分享九个一般人不知道的Python好用技巧

开发 后端
本篇分享是Python生态系统中关于一些有用的技巧。大多数技巧只是使用标准库中的包,但其他一些技巧会涉及一些第三方包。

本篇分享是Python生态系统中关于一些有用的技巧。大多数技巧只是使用标准库中的包,但其他一些技巧会涉及一些第三方包。

在开始阅读本文内容之前,我们首先来回顾一下Python中的Iterables的概念。

[[440277]]

根据Python标准文档,Iterable的概念如下:

  • 一种能够一次返回一个成员的对象。

iterables的示例包括:

  • 所有序列类型(如list、str和tuple)
  • 一些非序列类型,如dict、文件对象以及类的实现中定义了__iter__()方法

Iterables是一个需要我们牢记的概念,因为接下来我们展示的许多技巧都使用itertools包。

itertools模块提供了一些函数,用于接收Iterable对象,而不仅仅是打印逐个对象。

2.Trick 1

在工作学习中,我们经常会需要使用一个简单的函数来实现从一个list来生成新的list,set或dict.此时我们就会用到iterables概念。

举例来说:

生成List: 

  1. names = ['John''Bard''Jessica' 'Andres'
  2. lower_names = [name.lower() for name in names] 

生成Set: 

  1. names = ['John''Bard''Jessica' 'Andres'
  2. lower_names = { 
  3.  name.lower() for name in names} 

生成Dict: 

  1. names = ['John''Bard''Jessica' 'Andres'
  2. lower_names = { 
  3.  name:name.lower() for name in names} 

个人建议:

仅当for语句、函数调用和方法调用的数量较少时使用。

3.Trick 2

有时,我们需要获得两个列表对象之间的所有可能组合。

我们首先想到的实现可能如下: 

  1. l1 = [1, 2, 3] 
  2. l2 = [4, 5, 6] 
  3. combinations = [] 
  4. for e1 in l1: 
  5.   for e2 in l2: 
  6.     combinations.append((e1, e2)) 

或者简化一下,如下:

  1. combinations = [(e1, e2) for e1 in l1 for e2 in l1] 

上述实现已经很简洁了,但标准库itertools提供product函数,从而提供了相同的结果。如下所示: 

  1. from itertools import product 
  2. l1 = [1, 2, 3] 
  3. l2 = [4, 5, 6] 
  4. combinatios = product(l1, l2) 

4.Trick3

假设有一个元素列表,我们需要在每对相邻元素之间比较或应用一些操作,这有时称为2个元素的滑动窗口。我们可以采用以下方式: 

  1. from itertools import tee 
  2. from typing import Iterable 
  3.  
  4. def window2(iterable: Iterable): 
  5.   it, offset = tee(iter(iterable)) 
  6.   next(offset) 
  7.   return zip(it, offset) 
  8. l = [1, 2, 3, 4, 5, 6] 
  9. dd = window2(l) 
  10. for a in dd: 
  11.     print(a) 

运行结果如下: 

  1. (1, 2) 
  2. (2, 3) 
  3. (3, 4) 
  4. (4, 5) 
  5. (5, 6) 

5.Trick4

有时,我们会需要一个类来存储信息,但是如果我们觉得创建一个类并定义其__init__()函数太麻烦时,我们不妨选择使用dataclass。如下所示: 

  1. from dataclasses import dataclass 
  2. @dataclass 
  3. class Person: 
  4.   name: str 
  5.   age: int 
  6.   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. from typing import NamedTuple  
  2. class Coordinate(NamedTuple):  
  3. x: int  
  4. y: int 

上述定义了一个标准的类可以被当做tuple来使用,如下: 

  1. coordinate = Coordinate(10, 15)  
  2. coordinate.x == coordinate[0] // True  
  3. coordinate.y == coordinate[1] // True 

7.Trick6

假如我们有一个dataclass,需要验证输入数据是否符合类型注释。在这种情况下,安装第三方软件包pydantic并将

from dataclasses import dataclass 替换为 from pydantic.dataclasses import dataclass 即可,如下: 

  1. from pydantic.dataclasses import dataclass 
  2. @dataclass 
  3. class Person: 
  4.   name: str 
  5.   age: int 
  6.   address: str 

这将生成一个类,该类具有根据成员变量声明的类型进行输入数据的解析和类型验证。 Pydantic 在运行时强制执行类型提示,并在数据无效时提供友好的错误提醒。

8.Trick7

在某些情况下,我们需要生成一些容器中元素频率的基本统计信息。在这种情况下,您可以使用标准结构Counter来接收iterable并根据元素的频率生成相应的统计信息。 

  1. from collections import Counter 
  2. l = [1, 1, 2, 3, 4, 4] 
  3. frequencys = Counter(l) 
  4. print(frequencys[1])    // Ouput: 2 
  5. print(frequencys[2])    // Ouput: 1 
  6. print(frequencys[2323]) // Ouput: 0 

Counter也提供了一些其他方法,比如如most_common,用于检索最常见的元素。

9.Trick8

如果我们相对两个list中的元素对做相应的函数处理,我们最容易想到的方法如下: 

  1. l1 = [1, 2, 3]  
  2. l2 = [4, 5, 6]  
  3. for (e1, e2) in zip(l1, l2):  
  4. f(e1, e2) 

但是使用函数map可以让代码更加简洁一些。 

  1. l1 = [1, 2, 3]  
  2. l2 = [4, 5, 6]  
  3. map(f, l1, l2)  

10.Trick9

有时候我们需要从一个list中随机选择一个元素,此时我们使用random.choice.如下所示: 

  1. from random import choice  
  2. l = [1, 2, 3]  
  3. random = choice(l) 

如果我们需要随机选择多个元素呢?当然是使用random.choices. 

  1. from random import choices 
  2. l = [1, 2, 3, 4, 5] 
  3. random_elements = choices(l, k=3) 

上述代码中的参数k为我们随机选择元素的个数。

11.总结

本文重点介绍了在python中9个和迭代相关的使用技巧,可以方便提升大家的工作效率。

您学废了吗?

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2019-07-22 06:33:55

R语言编程函数

2021-05-07 22:11:56

宽带手机运营商

2018-01-25 09:15:16

机房机柜走线

2021-01-12 12:33:20

Pandas技巧代码

2023-12-21 14:40:09

Python编程语言

2022-06-23 13:13:36

GitHub开发技巧

2019-12-17 15:10:21

Python字符串代码

2023-05-22 15:37:31

CSS元素JavaScript

2021-01-05 11:22:58

Python字符串代码

2020-01-29 19:40:36

Python美好,一直在身边Line

2009-04-14 21:38:05

LinuxUbuntu技巧

2023-07-07 14:47:46

JavaScript技巧

2020-07-11 09:45:33

Python编程语言开发

2021-08-24 00:13:23

Windows 10Windows微软

2023-08-14 15:56:52

CSS 伪元素开发

2020-07-14 08:43:54

VueHTML函数

2020-02-21 14:55:02

Python代码字符串

2017-07-21 11:12:51

跳线装机技巧

2020-06-09 07:42:30

重命名文件 Linux

2020-12-14 07:51:16

JS 技巧虚值
点赞
收藏

51CTO技术栈公众号