[译] 关于 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 附带了四种额外的抽象类型,其层次结构从最通用的数字类型开始,如下所示:

  1. Complex 类用于表示复数。有一种内置的具体 Complex 类型:​​complex​​。
  2. Real 类用于表示实数。有一种内置的具体 Real 类型:​​float​​。
  3. Rational 类用于表示有理数。有一种内置的具体 Rational 类型:​​Fraction​​。
  4. 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 件事

关于WebAssembly你需要知道的7个大事件译

译:什么是Spring AOP?

软件测试人员需要了解关于自动化的什么(译)

python函数的4个你可能不知道的事

[译] 在2018年你应该知道的9个关于CSS组件化的JS库