Python3.8 新特性-很有用的呀

目 录

1、海象表达式****1
2、强制位置参数****2
3、增强型f-string****2
4、continue关键字的使用****3
5、as_integer_ratio()方法****3
6、其他新增语法特性****3
(1)添加 \N{name} 转义符在正则表达式 中的支持: 3
(2) 字典反向迭代 4
(3) 函数关键字参数限制 4
(4) yield和return语法增强 4
(5) 组合数据类型语法警告提示 4
(6) 日期时间对象改进 5
(7) Ctrl-C终止程序的改进 5
(8) 数据拷贝增强型语法 5
(9) pow()函数的改进 5
(10) mod()取模的改进 6
(11) 字典推导式的改进 6
(12) 字典数据执行顺序 6

大牧出品,必属精品

1、海象表达式

海象表达式,the walrus operator,一种语法上的优化

可以在表达式内部给变量进行赋值

name = "damu"
if n := len(name) > 2:
    print("hello the walrus operator")
    print(n)   # True

等价于

name  = "damu"
n = len(name) > 2
if n:
    print("hello the walrus operator")
    print(n)

扩展

类似的益处还可出现在正则表达式匹配中需要使用两次匹配对象的情况中,一次检测用于匹配是否发生,另一次用于提取子分组:

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0**

另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性

2、强制位置参数

python3.8提供了强制位置参数,优化参数较少的情况下的函数调用方式

# 强制位置参数,符号/前面的参数必须使用位置参数的方式进行数据传值
def intro(name, /, gender, age):
    print(f"name: {name}, gender: {gender}, age: {age}")
intro("damu", "male", 18)  # 合法调用
intro(gender="male", age=18)  # 合法调用intro(name="damu", gender="male", age=18)  # 非法调用

3、增强型f-string

f-string是python3.6以后的版本中添加的一个快捷格式化字符数据的表达式

为了更好的完成程序中数据的调试和表示,python3.8添加了f-string=增强型语法

name = "DAMU"
age = 18
print(f"{name=}, {age=:d}")  # name='DAMU', age=18
import math
print(f"{math.cos(math.radians(60))}")  # 0.5
print(f"{math.cos(math.radians(60))=}")  # math.cos(math.radians(60))=0.5

4、continue关键字的使用

python的循环语法中,continue关键字不允许在finally子句中使用

python3.8版本取消了该限制

index = 0
while index < 3:
    try:
        print("开始执行运算操作")
    finally:
        index += 1
        if index == 2:            
            continue
            print(f"大牧家的小姑娘的玩具又多啦,现在{index=}个啦")

5、as_integer_ratio()方法

bool、int和functions.Function类型,都添加了as_integer_ratio()方法,和现有的float以及decimal.Decimal类型中的已有方法类似,提高多种类型在数字使用上的通用性;将已有数值类数据转换成分数的通用表示形式,其中分母是整数

from decimal import Decimal
i = 12
b = False
d = Decimal('0.5')
f2 = 0.5
print(i.as_integer_ratio())  # (12, 1)
print(b.as_integer_ratio())  # (0, 1)
print(d.as_integer_ratio())  # (1, 2)
print(f2.as_integer_ratio())  # (1, 2)

6、其他新增语法特性

(1)添加\N{name} 转义符在正则表达式中的支持:

>>> notice = 'Copyright © 2019'
>>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})')
>>> int(copyright_year_pattern.search(notice).group(1))2019

#(由 Jonathan Eunice 和 Serhiy Storchaka 在[bpo-30688](https://bugs.python.org/issue30688) 中贡献。)

(2) 字典反向迭代

现在 dict 和 dictview 可以使用reversed() 按插入顺序反向迭代。 (由 Rémi Lapeyre 在bpo-33462 中贡献。)

(3) 函数关键字参数限制

函数调用中允许使用的关键字名称语法受到进一步的限制。 特别地,f((keyword)=arg) 不再被允许。 关键字参数赋值形式的左侧绝不允许一般标识符以外的其他内容。 (由 Benjamin Peterson 在bpo-34641 中贡献。)

(4)yield和return语法增强

yieldreturn 语句中的一般可迭代对象解包不再要求加圆括号。 这使得 yield 和 return 的语法与正常的赋值语法更为一致:

>>> def parse(family):        lastname, *members = family.split()        return lastname.upper(), *members
>>> parse('simpsons homer marge bart lisa sally')('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'sally')

(由 David Cuthbert 和 Jordan Chapman 在bpo-32117 中贡献。)

(5) 组合数据类型语法警告提示

类似 [(10, 20) (30, 40)] 这样在代码中少了一个逗号时,编译器将显示SyntaxWarning 并附带更有帮助的提示。 这相比原来用TypeError 来提示第一个元组是不可调用的更容易被理解。 (由 Serhiy Storchaka 在bpo-15248 中贡献。)

(6)日期时间对象改进

datetime.datedatetime.datetimedatetime.timedelta 对象之间的算术运算现在将返回相应子类的实例而不是基类的实例。 这也会影响到在具体实现中(直接或间接地)使用了datetime.timedelta 算术运算的返回类型,例如astimezone()。 (由 Paul Ganssle 在bpo-32417 中贡献。)

(7) Ctrl-C终止程序的改进

当 Python 解释器通过 Ctrl-C (SIGINT) 被中断并且所产生的KeyboardInterrupt 异常未被捕获,Python 进程现在会通过一个 SIGINT 信号或是使得发起调用的进程能检测到它是由 Ctrl-C 操作杀死的正确退出代码来退出。 POSIX 和 Windows 上的终端会相应地使用此代码在交互式会话中终止脚本。 (由 Google 的 Gregory P. Smith 在bpo-1054041 中贡献。)

(8)数据拷贝增强型语法

某些高级编程风格要求为现有的函数更新 types.CodeType 对象。 由于代码对象是不可变的,需要基于现有代码对象模型创建一个新的代码对象。 使用 19 个形参将会相当繁琐。 现在,新的 replace() 方法使得通过少量修改的形参创建克隆对象成为可能。

下面是一个修改 statistics.mean() 函数来防止 data 形参被用作关键字参数的例子:

>>> from statistics import mean
>>> mean(data=[10, 20, 90])
40
>>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)
>>> mean(data=[10, 20, 90])Traceback (most recent call last):
 ...TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'**

#(由 Victor Stinner 在**[bpo-37032](https://bugs.python.org/issue37032)** 中贡献。)

(9)pow()函数的改进

对于整数,现在 pow() 函数的三参数形式在底数与模数不可约的情况下允许指数为负值。 随后它会在指数为 -1 时计算底数的模乘逆元,并对其他负指数计算反模的适当幂次。 例如,要计算 38 模 137 的模乘逆元 则可写为:

>>> pow(38, -1, 137)119
>>> 119 * 38 % 1371

(10)mod()取模的改进

模乘逆元在求解 线性丢番图方程 会被用到。 例如,想要求出 4258 + 147 = 369 的整数解,首先应重写为 4258 ≡ 369 (mod 147) 然后求解:

>>> x = 369 * pow(4258, -1, 147) % 147
>>> y = (4258 * x - 369) // -147
>>> 4258 * x + 147 * y
369

(由 Mark Dickinson 在bpo-36027** 中贡献。)**

(11) 字典推导式的改进

字典推导式已与字典字面值实现同步,会先计算键再计算值:

>>> # Dict comprehension
>>> cast = {input('role? '): input('actor? ') for i in range(2)}
role? King Arthur
actor? Chapman
role? Black Knight
actor? Cleese

>>> # Dict literal
>>> cast = {input('role? '): input('actor? ')}
role? Sir Robin
actor? Eric Idle

(12) 字典数据执行顺序

对执行顺序的保证,对赋值表达式来说很有用,因为在键表达式中赋值的变量将可在值表达式中被使用:

>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald']
>>> {(n := normalize('NFC', name)).casefold() : n for name in names}
{'martin von löwis': 'Martin von Löwis', 'łukasz langa': 'Łukasz Langa', 'walter dörwald': 'Walter Dörwald'}**
#(由 Jörn Heissler 在**[bpo-35224](https://bugs.python.org/issue35224)** 中贡献。)

object.reduce() 方法现在可返回长度为二至六个元素的元组。 之前的上限为五个。 新增的第六个可选元素是签名为 (obj, state) 的可调用对象。 这样就允许直接控制特定对象的状态更新。 如果元素值不为 None,该可调用对象将优先于对象的setstate() 方法。 (由 Pierre Glaser 和 Olivier Grisel 在bpo-35900 中贡献。)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容