[译] 关于 Python 中的数字你可能不知道的 3 件事
Posted 宇宙之一粟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[译] 关于 Python 中的数字你可能不知道的 3 件事相关的知识,希望对你有一定的参考价值。
如果您使用 Python 进行过任何编码,那么您很有可能在某个程序中使用了数字。例如,您可能使用整数来指定列表中值的索引。 但是 Python 中的数字不仅仅是它们的原始值。让我们看看你可能不知道的关于 Python 中数字的三件事。
1. 数字有方法
Python 中有个概念叫做:一切皆对象。您在 Python 中学习的第一个对象 "HelloWorld"
是表示字符串的 str
对象。
然后你学习了字符串有方法,例如 .lower()
方法,它返回一个全小写字符的新字符串:
>>> "HELLO".lower()
hello
比如首字母大写 capitalize()
, 返回字符串的副本,其第一个字符大写,其余小写。
>>> mystring = "hello python"
>>> print(mystring.capitalize())
Hello python
Python 中的数字也是对象,就像字符串一样,也有自己的方法。例如,您可以使用 .to_bytes()
方法:
>>> n = 255
>>> n.to_bytes(length=2, byteorder="big")
b\\x00\\xff
其中,length
参数指定了要在字符串中使用的字节数,byteorder
参数确定字节的顺序。例如,将 byteorder
设置为 “big”会返回一个字节字符串,其中最重要的字节在前,而将 byteorder
设置为 "little"
则将最不重要的字节放在最前面。
>>> n.to_bytes(length=2, byteorder="little")
b\\xff\\x00
255 是可以表示为 8 位整数的最大整数,因此您可以在 .to_bytes()
中设置 length=1
也没有问题:
>>> n.to_bytes(length=1, byteorder="big")
b\\xff
但是,如果在 .to_bytes()
中将 length=1
设置为 256,则会收到 OverflowError 错误:
>>> n = 256
>>> n.to_bytes(length=1, byteorder="big")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: int too big to convert
您可以使用 .from_bytes()
类方法将字节字符串转换为整数:
>>> int.from_bytes(b\\x06\\xc1, byteorder="big")
1729
类方法是从类名而不是类实例调用的,这就是在上面的 int
上调用 .from_bytes()
方法的原因。
浮点数也有方法。也许对浮点数最有用的方法是 .is_integer()
,它用于检查浮点数是否没有小数部分:
>>> n = 2.0
>>> n.is_integer()
True
>>> n = 3.14
>>> n.is_integer()
False
一种有趣的浮点方法是 .as_integer_ratio()
方法,它返回一个元组,其中包含表示浮点值的分数的分子和分母:
>>> n = 0.75
>>> n.as_integer_ratio()
(3, 4)
但是,由于浮点表示错误,此方法可能会返回一些意外值:
>>> n = 0.1
>>> n.as_integer_ratio()
(3602879701896397, 36028797018963968)
如果需要,您可以通过用括号括住文字来调用数字类型上的方法:
>>> (255).to_bytes(length=1, byteorder="big")
b\\xff
>>> (3.14).is_integer()
False
如果你没有用括号括起整数文字,当你调用一个方法时你会看到一个 SyntaxError
——尽管奇怪的是,你不需要带有浮点文字的括号:
>>> 255.to_bytes(length=1, byteorder="big")
File "<stdin>", line 1
255.to_bytes(length=1, byteorder="big")
^
SyntaxError: invalid syntax
>>> 3.14.is_integer()
False
您可以在文档中找到 Python 数字类型可用方法的完整列表:
2. 数字有层次结构
在数学中,数字具有自然的层次结构。例如,所有自然数都是整数,所有整数都是有理数,所有有理数都是实数,所有实数都是复数。
Python 中的数字也是如此。这个“数字塔”通过 numbers
模块来表示。
数字塔
Python 中的每个数字都是 Number
类的一个实例:
>>> from numbers import Number
>>> # Integers inherit from Number
>>> isinstance(1729, Number)
True
>>> # Floats inherit from Number
>>> isinstance(3.14, Number)
True
>>> # Complex numbers inherit from Number
>>> isinstance(1j, Number)
True
如果您需要检查 Python 中的值是否为数字,但您不关心该值是什么类型的数字,请使用 isinstance(value, Number)
。
Python 附带了四种额外的抽象类型,其层次结构从最通用的数字类型开始,如下所示:
- Complex 类用于表示复数。有一种内置的具体 Complex 类型:
complex
。 - Real 类用于表示实数。有一种内置的具体 Real 类型:
float
。 - Rational 类用于表示有理数。有一种内置的具体 Rational 类型:
Fraction
。 - Integral 类用于表示整数。有两种内置的具体 Integral 类型:
int
和bool
。
你可以在你的终端中验证所有这些:
>>> import numbers
>>> # Complex numbers inherit from Complex
>>> isinstance(1j, numbers.Complex)
True
>>> # Complex numbers are not Real
>>> isinstance(1j, numbers.Real)
False
>>> # Floats are Real
>>> isinstance(3.14, numbers.Real)
True
>>> # Floats are not Rational
>>> isinstance(3.14, numbers.Rational)
False
>>> # Fractions are Rational
>>> from fractions import Fraction
>>> isinstance(Fraction(1, 2), numbers.Rational)
True
>>> # Fractions are not Integral
>>> isinstance(Fraction(1, 2), numbers.Integral)
False
>>> # Ints are Integral
>>> isinstance(1729, numbers.Integral)
True
>>> # Bools are Integral
>>> isinstance(True, numbers.Integral)
True
>>> True == [译] 关于 WebAssembly 你应该知道的 7 件事