文章转载自公众号:读芯术
Python 3 上线已有一段时间,大多数开发人员(特别是那些首次编程的人)已经在使用它了。
不过,你确定已经对 Python 3 研究透彻了吗?事实上,其中还有许多新功能对大多数人来说仍处于未知状态。本文就将讨论 Python 3 中三个鲜为人知但非常有用的功能,我在其他语言中接触到并爱上了这些功能,它们的加入使得使 Python 3 体验更佳。
枚举
枚举是在 Java 和 Swift 中常使用到的功能,我把它扩展到Python中。在 Python 中创建枚举非常简单,在 Python 3 之前的版本中也可使用(尽管功能更受限):
from enum importEnum
classState(Enum):
AIR=0
LAND=1
SEA=2
myState =State.AIR
# Prints 0
print(myState.value)
# Prints AIR
print(myState.name)
在上述代码中,可以看到通过构造一个类并使其成为枚举的子类,便可以轻松构造枚举。在这里只需在下面的行中定义每个状态。就我而言,我有 AIR、LAND、SEA。
Python 3 的新功能是运行.value
和.name
。这能获得与状态相关联的整数值或与之相关联的字符串。
在上面的代码中,输入State.LAND.name
返回LAND
,因此功能不仅仅是一个整数枚举。
当需要描述性常量时,代码中的枚举类型十分有用。例如,与其检查状态是 0 还是 1 ,不如检查它是否是State.MOVING
或State.STATIONARY
状态。常量可能会改变,如果有人在看你的代码,MOVING
比 0 更有意义,代码的可读性也会大大提高。
格式
在Python 3.6
中添加的fstring
是格式化文本的一种很好的方式。它们的可读性强,而且不容易出错。fstring
比Python
以前使用的格式更易读。以下是使用格式的示例:
name = Brett
blog_title = Medium
# Hi, my name isBrett and I am writing on my Medium blog.
a ="Hi, myname is {} and I am writing on my {} blog.".format(name,blog_title)
如上所示,在字符串中打入括号,然后按顺序列出每个变量的名称。相同代码任务很多,但fstring
极大地增加了代码的可读性,尤其是类似于用Swift格式化字符串。
name = Brett
blog_title = Medium
# Hi, my name isBrett and I am writing on my Medium blog.
a =f"Hi, myname is {name} and I am writing on my {blog_title} blog."
为了完成这个更简洁的字符串,只需在引号前面加上字母 f ,然后将变量或数据直接放入括号中,而不是使用空括号。由于变量本身是写在括号内的,所以不必计算格式中写入的项的数量来确定变量的位置,变量就在应在的位置。
相比于字符串连接或格式化字符串,fstring
可以生成更可读、更可靠的代码。
数据类
数据类可能要比上述所谈更为晦涩难懂,所以我将简要地解释一下。我在Kotlin
中逐渐喜欢上了数据类,因此很想在Python
中使用它们。
数据类实际上是一个类,其唯一目的是保存数据的类。类将具有可以访问和写入的变量,但上面没有额外的逻辑。
假设你有一个程序,在不同的类之间传递一个字符串和一个数字数组。使用pass
(str,arr)这样的方法也可行,最好是创建一个只包含字符串作为字段和数组的数据类。通过创建一个数据类,你所做的将更加清晰,单元测试也将更加容易。
下面这个示例将说明如何创建一个表示三维向量的简单数据类,但这可以很容易地扩展为表示不同数据的任意组合:
from dataclasses import dataclass
# Definedataclass
@dataclass
classVector3D:
x: int
y: int
z: int
# Create a vector
u =Vector3D(1,1,-1)
# Outputs: Vector3D(x=1,y=1, z=-1)
print(u)
在这里,你可以看到数据类的定义与声明普通类非常相似,只是我们先用了@dataclass
,然后每个字段的名称都是name:type
。
虽然我们创建的Vector3D
功能有限,但是数据类的目的只是提高效率并减少代码中的错误,传递Vector3D
比传递int
变量要好得多。
以上就是W3Cschool编程狮
关于Python 3中被忽视了的三大重要功能的相关介绍了,希望对大家有所帮助。