对于海象运算符、 f-string、 强制位置参数的详解_Python3.8新特性

(1)海象运算符

其提出主要用于解决以下情况:使代码变得更简洁以及提高代码的执行效率。海象运算符的写法为 (:=),而“海象”运算符的命名也比较形象:
在这里插入图片描述
海象运算符是一个特殊的表达式,而不是一个赋值语句,其拥有返回值,大小等于海象运算符右侧表达式的值(而不是逻辑运算符返回的布尔值),同时海象表达式左侧的变量也将被赋予相同的值。以下代码段为示例,注释内容为执行结果:

b = a = 2 # 连续赋值

print('b = {0} , a = {1}'.format(b,a)) # b = 2 , a = 2

b = (a = 2)
print('b = {0} , a = {1}'.format(b,a)) # error 赋值符号没有返回值,程序报错

b = a == 1
print('b = {0} , a = {1}'.format(b,a)) # b = False , a = 2

b = (a := 1)
print('b = {0} , a = {1}'.format(b,a)) # b = 1 , a = 1

使用示例:
- if语句

array=[1, 2, 3, 4, 5] # 以下例子中用到的数组

#方法1,多使用一次赋值操作
len1 = len(array)
if (len1 != 0): # 如果列表不为空
	print(len1) # 则告知列表长度

#方法2,多次调用len()函数
if (len(array) != 0): # 如果列表不为空
	print(len(array) # 则告知列表长度

# 转换为海象运算符
if (len1 = len(array)): # 如果列表不为空
	print(len1) # 则告知列表长度
# 与方法1相比,减少了一次赋值操作,代码更简洁
# 与方法2相比,减少了一次len()函数调用,运行更快速

- while语句

while p:
   p = input("输入密码: ")
   if p == "correctPassword":
      break
   
# 当转换为海象运算符时
while (p := input("输入密码:: ")) != "correctPassword": #将判断、赋值、IO合并到一行,Amazing!
   continue

当然,上述示例并不能体现出海象运算符的所有应用,这里简单举例只是为了简明地体现出它的好处。在更高级的编写中,例如某个程序有大量的正则匹配,使用海象运算符将能够大幅提高程序的运行效率,抑或是将代码优化为最简洁易读的形式。

(2)f-string

在上述讲解海象运算符的版块中有这样一段代码:

b = a = 2 # 连续赋值
print('b = {0}, a = {1}'.format(b,a)) # b = 2, a = 2

我们使用了format()函数来让我们的输出以我们想要的更加清晰的形式展现出来,但是代码并不很简洁。如果上述这个例子没有说服力,请看下面这个例子:

class Person(object):
    def __init__(self,name, age):
        self.name = name
        self.age = age
        
p1 = Person('示例', 12)
print('name is {name}, age is {age}'.format(name=p.name,age=p.age))
# name is 示例, age is 12

在这个例子中,只是展示了一个非常简单的例子,我们通过调用对象的属性,用关键字传参使用format()函数对其进行格式化输出,在3.6+的版本之后f-string被引入,我们完全可以抛弃format()函数,改为如下形式:

p1 = Person('示例', 12)
print(f'name is {p1.name}, age is {p1.age}') #3.6+
# name is 示例, age is 12

以前的版本中,在字符串前加r则不会对字符串内转义符进行替代,3.6版本后的f-string也是同理,在字符串前加f后,{}内的内容可以直接指定变量,在翻译时会自动将{}内的名称替换成所对应的变量的值。这在很大程度上简化了代码,增强了可读性:我们不需要冗长的format()函数了!而在3.8+之后的版本里,在{}之中甚至可以直接使用表达式:

p1 = Person('示例', 12)
print(f'{p1.name=}, {p1.age=}') #3.8+
# p1.name=示例, p1.age=12

(3)强制位置参数

在以前的版本中我们已经习惯了使用*来为参数列表指定不定长参数,在不定长参数之后的参数只能通过关键字参数的形式传入,可以称其为“强制关键字参数”:

def printinfo( *vartuple, arg1 ):
   "打印任何传入的参数"
   print (vartuple, arg1)

printinfo(1, 2, 3) # error arg1必须通过关键字方式传参
printinfo(1, 2, arg1 = 3) # (1, 2) 3

而强制位置参数也是同样的道理,只是稍有变化:

def printinfo( arg1, /, *vartuple, arg2 ):
   "打印任何传入的参数"
   print (arg1, vartuple, arg2)

printinfo(1, 2, arg2 = 3) # 1 (2,) 3
printinfo(arg1 = 1, 2, arg2 = 3) # error /前参数不能通过关键字形式传入

这样介绍应该很简明扼要了,不过这次更新的内容由于比较新颖,所以争议也比较大。在一个新功能出现之后,只要我们还是秉持着“取其精华而弃其糟粕”的思想去使用,于我们而言总是利大于弊的。以上所有内容仅为个人拙见,欢迎指正。

扫描二维码关注公众号,回复: 11416076 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_37396476/article/details/105220346
今日推荐