python3.8新特性 逻辑表达式_Python 3.8的新特性,python38,介绍

python3.8 新的特性介绍

增加了一下 东西,觉得挺好的。

海象运算符

:=

fstring 增强版

def 函数 指定 位置,关键字参数

模块细节调整

海象运算符

这个都用这个翻译

:=

这个符号,可能这个符号看起来像海象吧。 这个作用可以把等号右面表达式的值 赋值给 这个符号 前面的变量。

举个例子 就明白了。

列表长度判断

比如 我希望 判断一个 list 长度 如果小于等于5 ,我就打印一下,如果大于5 我只输出前5 个元素

nums = list(range(10))

length = len(nums)

if length <= 5:

print(nums)

else:

print(nums[0:5])

这样 你要定义变量 length ,并且这个变量可能 之后 就不会再用了, 这样当然没有什么 问题,其实不够简洁。

nums = list(range(10))

# length = len(nums)

if (length:=len(nums)) <= 5:

print(nums)

else:

print(nums[0:5])

这样看起来 是不是比较优雅一点啊。

读取文件,判断文件 有没有读完,每次读取一行, 最后 看有没有读完

# 伪代码

def process(block):

print(f"{block=}")

with open('names.txt', 'r') as f:

while (block := f.readline()) != '':

process(block)

fstring 增强

在python3.7 里面 已经可以支持fstring 这种写法,

{name}

这样就会解析这个变量了。

name = 'frank'

hobby = 'swiming'

print(f"name={name},hobby={hobby}")

print(f"name={name!r},hobby={hobby!r}")

"""结果如下

name=frank,hobby=swiming

name='frank',hobby='swiming'

"""

上面的print 发现有一个

name=

和里面的大括号里面的name 是重复的。 在python3.8 中 ,在 大括号里面 加一个

=

就可以了,是不是很完美,这种打印 是原生字符串会把引号 打印出来, 当然 可以指定格式打印了 。python 3.7 方法 一样可以指定格式,格式写在

=

号的后面。

name = 'frank'

hobby = 'swiming'

print(f"{name=},{hobby=}")

"""结果如下

name='frank',hobby='swiming'

"""

像下面 可以指定具体的格式, 是不是很好啊。

print(f"name={name!s},hobby={hobby!s}")

print(f"name={name!r},hobby={hobby!r}")

函数增强

​这个功能 其实一直都有,只是在这之前没有正式做feature, 就是 可以指定一些参数只能传 位置参数,一些参数 只能传入关键字参数, 这样 有一定好处,强行 让调用者 安装 规则调用 函数,这样比较清晰一点。

以下面的

fun函数

为例 , 有一个

/

这里之前的变量 只能传入

位置参数

*

之后的变量只能用关键字传入进来,

/

*

之间的变量 ,可以选择 用 位置 或者关键字传入参数 , 这里不要求 全部都是使用这个函数声明,有的话,就按照这种约定来。

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

print(f"{a=},{b=},{c=},{d=},{e=},{f=}")

fun(1, 2, 3, 4, e=5, f=6) # ok

fun(1, 2, c=3, d=4, e=5, f=6) #ok

fun(1, 2, 3, d=4, e=5, f=6) # ok

fun(1, 2, c=3, 4, e=5, f=6) # error 1

fun(a=1,b=2,3,4,e=5,f=6) # error 2

fun(1,2,3,4,5,f=6) # error 3

fun(1,b=2,3,4,e=5,f=6) # error 4

第一种错误, 因为 c 传入关键字参数 ,d 是位置参数 。因为 python 中位置参数 是在 关键字参数后面的。

Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32

>>>

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

... print(f"{a=},{b=},{c=},{d=},{e=},{f=}")

...

>>> fun(1, 2, c=3, 4, e=5, f=6)

File "", line 1

SyntaxError: positional argument follows keyword argument

第二种错误, a,b 只能是位置参数, 传入关键字 肯定不对啊。

>>> fun(a=1,b=2,3,4,e=5,f=6)

File "", line 1

SyntaxError: positional argument follows keyword argument

第三种错误,e,f 只能是关键字 参数, e 传入的是位置参数。

>>> fun(1,2,3,4,5,f=6)

Traceback (most recent call last):

File "", line 1, in

TypeError: fun() takes 4 positional arguments but 5 positional arguments (and 1 keyword-only argument) were given

第四种错误, a,b 只能是位置参数, 传入关键字 肯定不对啊。

>>> fun(1,b=2,3,4,e=5,f=6)

File "", line 1

SyntaxError: positional argument follows keyword argument

新的模块 metadata

这个模块

importlib.metadata

可以查看 第三方package 一些元信息,依赖等

from importlib.metadata import version, requires, files

首先 本机要安装 flask 才能看,不能直接 去pypi 看版本,这个只是看你本地按照的环境的信息

>>> from importlib.metadata import requires,version,files

...

>>> version('flask')

'1.1.1'

>>> version('Flask')

'1.1.1'

>>> requires('flask')

>>> list(files('flask'))[:2]

[PackagePath('../../Scripts/flask.exe'), PackagePath('Flask-1.1.1.dist-info/INSTALLER')]

functools.lru_cache 调用方式的改进

@functools.lru_cache() 这里要有一个括号,现在 两种方式都可以兼容 了。

import functools

@functools.lru_cache()

def fun():

pass

@functools.lru_cache

def fun2():

pass

总结

​当然还有一些 模块细节调整,asynicio 模块的稳定版, 一些细节优化,具体 看下 下面的参考链接,这里之列了一些 我感觉比较常用的一些改变。

参考文档

分享快乐,留住感动. 2020-03-27 18:50:19 --frank

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值