欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 的 sum() Pythonic 的求和方法詳細(xì)

 更新時(shí)間:2021年10月15日 15:45:32   作者:Yuchuan  
Python 的內(nèi)置函數(shù)sum()是一種對(duì)數(shù)值列表求和的有效且Pythonic 的方法。將多個(gè)數(shù)字相加是許多計(jì)算中常見的中間步驟,因此sum()對(duì)于 Python 程序員來(lái)說是一個(gè)非常方便的工具。下面文章就讓我們一起來(lái)看具體內(nèi)容吧

前言:

我們現(xiàn)在可以使用 Python 的內(nèi)置函數(shù)sum()將多個(gè)數(shù)值相加。此函數(shù)提供了一種高效、可讀且 Pythonic 的方法來(lái)解決代碼中的求和問題。如果您正在處理需要對(duì)數(shù)值求和的數(shù)學(xué)計(jì)算,那么它sum()可以成為您的救星。

Python 的內(nèi)置函數(shù)sum()是一種對(duì)數(shù)值列表求和的有效且Pythonic 的方法。將多個(gè)數(shù)字相加是許多計(jì)算中常見的中間步驟,因此sum()對(duì)于 Python 程序員來(lái)說是一個(gè)非常方便的工具。

作為一個(gè)額外的和有趣的使用情況,您可以連接列表和元組使用sum(),當(dāng)你需要拼合列表的列表,可以很方便。

在本教程中,我們將學(xué)習(xí)如何:

  • 使用通用技術(shù)和工具手工對(duì)數(shù)值求和
  • 使用Pythonsum()高效地添加多個(gè)數(shù)值
  • 拼接列表和元組與sum()
  • 使用sum()接近普通求和問題
  • 使用適當(dāng)?shù)闹档膮?shù)中sum()
  • 之間做出選擇sum()和替代工具來(lái)總結(jié)和串連對(duì)象

這些知識(shí)將幫助您使用sum()或其他替代和專用工具有效地處理和解決代碼中的求和問題。

1、理解求和問題

將數(shù)值相加是編程中一個(gè)相當(dāng)普遍的問題。例如,假設(shè)您有一個(gè)數(shù)字列表 [1, 2, 3, 4, 5] 并且想要將它們加在一起以計(jì)算它們的總和。使用標(biāo)準(zhǔn)算術(shù),您將執(zhí)行以下操作:

1 + 2 + 3 + 4 + 5 = 15

就數(shù)學(xué)而言,這個(gè)表達(dá)式非常簡(jiǎn)單。它會(huì)引導(dǎo)您完成一系列簡(jiǎn)短的加法,直到您找到所有數(shù)字的總和。

可以手動(dòng)進(jìn)行這個(gè)特定的計(jì)算,但想象一下其他一些不太可能的情況。如果您有一個(gè)特別長(zhǎng)的數(shù)字列表,手動(dòng)添加可能效率低下且容易出錯(cuò)。如果您甚至不知道列表中有多少項(xiàng)會(huì)發(fā)生什么?最后,想象一個(gè)場(chǎng)景,您需要添加的項(xiàng)目數(shù)量動(dòng)態(tài)或不可預(yù)測(cè)地發(fā)生變化。

在這種情況下,無(wú)論您的數(shù)字列表是長(zhǎng)列表還是短列表,Python 在解決求和問題方面都非常有用。

如果您想通過從頭開始創(chuàng)建自己的解決方案來(lái)對(duì)數(shù)字求和,那么您可以嘗試使用for循環(huán):

>>>
>>> numbers = [1, 2, 3, 4, 5]
>>> total = 0

>>> for number in numbers:
...     total += number
...

>>> total
15

在這里,您首先創(chuàng)建total并將其初始化為0. 此變量用作累加器,您可以在其中存儲(chǔ)中間結(jié)果,直到獲得最終結(jié)果。循環(huán)通過使用增廣賦值累加每個(gè)連續(xù)值來(lái)迭代numbers和更新。total

您還可以將for循環(huán)包裝在函數(shù)中。這樣,我們可以為不同的列表重用代碼:

>>>
>>> def sum_numbers(numbers):
...     total = 0
...     for number in numbers:
...         total += number
...     return total
...

>>> sum_numbers([1, 2, 3, 4, 5])
15

>>> sum_numbers([])
0

在 中sum_numbers() ,您將一個(gè)可迭代對(duì)象——特別是一個(gè)數(shù)值列表——作為參數(shù),并返回輸入列表中值的總和。如果輸入列表為空,則函數(shù)返回0。該for循環(huán)與您之前看到的相同。

您還可以使用遞歸代替迭代。遞歸是一種函數(shù)式編程技術(shù),其中函數(shù)在其自己的定義中被調(diào)用。換句話說,遞歸函數(shù)在循環(huán)中調(diào)用自身:

