如何在Python中执行地板除法

在这个教程中,您将学习如何在Python中执行地板除法。您将使用Python的//运算符,Python的math模块中的floor函数等进行演示。

我们将首先概述Python中的算术运算符,并学习地板除法运算符//的工作原理。然后,我们将学习如何使用其他等效方法,包括来自math和operator模块的函数来执行地板除法。

让我们开始吧…

Python中的算术运算符

在Python中,您可以使用算术运算符对int和float数据类型的数字进行简单的算术运算。这些运算符操作数(即数字)并返回操作的结果。

下表总结了Python中的算术运算符及其工作原理:

运算符 语法 结果
加法(+) num1+num2 返回num1num2的和
减法(-) num1-num2 返回num1num2的差
乘法(*) num1*num2 返回num1num2的乘积
指数运算(**) num1**num2 返回num1num2次幂,即num1num2
除法(/) num1/num2 返回num1除以num2的结果,包括小数部分
地板除法(//) num1//num2 返回num1除以num2的商
取模(%) num1 % num2 返回num1除以num2的余数

让我们看一些使用这些算术运算符的例子。您可以在Python REPL或Geekflare’s online Python editor中尝试这些例子。

>>> num1 = 18
>>> num2 = 5

>>> num1 + num2
23

>>> num1 - num2
13

>>> num1 * num2
90

>>> num1 ** num2
1889568

在这个例子中,num1是18,num2是5。除法运算num1/num2返回结果,包括小数部分。

数字5可以被18整除三次,余数为3。因此,地板除法运算num1//num2给出商3,而取模运算符在这种情况下也给出余数3。

>>> num1/num2
3.6

>>> num1//num2
3

>>> num1 % num2
3

这应该让您了解到除法、地板除法和取模运算符的工作原理。接下来,我们将详细介绍地板除法运算符。

⚠️ 在Python 2中,除法运算(/)将结果截断为最接近的整数,类似于Python 3中的地板除法运算。本教程讨论的是Python 3.x中地板除法运算的工作原理。

使用//运算符进行地板除法

考虑一个带有被除数和除数的除法运算。在num1/num2中,num1是被除数,num2是除数。要执行num1num2的地板除法,请使用num1//num2

地板除法运算符(//)返回除法运算的商——根据操作数的数据类型,可以是整数或浮点数。

地板除法运算符不能确保结果始终为整数。如果被除数(num1)或除数(num2)中的任意一个是浮点数,则num1//num2的结果是一个浮点数。以下是一些示例。

>>> 18.0//5
3.0
>>> 10.0//4
2.0
>>> 15//4.0
3.0

如果需要结果为整数,则需要使用int()函数将其显式转换为整数:

>>> int(18.0//5)
3
>>> int(10.0//4)
2
>>> int(15//4.0)
3

底层发生了什么?

当使用地板除法运算符//时,会调用__floordiv__()(也称为dunder方法)。因此,您还可以在任何整数或浮点数上使用__floordiv__()方法,如下所示:

num1 = 18
num2 = 5
num1.__floordiv__(num2)
# 输出:3

使用operator.floordiv()进行地板除法

💡在Python中执行地板除法,还可以使用operator模块中的floordiv()函数。

Python的operator模块包含可以执行所有算术操作的高效函数的定义。因此,要执行地板除法,您还可以使用operator模块的floordiv()函数,而不是//运算符。

使用operator模块的floordiv()函数与使用地板除法运算符等效。

>>> import operator
>>> operator.floordiv(18,5)
# 输出:3
>>> operator.floordiv(12,5.0)
# 输出:2.0

使用math.floor()进行地板除法

floor()函数的工作原理是什么?

在数学中,floor()函数将任何实数x作为输入,并返回一个整数(结果)。这个结果是小于或等于实数x的最大整数

为了更好地理解这一点,让我们举几个例子,并在数轴上可视化这些数字。

示例1:考虑数字2.3。小于或等于2.3的最大整数是2;因此floor(2.3)将返回2。

示例2:当处理负数时,可以应用相同的定义。考虑数字-1.7。小于或等于-1.7的最大整数是-2;因此floor(-1.7)将返回-2。

让我们使用math模块的floor()函数验证上述结果。

>>> from math import floor
>>> floor(2.3)
2
>>> floor(-1.7)
-2

要执行地板除法,可以使用num1/num2作为参数调用floor()函数。由于它将结果截断或向下舍入到最近的整数,它等效于地板除法操作。

可以显式从math模块导入floor()函数,如下所示:

from math import floor
num1 = 18
num2 = 5
floor(num1/num2)
# 输出:3

或者,您也可以仅导入math模块,然后使用math.floor()访问floor()函数。

import math
num1 = 18
num2 = 5
math.floor(num1/num2)
# 输出:3

与operator模块的floordiv()函数和地板除法运算符//不同,使用math.floor(num1/num2)可以确保结果是一个整数。这种方法使代码可读,消除了类型转换步骤。

import math
num1 = 18.0
num2 = 5
math.floor(num1/num2)
# 输出:3

Python中的地板除法示例

让我们通过一个实际例子总结我们的讨论:Binary search。✅

📑 二分查找是一种高效的搜索算法,它允许您在已排序的数组中以O(log n)的时间复杂度搜索目标元素,其中n是数组的大小。

该算法通过在每一步将搜索区间分成两半来工作。这取决于区间的中点是否与目标匹配(如果找到匹配,搜索将结束!)或者中点是否小于或大于目标。由于数组的大小在每一步都减半,中点并不总是等于一个整数。

itemlist = [5,7,18,21,34,45]
item = 7

考虑以下二分查找算法的实现。函数binary_search()接受一个数字(item)和一个列表(itemlist),并在itemlist中搜索item的出现。

  • 如果找到item,函数返回item出现的索引。
  • 否则,返回None
def binary_search(item, itemlist):
    # 获取列表的大小
    listsize = len(itemlist) - 1
    # 从列表的两端开始
    lowerIdx = 0
    upperIdx = listsize

    while lowerIdx  itemlist[midPt]:
            lowerIdx = midPt + 1
        else:
            upperIdx = midPt - 1

    if lowerIdx > upperIdx:
        return None

该实现在功能上是正确的,只是我们没有考虑随着搜索的进行,midPt不总是等于一个整数。

binary_search(item,itemlist)

如果我们调用该函数,将会遇到一个TypeError,指出列表索引必须是整数或切片,而不是浮点数。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
----> 1 binary_search(item,itemlist)

 in binary_search(item, itemlist)
     12 
     13         # 如果找到了item,则返回索引
---> 14         if itemlist[midPt] == item:
     15             return midPt
     16         # 否则获取下一个中点

TypeError: list indices must be integers or slices, not float

我们修改函数定义以使用地板除法运算符:

def binary_search(item, itemlist):
    # 获取列表的大小
    listsize = len(itemlist) - 1
    # 从列表的两端开始
    lowerIdx = 0
    upperIdx = listsize

    while lowerIdx  itemlist[midPt]:
            lowerIdx = midPt + 1
        else:
            upperIdx = midPt - 1

    if lowerIdx > upperIdx:
        return None

该函数返回找到的item 7的索引,即索引为1。

binary_search(item,itemlist)
# 输出: 1

结论

我希望这个教程能帮助你了解如何在Python中执行地板除法。以下是你学到的不同方法的总结:

  • 在Python中,a operator b会执行由操作符定义的操作,a和b作为操作数,并返回操作的结果。
  • 你可以使用Python的地板除法操作符//;a//b返回除法运算a/b的商。
  • 另外,你可以使用Python的operator模块中定义的等效的floordiv()函数,语法如下:operator.floordiv(a,b),来获得a//b的结果。
  • 上述所有方法都返回商,但数据类型可以是浮点数或整数,这取决于a和b的值。因此,你需要将返回值转换为整数。
  • Python的math模块中的floor()函数也可以用来执行地板除法:math.floor(a,b)等同于a//b,并返回一个整数。当你希望结果是一个整数时,考虑使用math模块中的floor函数。

接下来,学习如何使用defaultdict in Python工作。 👩🏽‍💻

类似文章