# 值得收藏的python语法总结

python2早已在 2020 年停止维护，随着Python版本的不断更新迭代，很多旧的语法在可读性与效率上都已经有更好的替代了。当然，大部分的重要特性，例如装饰器、生成器、async等，相信大家都已经了然于心，本文小编就对一些用的稍微少一些、日常看到的代码中不太常见，但是能用得上的语法做一个简单的总结，供大家参考，如果大家有什么不同的见解，还望各位大佬们多多指导、补充。

[En]

Through the update and change of grammar and the controversy caused by the change, we can also get a glimpse into the design philosophy of the language and the community development experience concentrated on a specific point. The most important thing is to choose what is right for you and to keep the code concise and readable.

Python 3.0-3.6

PEP 3132 可迭代对象解包拓展

Python3.0引入，加强了原本的星号运算符(*)，让星号运算符能够智能地展开可迭代对象。

Python学习交流1裙 815624229 ###
Python学习交流2裙 279199867 ###
>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]


>>> for a, *b in [(1, 2, 3), (4, 5, 6, 7)]:
>>>     print(b)
[2, 3]
[5, 6, 7]


PEP 465 矩阵乘法运算符

Python3.5引入，顾名思义，使用@符号。直接支持numpy、pandas等使用。

>>> a = numpy.array([1, 2, 3])
>>> b = numpy.array([10, 20, 30])
>>> a @ b
140

>>> c = numpy.array([[10, 15], [20, 25], [30, 35]])
>>> d = numpy.array([[4, 5, 6], [7, 8, 9]])
>>> c @ d
array([[145, 170, 195],
[255, 300, 345],
[365, 430, 495]])


[En]

It is not very useful in itself, but it provides an additional operator space that can be overloaded for purposes such as distance calculations.

>>> from math import sqrt

>>> class Point:
>>>     def __init__(self, x, y):
>>>         self.x = x
>>>         self.y = y
>>>
>>>     def __matmul__(self, value):
>>>         x_sub = self.x - value.x
>>>         y_sub = self.y - value.y
>>>         return sqrt(x_sub**2 + y_sub**2)
>>>
>>> a = Point(1, 3)
>>> b = Point(4, 7)
>>> print(a @ b)
5


PEP 3107/484/526 函数注解/类型提示/变量注解

Python3.0引入函数注解、3.5引入typing，让python也能享受静态类型的福利。可以说是py3中个人最喜欢的feature，使用简单、效果强大，直接让开发效率以及代码可维护性直线增长。

参数后加:即可标注类型，函数结构定义后接->即可标注返回类型
def get_hello(name: str) -> str:
return f"Hello, {name}!"


from typing import TypeVar, Iterable, Tuple

T = TypeVar('T', int, float, complex)
Vector = Iterable[Tuple[T, T]]

def inproduct(v: Vector[T]) -> T:
return sum(x*y for x, y in v)

def dilate(v: Vector[T], scale: T) -> Vector[T]:
return ((x * scale, y * scale) for x, y in v)

vec = []  # type: Vector[float]


pi: float = 3.142

from typing import Union

a: Union[float,None] =1.0


3.7中又引入了延迟标记求值(PEP 563)，让typing支持了前向引用、并减轻了标注对程序启动时间的影响，如虎添翼。

3.7前合法
class Tree:
def __init__(self, left: 'Tree', right: 'Tree'):
self.left = left
self.right = right

3.7前不合法、3.7后合法
class Tree:
def __init__(self, left: Tree, right: Tree):
self.left = left
self.right = right


PEP 498 f-string

Python3.6引入，应该是用的最多的feature之一了，但是看到很多代码里面还是str.format，就不得不再提一下。

>>> a = 10
>>> #只需要简单的在任意字符串字面量前加个f，就可以用花括号直接引用变量
>>> print(f"a = {a}")
a = 10

>>> # 格式化也很方便，使用:即可
>>> pi = 3.14159
>>> print(f"pi = {pi: .2f}")
pi = 3.14


>>> theta = 30


PEP 515 数值字面值下划线

Python3.6引入。输入太长的数字字面值怎么办？

>>> a = 123_456_789
>>> b = 123456789
>>> a == b
True


Python 3.7

PEP 557 数据类Data Classes

from dataclasses import dataclass

@dataclass
class InventoryItem:
name: str
unit_price: float
quantity_on_hand: int = 0

def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand


[En]

For this example, the class automatically generates the following magic methods

def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0) -> None:
self.name = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand
def __repr__(self):
return f'InventoryItem(name={self.name!r}, unit_price={self.unit_price!r}, quantity_on_hand={self.quantity_on_hand!r})'
def __eq__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand) == (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented
def __ne__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand) != (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented
def __lt__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand) < (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented
def __le__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand)  (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented
def __gt__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand) > (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented
def __ge__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.unit_price, self.quantity_on_hand) >= (other.name, other.unit_price, other.quantity_on_hand)
return NotImplemented

Python 3.8

PEP 572 海象牙运算符

“逼走”了Guido van Rossum，最有争议的PEP之一。首先引入了海象牙运算符:=，代表行内赋值。

Before
while True:
command = input("> ");
if command == "quit":
break
print("You entered:", command)

After
while (command := input("> ")) != "quit":
print("You entered:", command)


assignment expressions在进行分支判断时非常好用，写的时候能够舒服很多。本身使用也集中在if/while这种场景，虽然让语法变复杂了，但是总体还是可控的，舒适程度大于风险。

temp_list = ["abc","bcd"]
result_list = (x for x in range(len(temp_list)))
print(list(result_list))

Before
temp_list = ["abc", "bcd"]

def func_data(data: int):
for x in range(data):
yield x

result_list = func_data(len(temp_list))
print(list(result_list))

After
temp_list = ["abc", "bcd"]

def func_data():
for x in range(len(temp_list)):
yield x

result_list = func_data()
print(list(result_list))


python社区在激烈辩论后，这一部分的修改被成功撤销，只保留了海象牙运算符。

PEP 570 仅限位置形参

def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)

f(10, 20, 30, d=40, e=50, f=60)

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument


/语法的添加让调用函数时可以在可读性与简洁之间自由选择，可以选择强制不接受关键字参数、不需要形参名称时也可以省略。同时也让接受任意参数函数的实现变得方便了许多，例如：

class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument


Python 3.9

PEP 584 字典合并运算符

[En]

Before that, the painting style of merging two dictionaries was like this.

a={'a':1,'b':2}
b={'c':3}

a.update(b)

c = {**a, **b}


a |= b
c = a | b


[En]

Of course, this operator is also accompanied by some controversy, something like this:

[En]

The opposite: it is inefficient to merge multiple times similar to pipeline writing, and to repeatedly create and destroy temporary mapping positive squares: this problem can also occur in sequence cascading. If there is a usage scenario that merges a large number of dictionaries, you should merge directly and explicitly in a loop.

PEP 617 / bpo-12782 括号内的上下文管理

with (CtxManager() as example):
...

with (
CtxManager1(),
CtxManager2()
):
...

with (CtxManager1() as example,
CtxManager2()):
...

with (CtxManager1(),
CtxManager2() as example):
...

with (
CtxManager1() as example1,
CtxManager2() as example2
):
...



PEP 634 结构化模式匹配match-case

match subject:
case :

case :

case :

case _:


def http_error(status):
match status:
case 400:
case 401 | 403 | 404:
return "Not allowed"
case 404:
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the Internet"


point is an (x, y) tuple
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")


[En]

The development of language is the crystallization of the progress of technology and the needs of engineering, which reveals a full philosophy of code design. A full understanding of grammar can make development smooth and comfortable; understanding the reasons and disputes behind grammar can broaden the horizons of computer science. Keep pace with the times, in-depth understanding of various emerging technologies, is the real geek ~

Original: https://www.cnblogs.com/hahaa/p/16400588.html
Author: 轻松学Python
Title: 值得收藏的python语法总结

(0)

### 大家都在看

• #### 实战模拟│企业微信机器人实时报错预警

404. 抱歉，您访问的资源不存在。 可能是网址有误，或者对应的内容被删除，或者处于私有状态。 代码改变世界，联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

Python 2023年6月12日
0120
• #### Android — 每日一问：回调函数和观察者模式的区别？

知识点 观察者模式 网上很容易查到观察者模式的定义：观察者模式定义了对象间的一种一对多依赖关系，使得每当一个对象改变状态，则所有依赖于它的对象都会得到通知并被自动更新。 Andro…

Python 2023年10月8日
091

Python 2023年8月11日
0110
• #### Python实现自动驾驶

Original: https://www.cnblogs.com/123456feng/p/16107178.htmlAuthor: 蚂蚁ailingTitle: Python实…

Python 2023年5月24日
0134
• #### 自动化办公：手机号码提取器，使用正则表达式轻松提取文本文件中的手机号码

关于手机号码的提取，其实真正有用的部分就是re模块提供的正则表达式。使用正则表达式就能轻松地匹配到手机号码，由于功能比较简单这次并没有采用UI界面的方式来实现该功能。 【阅读全文】…

Python 2023年11月2日
0102
• #### Python工具箱系列(十七)

很多软件工程师都认为MD5是一种加密算法，然而这种观点是不对的。作为一个 1992 年第一次被公开的算法，到今天为止已经被发现了一些致命的漏洞。本文讨论MD5在密码保存方面的一些问…

Python 2023年10月30日
0104
• #### HTML & CSS 视觉设计

文本对齐 Text Align web 内容大部分都是文本。 CSS 里面的 text-align 属性可以控制文本的对齐方式。 text-align: justify; 将文本隔…

Python 2023年6月9日
0123
• #### 闭包第2天

2022-09-10 闭包的使用实例 1 def config_name(name): 2 def inner(msg): 3 print(name + ":"…

Python 2023年11月1日
078
• #### AttributeError: ‘AxesSubplot‘ object has no attribute ‘bar_label‘

AttributeError: ‘AxesSubplot’ object has no attribute ‘bar_label’ …

Python 2023年9月15日
0114
• #### jupyter lab用matplotlib画图实现交互展示

先看一下原来正常的时候是什么样子的，在jupyterlab中，这个图片只能通过代码缩放 基至是保存，若想保存这张图，也只能通过右键创建新视图后才能保存下来那么问题来了，我们想要和这…

Python 2023年9月2日
0128
• #### 强化学习资源汇总

配置环境 （2）使用conda管理运行环境： 创建环境：conda create -n your_env_name python=x.x 删除环境：conda remove -n …

Python 2023年6月3日
0103
• #### 线上jupyter 的matplotlib无法显示中文问题（已解决）

问题描述： 线上jupyter无法显示中文。配置了下面这行代码也不行 plt.rcParams[‘font.sans-serif’] = [‘Simhei’] 原因： 不存在Sim…

Python 2023年8月31日
0142

Python 2023年8月4日
089
• #### 数据科学必备Python使用Pandas处理DataFrame数据

啊哦~你想找的内容离你而去了哦 内容不存在，可能为如下原因导致： ① 内容还在审核中 ② 内容以前存在，但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

Python 2023年8月16日
0127
• #### scrapy 分布式 mysql_基于Python使用scrapy-redis框架实现分布式爬虫 注

1.首先介绍一下：scrapy-redis框架 scrapy-redis：一个三方的基于redis的分布式爬虫框架，配合scrapy使用，让爬虫具有了分布式爬取的功能。github…

Python 2023年10月5日
090
• #### Django 图片验证码的使用

通过pycharm和pip安装都可以 2.注册app 在项目的配置文件setting.py中的app中注册 INSTALLED_APPS = [ ‘django.contrib.a…

Python 2023年6月12日
0137