>>>
>>> def sum_numbers(numbers):
...     if len(numbers) == 0:
...         return 0
...     return numbers[0] + sum_numbers(numbers[1:])
...

>>> sum_numbers([1, 2, 3, 4, 5])
15

當(dāng)你定義一個(gè)遞歸函數(shù)時(shí),你冒著陷入無(wú)限循環(huán)的風(fēng)險(xiǎn)。為了防止這種情況,您需要定義停止遞歸的基本情況和調(diào)用函數(shù)并啟動(dòng)隱式循環(huán)的遞歸情況。

在上面的例子中,基本情況意味著零長(zhǎng)度列表的總和是0。遞歸情況意味著總和是第一個(gè)值numbers[0] ,加上其余值的總和numbers[1:] 。由于遞歸情況在每次迭代中使用較短的序列,因此您希望在numbers是零長(zhǎng)度列表時(shí)遇到基本情況。作為最終結(jié)果,您將獲得輸入列表中所有項(xiàng)目的總和numbers。

注意:在此示例中,如果您不檢查空輸入列表(您的基本情況),則sum_numbers()永遠(yuǎn)不會(huì)遇到無(wú)限遞歸循環(huán)。當(dāng)您的numbers列表長(zhǎng)度達(dá)到 時(shí)0,代碼會(huì)嘗試訪問空列表中的項(xiàng)目,這會(huì)引發(fā)IndexError并中斷循環(huán)。

使用這種實(shí)現(xiàn),你永遠(yuǎn)不會(huì)從這個(gè)函數(shù)中得到一個(gè)總和。你IndexError每次都會(huì)得到一個(gè)。

Python 中對(duì)數(shù)字列表求和的另一種選擇是使用reduce()from functools。要獲取數(shù)字列表的總和,我們可以將任一operator.add或適當(dāng)?shù)?code>lambda函數(shù)作為第一個(gè)參數(shù)傳遞給reduce():

>>>
>>> from functools import reduce
>>> from operator import add

>>> reduce(add, [1, 2, 3, 4, 5])
15

>>> reduce(add, [])
Traceback (most recent call last):
    ...
TypeError: reduce() of empty sequence with no initial value

>>> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
15

您可以致電reduce()與減少或折疊,function與一起iterable作為參數(shù)。然后reduce()使用輸入函數(shù)處理iterable并返回單個(gè)累積值。

在第一個(gè)示例中,歸約函數(shù)是add(),它將兩個(gè)數(shù)字相加。最終結(jié)果是 input 中數(shù)字的總和iterable。作為一個(gè)缺點(diǎn),reduce()提出了一個(gè)TypeError當(dāng)你與一個(gè)空的調(diào)用它iterable。

在第二個(gè)示例中,約簡(jiǎn)函數(shù)是一個(gè)lambda返回兩個(gè)數(shù)字相加的函數(shù)。

由于像這樣的求和在編程中很常見,因此每次需要對(duì)一些數(shù)字求和時(shí)編寫一個(gè)新函數(shù)是大量重復(fù)性工作。此外, usingreduce()不是您可用的最易讀的解決方案。

Python 提供了專門的內(nèi)置函數(shù)來(lái)解決這個(gè)問題。該函數(shù)被方便地調(diào)用sum() 。由于它是一個(gè)內(nèi)置函數(shù),因此您可以直接在代碼中使用它,而無(wú)需導(dǎo)入任何內(nèi)容。

2、Python 入門 sum()

可讀性是Python 哲學(xué)背后最重要的原則之一。在對(duì)值列表求和時(shí),可視化您要求循環(huán)執(zhí)行的操作。您希望它遍歷一些數(shù)字,將它們累加到一個(gè)中間變量中,然后返回最終和。但是,您可能可以想象一個(gè)不需要循環(huán)的更易讀的求和版本。您希望 Python 取一些數(shù)字并將它們相加。

現(xiàn)在想想如何reduce()求和。使用reduce()可以說比基于循環(huán)的解決方案更不可讀,更不直接。

這就是為什么將Python 2.3添加sum()為內(nèi)置函數(shù)來(lái)為求和問題提供 Pythonic 解決方案的原因。Alex Martelli貢獻(xiàn)了這個(gè)函數(shù),它現(xiàn)在是對(duì)值列表求和的首選語(yǔ)法:

>>>
>>> sum([1, 2, 3, 4, 5])
15

>>> sum([])
0

哇!這很整潔,不是嗎?它讀起來(lái)像簡(jiǎn)單的英語(yǔ),并清楚地傳達(dá)您在輸入列表上執(zhí)行的操作。使用sum()for循環(huán)或reduce()調(diào)用更具可讀性。與reduce() ,當(dāng)您提供空的可迭代對(duì)象時(shí)sum()不會(huì)引發(fā) a TypeError。相反,它可以理解地返回0.

我們可以sum()使用以下兩個(gè)參數(shù)進(jìn)行調(diào)用:

iterable是一個(gè)必需的參數(shù),可以保存任何 Python 可迭代對(duì)象??傻鷮?duì)象通常包含數(shù)值,但也可以包含列表或元組。
start是一個(gè)可選參數(shù),可以保存一個(gè)初始值。然后將該值添加到最終結(jié)果中。它默認(rèn)為0.
在內(nèi)部,從左到右sum()添加startplus 中的值iterable。輸入iterable中的值通常是數(shù)字,但您也可以使用列表和元組。可選參數(shù)start可以接受數(shù)字、列表或元組,具體取決于傳遞給 的內(nèi)容iterable。它不能帶一個(gè)string。

在以下兩節(jié)中,您將了解sum()在代碼中使用的基礎(chǔ)知識(shí)。

2.1 必需的參數(shù): iterable

接受任何 Python iterable 作為它的第一個(gè)參數(shù)使得sum()泛型、可重用和多態(tài)。由于此功能,您可以使用sum()列表、元組、集合range對(duì)象和字典

>>>
>>> # Use a list
>>> sum([1, 2, 3, 4, 5])
15

>>> # Use a tuple
>>> sum((1, 2, 3, 4, 5))
15

>>> # Use a set
>>> sum({1, 2, 3, 4, 5})
15

>>> # Use a range
>>> sum(range(1, 6))
15

>>> # Use a dictionary
>>> sum({1: "one", 2: "two", 3: "three"})
6
>>> sum({1: "one", 2: "two", 3: "three"}.keys())
6

在所有這些示例中,sum()計(jì)算輸入迭代中所有值的算術(shù)和,而不管它們的類型。在兩個(gè)字典示例中,都調(diào)用sum()返回輸入字典鍵的總和。第一個(gè)示例默認(rèn)對(duì)鍵求和,第二個(gè)示例由于.keys()調(diào)用輸入字典而對(duì)鍵求和。

如果您的字典在其值中存儲(chǔ)數(shù)字,并且您想對(duì)這些值而不是鍵進(jìn)行求和,那么您可以.values()像.keys()示例中那樣使用。

您還可以sum()將列表推導(dǎo)式用作參數(shù)。這是一個(gè)計(jì)算一系列值的平方和的示例:

>>>
>>> sum([x ** 2 for x in range(1, 6)])
55


Python 2.4向該語(yǔ)言添加了生成器表達(dá)式。同樣,sum()當(dāng)您使用生成器表達(dá)式作為參數(shù)時(shí),按預(yù)期工作:

>>>
>>> sum(x ** 2 for x in range(1, 6))
55


這個(gè)例子展示了解決求和問題的最 Pythonic 技術(shù)之一。它在一行代碼中提供了一個(gè)優(yōu)雅、可讀且高效的解決方案。

2.2 可選參數(shù): start

第二個(gè)可選參數(shù)start允許您提供一個(gè)值來(lái)初始化求和過程。當(dāng)您需要按順序處理累積值時(shí),此參數(shù)很方便:

>>>
>>> sum([1, 2, 3, 4, 5], 100)  # Positional argument
115

>>> sum([1, 2, 3, 4, 5], start=100)  # Keyword argument
115


在這里,您提供初始值100to start。凈效果是sum()將此值添加到輸入可迭代中的值的累積總和中。請(qǐng)注意,您可以start作為位置參數(shù)或關(guān)鍵字參數(shù)提供。后一個(gè)選項(xiàng)更加明確和可讀。

如果您沒有為 提供值start,則默認(rèn)為0。默認(rèn)值0確保返回輸入值總和的預(yù)期行為。

3、對(duì)數(shù)值求和

的主要目的sum()是提供一種 Pythonic 方式來(lái)將數(shù)值相加。到目前為止,您已經(jīng)了解了如何使用該函數(shù)對(duì)整數(shù)求和。此外,可以使用sum()任何其他數(shù)字Python類型,比如float,complex,decimal.Decimal,和fractions.Fraction。

以下是使用sum()不同數(shù)字類型的值的幾個(gè)示例:

>>>
>>> from decimal import Decimal
>>> from fractions import Fraction

>>> # Sum floating-point numbers
>>> sum([10.2, 12.5, 11.8])
34.5
>>> sum([10.2, 12.5, 11.8, float("inf")])
inf
>>> sum([10.2, 12.5, 11.8, float("nan")])
nan

>>> # Sum complex numbers
>>> sum([3 + 2j, 5 + 6j])
(8+8j)

>>> # Sum Decimal numbers
>>> sum([Decimal("10.2"), Decimal("12.5"), Decimal("11.8")])
Decimal('34.5')

>>> # Sum Fraction numbers
>>> sum([Fraction(51, 5), Fraction(25, 2), Fraction(59, 5)])
Fraction(69, 2)

在這里,您第一次使用sum()與浮點(diǎn)數(shù)字。值得注意的是,當(dāng)您使用特殊符號(hào)infnan在調(diào)用float("inf")和 中時(shí)函數(shù)的行為float("nan") 。第一個(gè)符號(hào)代表一個(gè)無(wú)限值,因此sum()返回inf。第二個(gè)符號(hào)代表NaN(不是數(shù)字)值。由于您無(wú)法將數(shù)字與非數(shù)字相加,因此您會(huì)得到nan結(jié)果。

其他的例子總和iterablescomplex,DecimalFraction數(shù)字。在所有情況下,sum()使用適當(dāng)?shù)臄?shù)字類型返回結(jié)果累積總和。

4、連接序列

盡管sum()主要用于對(duì)數(shù)值進(jìn)行操作,但您也可以使用該函數(shù)來(lái)連接列表和元組等序列。為此,您需要為 提供適當(dāng)?shù)闹祍tart:

>>>
>>> num_lists = [[1, 2, 3], [4, 5, 6]]
>>> sum(num_lists, start=[])
[1, 2, 3, 4, 5, 6]

>>> # Equivalent concatenation
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]

>>> num_tuples = ((1, 2, 3), (4, 5, 6))
>>> sum(num_tuples, start=())
(1, 2, 3, 4, 5, 6)

>>> # Equivalent concatenation
>>> (1, 2, 3) + (4, 5, 6)
(1, 2, 3, 4, 5, 6)

在這些示例中,您使用sum()連接列表和元組。這是一個(gè)有趣的功能,您可以使用它來(lái)展平列表列表或元組元組。這些示例工作的關(guān)鍵要求是為 選擇適當(dāng)?shù)闹祍tart。例如,如果要連接列表,則start需要持有一個(gè)列表。

在上面的示例中,sum()在內(nèi)部執(zhí)行連接操作,因此它僅適用于支持連接的序列類型,字符串除外:

>>>
>>> num_strs = ["123", "456"]
>>> sum(num_strs, "0")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]


當(dāng)您嘗試使用sum()來(lái)連接字符串時(shí),您會(huì)得到一個(gè)TypeError. 正如異常消息所暗示的那樣,您應(yīng)該使用str.join()來(lái)連接 Python 中的字符串。稍后,當(dāng)您進(jìn)入使用替代sum()方法部分時(shí),您將看到使用此方法的示例。

5、使用 Python 進(jìn)行練習(xí) sum()

到目前為止,您已經(jīng)學(xué)習(xí)了使用sum(). 您已經(jīng)學(xué)習(xí)了如何使用此函數(shù)將數(shù)值相加,以及如何連接列表和元組等序列。

在本節(jié)中,您將查看更多有關(guān)何時(shí)以及如何sum()在代碼中使用的示例。通過這些實(shí)際示例,您將了解到當(dāng)您執(zhí)行需要查找一系列數(shù)字之和作為中間步驟的計(jì)算時(shí),此內(nèi)置函數(shù)非常方便。

您還將了解到這sum()在您使用列表和元組時(shí)會(huì)很有幫助。您將看到的一個(gè)特殊示例是當(dāng)您需要展平列表列表時(shí)。

5.1 計(jì)算累積和

您將編寫的第一個(gè)示例與如何利用start參數(shù)對(duì)數(shù)值的累積列表求和有關(guān)。

假設(shè)您正在開發(fā)一個(gè)系統(tǒng)來(lái)管理給定產(chǎn)品在多個(gè)不同銷售點(diǎn)的銷售。每天,您都會(huì)收到來(lái)自每個(gè)銷售點(diǎn)的銷售單位報(bào)告。您需要系統(tǒng)地計(jì)算累計(jì)總和,以了解整個(gè)公司在一周內(nèi)銷售了多少件商品。要解決此問題,您可以使用sum()

>>>
>>> cumulative_sales = 0

>>> monday = [50, 27, 42]
>>> cumulative_sales = sum(monday, start=cumulative_sales)
>>> cumulative_sales
119

>>> tuesday = [12, 32, 15]
>>> cumulative_sales = sum(tuesday, start=cumulative_sales)
>>> cumulative_sales
178

>>> wednesday = [20, 24, 42]
>>> cumulative_sales = sum(wednesday, start=cumulative_sales)
>>> cumulative_sales
264
    ...

通過使用start,您可以設(shè)置一個(gè)初始值來(lái)初始化總和,這允許您將連續(xù)單位添加到先前計(jì)算的小計(jì)中。在本周末,您將獲得公司的銷售單位總數(shù)。

5.2 計(jì)算樣本的平均值

的另一個(gè)實(shí)際用例sum()是在進(jìn)行進(jìn)一步計(jì)算之前將其用作中間計(jì)算。例如,假設(shè)您需要計(jì)算數(shù)值樣本的算術(shù)平均值。算術(shù)平均值,也稱為平均值,是樣本中值的總和除以值或數(shù)據(jù)點(diǎn)的數(shù)量。

如果你有樣本 [2, 3, 4, 2, 3, 6, 4, 2] 并且你想手工計(jì)算算術(shù)平均值,那么你可以解決這個(gè)操作:

(2 + 3 + 4 + 2 + 3 + 6 + 4 + 2) / 8 = 3.25

如果您想通過使用 Python 加快速度,您可以將其分為兩部分。此計(jì)算的第一部分,即您將數(shù)字相加,是 的任務(wù)sum() 。運(yùn)算的下一部分,即除以 8,使用樣本中的數(shù)字計(jì)數(shù)。要計(jì)算您的除數(shù),您可以使用len()

>>>
>>> data_points = [2, 3, 4, 2, 3, 6, 4, 2]

>>> sum(data_points) / len(data_points)
3.25

在這里,調(diào)用sum()計(jì)算樣本中數(shù)據(jù)點(diǎn)的總和。接下來(lái),您使用len()來(lái)獲取數(shù)據(jù)點(diǎn)的數(shù)量。最后,您執(zhí)行所需的除法以計(jì)算樣本的算術(shù)平均值。

在實(shí)踐中,您可能希望將此代碼轉(zhuǎn)換為具有一些附加功能的函數(shù),例如描述性名稱和檢查空樣本:

>>>
>>> # Python >= 3.8

>>> def average(data_points):
...     if (num_points := len(data_points)) == 0:
...         raise ValueError("average requires at least one data point")
...     return sum(data_points) / num_points
...

>>> average([2, 3, 4, 2, 3, 6, 4, 2])
3.25

>>> average([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in average
ValueError: average requires at least one data point

在內(nèi)部average() ,您首先檢查輸入樣本是否有任何數(shù)據(jù)點(diǎn)。如果沒有,那么你ValueError用一個(gè)描述性的消息來(lái)引發(fā)。在此示例中,您使用walrus 運(yùn)算符將數(shù)據(jù)點(diǎn)的數(shù)量存儲(chǔ)在變量中,num_points以便您無(wú)需len()再次調(diào)用。該return語(yǔ)句計(jì)算樣本的算術(shù)平均值,并將其發(fā)送回調(diào)用代碼。

注意:計(jì)算數(shù)據(jù)樣本的平均值是統(tǒng)計(jì)和數(shù)據(jù)分析中的常見操作。Python 標(biāo)準(zhǔn)庫(kù)提供了一個(gè)方便的模塊,稱為statistics處理這些類型的計(jì)算。

statistics模塊中,您將找到一個(gè)名為 的函數(shù)mean()

>>>
>>> from statistics import mean

>>> mean([2, 3, 4, 2, 3, 6, 4, 2])
3.25

>>> mean([])
Traceback (most recent call last):
    ...
statistics.StatisticsError: mean requires at least one data point

statistics.mean()函數(shù)的行為與average()您之前編碼的函數(shù)非常相似。當(dāng)您mean()使用數(shù)值樣本進(jìn)行調(diào)用時(shí),您將獲得輸入數(shù)據(jù)的算術(shù)平均值。當(dāng)您將空列表傳遞給 時(shí)mean() ,您將獲得一個(gè)statistics.StatisticsError.

請(qǐng)注意,當(dāng)您average()使用適當(dāng)?shù)臉颖菊{(diào)用時(shí),您將獲得所需的平均值。如果您average()使用空樣本調(diào)用,那么您會(huì)得到ValueError預(yù)期的結(jié)果。

5.3 求兩個(gè)序列的點(diǎn)積

您可以使用的另一個(gè)問題sum()是找到兩個(gè)等長(zhǎng)數(shù)值序列的點(diǎn)積。點(diǎn)積的代數(shù)和的產(chǎn)品在輸入序列的每對(duì)值中的。例如,如果您有序列 (1, 2, 3) 和 (4, 5, 6),那么您可以使用加法和乘法手動(dòng)計(jì)算它們的點(diǎn)積:

1 × 4 + 2 × 5 + 3 × 6 = 32

要從輸入序列中提取連續(xù)的值對(duì),您可以使用zip(). 然后您可以使用生成器表達(dá)式將每對(duì)值相乘。最后,sum()可以總結(jié)產(chǎn)品:

>>>
>>> x_vector = (1, 2, 3)
>>> y_vector = (4, 5, 6)

>>> sum(x * y for x, y in zip(x_vector, y_vector))
32

使用zip() ,您可以使用來(lái)自每個(gè)輸入序列的值生成一個(gè)元組列表。生成器表達(dá)式循環(huán)遍歷每個(gè)元組,同時(shí)將先前排列的連續(xù)值對(duì)乘以zip() 。最后一步是使用 將產(chǎn)品添加在一起sum() 。

上面示例中的代碼有效。然而,點(diǎn)積是為等長(zhǎng)的序列定義的,所以如果你提供不同長(zhǎng)度的序列會(huì)發(fā)生什么?在這種情況下,zip()忽略最長(zhǎng)序列中的額外值,這會(huì)導(dǎo)致不正確的結(jié)果。

為了處理這種可能性,我們可以將調(diào)用包裝sum()在自定義函數(shù)中,并為輸入序列的長(zhǎng)度提供適當(dāng)?shù)臋z查:

>>>
>>> def dot_product(x_vector, y_vector):
...     if len(x_vector) != len(y_vector):
...         raise ValueError("Vectors must have equal sizes")
...     return sum(x * y for x, y in zip(x_vector, y_vector))
...

>>> dot_product((1, 2, 3), (4, 5, 6))
32

>>> dot_product((1, 2, 3, 4), (5, 6, 3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in dot_product
ValueError: Vectors must have equal sizes

這里,dot_product()將兩個(gè)序列作為參數(shù)并返回它們對(duì)應(yīng)的點(diǎn)積。如果輸入序列的長(zhǎng)度不同,則該函數(shù)會(huì)引發(fā) a ValueError

在自定義函數(shù)中嵌入功能允許您重用代碼。它還使您有機(jī)會(huì)對(duì)函數(shù)進(jìn)行描述性命名,以便用戶僅通過閱讀函數(shù)名稱就知道該函數(shù)的作用。

5.4 展平列表列表

展平列表列表是 Python 中的一項(xiàng)常見任務(wù)。假設(shè)您有一個(gè)列表列表,需要將其展平為一個(gè)包含原始嵌套列表中所有項(xiàng)目的列表。您可以使用多種方法中的任何一種在 Python 中展平列表。例如,您可以使用for循環(huán),如以下代碼所示:

>>>
>>> def flatten_list(a_list):
...     flat = []
...     for sublist in a_list:
...         flat += sublist
...     return flat
...

>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9],
... ]

>>> flatten_list(matrix)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

在 中flatten_list() ,循環(huán)遍歷 中包含的所有嵌套列表a_list。然后它flat使用增強(qiáng)賦值操作 ( +=)將它們連接起來(lái)。結(jié)果,您會(huì)得到一個(gè)平面列表,其中包含原始嵌套列表中的所有項(xiàng)目。

但是堅(jiān)持??!您已經(jīng)sum()在本教程中學(xué)習(xí)了如何使用來(lái)連接序列。您可以使用該功能來(lái)像上面的示例中那樣展平列表列表嗎?是的!就是這樣:

>>>
>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9],
... ]

>>> sum(matrix, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]

那很快!一行代碼,matrix現(xiàn)在是一個(gè)平面列表。但是,使用sum()似乎不是最快的解決方案。

任何暗示串聯(lián)的解決方案的一個(gè)重要缺點(diǎn)是,在幕后,每個(gè)中間步驟都會(huì)創(chuàng)建一個(gè)新列表。這在內(nèi)存使用方面可能非常浪費(fèi)。最終返回的列表只是在每一輪連接中創(chuàng)建的所有列表中最近創(chuàng)建的列表。使用列表推導(dǎo)式可確保您只創(chuàng)建和返回一個(gè)列表:

>>>
>>> def flatten_list(a_list):
...     return [item for sublist in a_list for item in sublist]
...

>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9],
... ]

>>> flatten_list(matrix)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

這個(gè)新版本flatten_list()在內(nèi)存使用方面效率更高,浪費(fèi)更少。然而,嵌套的理解可能難以閱讀和理解。

使用.append()可能是扁平化列表列表最易讀和 Pythonic 的方式:

>>>
>>> def flatten_list(a_list):
...     flat = []
...     for sublist in a_list:
...         for item in sublist:
...             flat.append(item)
...     return flat
...

>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9],
... ]

>>> flatten_list(matrix)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

