拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 分享9个一般人不知道的Python骚操作,让你的代码更上一层楼

分享9个一般人不知道的Python骚操作,让你的代码更上一层楼

白鹭 - 2022-02-25 2093 0 0

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

分享9个一般人不知道的Python骚操作,让你的代码更上一层楼

 

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

很多人学习蟒蛇,不知道从何学起,

很多人学习python,掌握了基本语法之后,不知道在哪里寻找案例上手,

很多已经做了案例的人,却不知道如何去学习更多高深的知识,

那么针对这三类人,我给大家提供一个好的学习平台,免费获取视频教程,电子书,以及课程的源代码!

QQ群:101677771

欢迎加入,一起讨论一起学习!

 

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

一种能够一次回传一个成员的物件,

iterables的示例包括:

  • 所有序列型别(如list、str和tuple)
  • 一些非序列型别,如dict、档案物件以及类的实作中定义了__iter__()方法

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

itertools模块提供了一些函式,用于接收Iterable物件,而不仅仅是打印逐个物件,

分享9个一般人不知道的Python骚操作,让你的代码更上一层楼

 

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个和迭代相关的使用技巧,可以方便提升大家的作业效率,

分享9个一般人不知道的Python骚操作,让你的代码更上一层楼
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *