python3.8新特性


海象运算符(赋值运算符)
#原来
def choice():
    s = ' jsadlk '.strip()
    res = isinstance(s, int)
    if res:
        return 'int'
    else:
        return 'other'
res = choice()
#使用了海象运算符之后
s = ' jsadlk '.strip()
def choice():
    if res:=isinstance(s, int):  #如果res为真的话赋值给res
        return res
    else:return res
res = choice()

也可以用于循环

a = True
while a:
    print('helloworld')
使用了海象运算符之后↓
while a:=True:
    print('helloworld')

 

f-string
a = '你好'
b = '世界'
print(f'a={a} b={b}')
# a=你好 b=世界

# f-string在3.8中变得更加简洁
a = '你好'
b = '世界'
print(f'{a=} {b=}')
# a=你好 b=世界
#还添加了赋值符号!s和!f,制定输入结果格式
import datetime

time = datetime.datetime.now()
print(f'{time=!s}')
# time=2019-07-30 16:58:00.123412

import math

print(f'{math.pi=!f:.2f}')  # 精确到小数点后面两位


[/],[*]
有新的语法(/)表示必须按位置指定某些函数参数(即,不能用作关键字参数
#
使用「/」规定哪些变量的输入必须按照第一种格式

适用范围如下:

/的所有剩余参数都只作为位置处理。

如果/未在函数定义中指定,则该函数不接受任何位置参数。

围绕仅针对位置的参数的可选值的逻辑与针对位置或关键字参数的逻辑相同。

一旦用默认值指定了一个position -only参数,下面的position -only和position -or-keyword参数也需要有默认值。

没有默认值的仅定位参数是必需的仅定位参数。

def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
      ----------      ----------    ----------
         |                 |                 |
         |            位置 和 关键字 参数      |
         |                                   - 只有关键字参数
         -- 只有位置参数    

其中/和*是可选的。如果使用这些符号,则通过参数传递给函数的方式来指示参数的类型:position -only、position -or-keyword和key - word-only。关键字参数也称为命名参数。

pos_or_kwd参数

  如果/和*在函数定义中不存在,则可以通过位置或关键字将参数传递给函数。

pos-only参数

  更详细地看一下,可以将某些参数标记为position -only。如果只是位置,则参数的顺序很重要,并且不能通过关键字传递参数。位置参数将放在/(正斜杠)之前。/用于逻辑上将位置参数与其他参数分开。如果函数定义中没有/,则没有位置参数。

key-only
  要将参数标记为仅关键字参数,指示参数必须通过关键字参数传递,请在参数列表中第一个仅关键字参数之前放置*。

所以/后面的参数可以是位置或关键字或关键字。

#下面是有效的位置函数
def
name(p1, p2, /, p_or_kw, *, kw): def name(p1, p2=None, /, p_or_kw=None, *, kw): def name(p1, p2=None, /, *, kw): def name(p1, p2=None, /): def name(p1, p2, /, p_or_kw): def name(p1, p2, /):
def name(p1, p2): #当然不加的话没有任何影响,和以前的没有区别
#下面是有效的定义函数
def name(p_or_kw, *, kw):
def name(*, kw):
#下面是无效的函数定义
def name(p1, p2=None, /, p_or_kw, *, kw):
def name(p1=None, p2, /, p_or_kw=None, *, kw):
def name(p1=None, p2, /):

  总结:通过/或者*可以指定位置参数,常规参数,关键字参数在函数形参位置带来更好的可读性,重构性,错误提示性 

 

多进程共享内存

  multiprocessing模块提供了SharedMemory类,可以在不同的Python进城之间创建共享的内存区域

 

 

__pycache__

# __pycache__目录是由 Python3 解释器创建的,用于保存.pyc 文件。这些文件保存着解释器编译.py 文件之后的字节码(byte code)。之前的 Python 版本仅仅只是为每个.py 文件创建一个.pyc 文件,但是新版本会有所变化。
#
# 为了支持多版本的 Python,包括一些不是 CPython 的版本(如 PyPy),现在库文件会为每个 Python 版本创建对应的.pyc 文件,格式形如「name.interp-version.pyc」。例如,某个 foo.py 文件在第一次使用的时候会创建一个对应的 pyc 文件,其路径为「__pycache__/foo.cpython-37.pyc」,这个 pyc 文件会定义使用的 Python 版本。



python3.8将于不晚于2019年10月份,3.9版本估计在2020年左右
更多参考文档 https://docs.python.org/3.8/whatsnew/3.8.html#assignment-expressions
posted @ 2019-08-01 11:32  RainBol  阅读(3561)  评论(0编辑  收藏  举报
Live2D