在這個(gè)版本中flatten_list() ,一個(gè)人閱讀你的代碼可以看出,功能遍歷每個(gè)sublista_list。在第一個(gè)for循環(huán)中,它遍歷每個(gè)iteminsublist以最終flat使用.append(). 就像前面的推導(dǎo)一樣,這個(gè)解決方案在這個(gè)過程中只創(chuàng)建了一個(gè)列表。這種解決方案的一個(gè)優(yōu)點(diǎn)是它的可讀性很強(qiáng)。

6、使用替代品 sum()

正如您已經(jīng)了解到的,sum()一般來(lái)說,對(duì)于處理數(shù)值很有幫助。但是,在處理浮點(diǎn)數(shù)時(shí),Python 提供了一種替代工具。在 中math,您會(huì)找到一個(gè)名為的函數(shù)fsum() ,它可以幫助您提高浮點(diǎn)計(jì)算的總體精度。

您可能有一項(xiàng)任務(wù),您希望連接或鏈接多個(gè)可迭代對(duì)象,以便您可以將它們作為一個(gè)整體處理。對(duì)于這種情況,您可以查看itertools模塊的 function chain() 。

您可能還有一個(gè)要連接字符串列表的任務(wù)。您在本教程中了解到,無(wú)法sum()用于連接字符串。這個(gè)函數(shù)不是為字符串連接而構(gòu)建的。最 Pythonic 的替代方法是使用str.join().

6.1 對(duì)浮點(diǎn)數(shù)求和: math.fsum()

如果您的代碼不斷使用 對(duì)浮點(diǎn)數(shù)求和sum() ,那么您應(yīng)該考慮math.fsum()改用 。此函數(shù)比 更仔細(xì)地執(zhí)行浮點(diǎn)計(jì)算sum(),從而提高計(jì)算精度。

根據(jù)其文檔,fsum()“通過跟蹤多個(gè)中間部分和來(lái)避免精度損失?!?該文檔提供了以下示例:

>>>
>>> from math import fsum

>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999

>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0

使用fsum() ,您可以獲得更精確的結(jié)果。但是,您應(yīng)該注意這fsum()并不能解決浮點(diǎn)運(yùn)算中的表示錯(cuò)誤。以下示例揭示了此限制:

>>>
>>> from math import fsum

>>> sum([0.1, 0.2])
0.30000000000000004

>>> fsum([0.1, 0.2])
0.30000000000000004

在這些示例中,兩個(gè)函數(shù)返回相同的結(jié)果。這是因?yàn)椴豢赡軠?zhǔn)確地表示這兩個(gè)值0.1和0.2二進(jìn)制浮點(diǎn)數(shù):

>>>
>>> f"{0.1:.28f}"
'0.1000000000000000055511151231'

>>> f"{0.2:.28f}"
'0.2000000000000000111022302463'

sum()但是,與 不同的是,fsum()當(dāng)您將非常大和非常小的數(shù)字相加時(shí),可以幫助您減少浮點(diǎn)錯(cuò)誤傳播:

>>>
>>> from math import fsum

>>> sum([1e-16, 1, 1e16])
1e+16
>>> fsum([1e-16, 1, 1e16])
1.0000000000000002e+16

>>> sum([1, 1, 1e100, -1e100] * 10_000)
0.0
>>> fsum([1, 1, 1e100, -1e100] * 10_000)
20000.0

哇!第二個(gè)例子非常令人驚訝并且完全失敗sum() 。使用sum(),您將得到0.0結(jié)果。這與 的正確結(jié)果相去甚遠(yuǎn)20000.0,正如您所得到的fsum() 。

6.2 連接可迭代對(duì)象 itertools.chain()

如果您正在尋找一個(gè)方便的工具來(lái)連接或鏈接一系列可迭代對(duì)象,請(qǐng)考慮使用chain()from itertools。此函數(shù)可以采用多個(gè)迭代器并構(gòu)建一個(gè)迭代器,該迭代器從第一個(gè)、第二個(gè)中產(chǎn)生項(xiàng)目,依此類推,直到耗盡所有輸入迭代:

>>>
>>> from itertools import chain

>>> numbers = chain([1, 2, 3], [4, 5, 6], [7, 8, 9])
>>> numbers
<itertools.chain object at 0x7f0d0f160a30>
>>> next(numbers)
1
>>> next(numbers)
2

>>> list(chain([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

當(dāng)您調(diào)用 時(shí)chain(),您會(huì)從輸入可迭代對(duì)象中獲得項(xiàng)目的迭代器。在本例中,您可以numbers使用訪問連續(xù)的項(xiàng)目next()。如果你想使用一個(gè)列表,那么你可以使用它list()來(lái)使用迭代器并返回一個(gè)常規(guī)的 Python 列表。

chain() Python 中展平列表列表也是一個(gè)不錯(cuò)的選擇:

>>>
>>> from itertools import chain

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> list(chain(*matrix))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

要使用 扁平化列表列表chain() ,您需要使用可迭代解包運(yùn)算符( *)。此運(yùn)算符解包所有輸入可迭代對(duì)象,以便chain()可以使用它們并生成相應(yīng)的迭代器。最后一步是調(diào)用list()以構(gòu)建所需的平面列表。

6.3 連接字符串 str.join()

正如您已經(jīng)看到的,sum()不連接或連接字符串。如果您需要這樣做,那么 Python 中可用的首選和最快的工具是str.join(). 此方法將一系列字符串作為參數(shù)并返回一個(gè)新的連接字符串:

>>>
>>> greeting = ["Hello,", "welcome to", "Real Python!"]

>>> " ".join(greeting)
'Hello, welcome to Real Python!'

使用.join()是連接字符串的最有效和 Pythonic 的方式。在這里,您使用字符串列表作為參數(shù)并從輸入構(gòu)建單個(gè)字符串。請(qǐng)注意,.join()在連接期間使用您調(diào)用方法的字符串作為分隔符。在此示例中,您調(diào)用.join()由單個(gè)空格字符 ( " ")組成的字符串,因此原始字符串 fromgreeting在最終字符串中由空格分隔。

7、結(jié)論

您現(xiàn)在可以使用 Python 的內(nèi)置函數(shù)sum()將多個(gè)數(shù)值相加。此函數(shù)提供了一種高效、可讀且 Pythonic 的方法來(lái)解決代碼中的求和問題。如果您正在處理需要對(duì)數(shù)值求和的數(shù)學(xué)計(jì)算,那么它sum()可以成為您的救星。

到此這篇關(guān)于Python 的 sum() Pythonic 的求和方法詳細(xì)的文章就介紹到這了,更多相關(guān)Python 的 sum() Pythonic 的求和方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • matplotlib 三維圖表繪制方法簡(jiǎn)介

    matplotlib 三維圖表繪制方法簡(jiǎn)介

    這篇文章主要介紹了matplotlib 三維圖表繪制方法簡(jiǎn)介,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python 解壓、復(fù)制、刪除 文件的實(shí)例代碼

    python 解壓、復(fù)制、刪除 文件的實(shí)例代碼

    這篇文章主要介紹了python 解壓、復(fù)制、刪除 文件的實(shí)例代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解python使用金山詞霸的翻譯功能(調(diào)試工具斷點(diǎn)的使用)

    詳解python使用金山詞霸的翻譯功能(調(diào)試工具斷點(diǎn)的使用)

    這篇文章主要介紹了詳解python使用金山詞霸的翻譯功能(調(diào)試工具斷點(diǎn)的使用),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Python八大常見排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    Python八大常見排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    這篇文章主要介紹了Python八大常見排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析,結(jié)合具體實(shí)例形式對(duì)比分析了冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序等排序算法的使用與執(zhí)行效率,需要的朋友可以參考下
    2018-04-04
  • python基礎(chǔ)教程之對(duì)象和類的實(shí)際運(yùn)用

    python基礎(chǔ)教程之對(duì)象和類的實(shí)際運(yùn)用

    這篇文章主要介紹了python基礎(chǔ)教程之對(duì)象和類的實(shí)際運(yùn)用,本文講解對(duì)象和類的一方法技巧,例如屬性、內(nèi)置方法、self關(guān)鍵字的運(yùn)用等,需要的朋友可以參考下
    2014-08-08
  • 使用?OpenCV-Python?識(shí)別答題卡判卷功能

    使用?OpenCV-Python?識(shí)別答題卡判卷功能

    這篇文章主要介紹了使用?OpenCV-Python?識(shí)別答題卡判卷,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 如何在Django中使用聚合的實(shí)現(xiàn)示例

    如何在Django中使用聚合的實(shí)現(xiàn)示例

    這篇文章主要介紹了如何在Django中使用聚合的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Request的中斷和ErrorHandler實(shí)例解析

    Request的中斷和ErrorHandler實(shí)例解析

    這篇文章主要介紹了Request的中斷和ErrorHandler實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python列表字典排序的實(shí)現(xiàn)示例

    python列表字典排序的實(shí)現(xiàn)示例

    在Python中,對(duì)列表字典進(jìn)行排序是一項(xiàng)常見的任務(wù),本文主要介紹了python列表字典排序的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • YUV轉(zhuǎn)為jpg圖像的實(shí)現(xiàn)

    YUV轉(zhuǎn)為jpg圖像的實(shí)現(xiàn)

    今天小編就為大家分享一篇YUV轉(zhuǎn)為jpg圖像的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-12-12

最新評(píng)論