中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

如何在Python中使用any()

發(fā)布于:2021-02-18 00:00:23

0

150

0

基礎知識 python 程序員 any()

作為Python程序員,您經常會處理布爾和條件語句,有時非常復雜。在這些情況下,您可能需要依賴于能夠簡化邏輯和整合信息的工具。幸運的是,Python中的any()就是這樣一個工具。它檢查iterable中的元素并返回一個值,該值指示在布爾上下文中是否有任何元素為true,或truthy.

如何在Python中使用any()

假設您正在為雇主的招聘部門編寫一個程序。您可能希望安排面試符合以下任何條件的候選人:

  1. 已經了解Python

  2. 有五年或五年以上的開發(fā)經驗

  3. 有學位

可以用來編寫此條件表達式的一個工具是or

# recruit_developer.py
def schedule_interview(applicant):
   print(f"Scheduled interview with {applicant['name']}")

applicants = [
   {
       "name": "Devon Smith",
       "programming_languages": ["c++", "ada"],
       "years_of_experience": 1,
       "has_degree": False,
       "email_address": "devon@email.com",
   },
   {
       "name": "Susan Jones",
       "programming_languages": ["python", "javascript"],
       "years_of_experience": 2,
       "has_degree": False,
       "email_address": "susan@email.com",
   },
   {
       "name": "Sam Hughes",
       "programming_languages": ["java"],
       "years_of_experience": 4,
       "has_degree": True,
       "email_address": "sam@email.com",
   },
]
for applicant in applicants:
   knows_python = "python" in applicant["programming_languages"]
   experienced_dev = applicant["years_of_experience"] >= 5

   meets_criteria = (
       knows_python
       or experienced_dev
       or applicant["has_degree"]
   )
   if meets_criteria:
       schedule_interview(applicant)

例如,如果申請人符合您的三個標準中的任何一個,您可以檢查每個申請人的證書并安排面試。

技術細節(jié):Python的any()or不限于評估布爾表達式。相反,Python對每個參數執(zhí)行真值測試,評估表達式是truthy還是falsy。例如,非零整數值被認為是真實的,零被認為是虛假的:

>>> 1 or 0
1

在本例中,or將非零值1計算為真實的,即使它不是布爾類型。or返回1,不需要評估0的真實性。在本教程的后面部分,您將了解有關or

的返回值和參數求值的更多信息。

如果您執(zhí)行此代碼,然后你會看到Susan和Sam將得到面試:

$ python recruit_developer.py
Scheduled interview with Susan Jones
Scheduled interview with Sam Hughes

公司之所以選擇安排Susan和Sam的面試,是因為Susan已經知道Python,Sam也有學位。請注意,每個候選人只需要滿足一個標準。

評估申請人資格的另一種方法是使用any()。在Python中使用any()時,必須將申請人的憑據作為iterable參數傳遞:

for applicant in applicants:
   knows_python = "python" in applicant["programming_languages"]
   experienced_dev = applicant["years_of_experience"] >= 5

   credentials = (
       knows_python,
       experienced_dev,
       applicant["has_degree"],
   )
   if any(credentials):
       schedule_interview(applicant)

在Python中使用any()時,請記住可以將任何iterable作為參數傳遞:

>>> any([0, 0, 1, 0])
True

>>> any(set((True, False, True)))
True

>>> any(map(str.isdigit, "hello world"))
False

any()循環(huán)使用不同的Python iterable,測試每個元素的真值,直到找到真值或檢查每個元素。

注意:最后一個示例使用Python的內置map(),它返回一個迭代器,其中每個元素都是將字符串中的下一個字符傳遞給str.isdigit()的結果。這是使用any()進行更復雜檢查的一種有用方法。

您可能想知道any()是否僅僅是or的修飾版本。在下一節(jié)中,您將了解這些工具之間的區(qū)別。

如何區(qū)分or和any()

or和之間有兩個主要區(qū)別any():

  • 語法

  • 返回值

首先,您將了解語法如何影響每個工具的可用性和可讀性。其次,您將學習每個工具返回的值的類型。了解這些差異將幫助您確定哪種工具最適合給定的情況。

語法

or是一個運算符,因此它需要兩個參數,每個參數一個在一邊:

>>> True or False
True

any()另一方面,是一個帶有一個參數的函數,它是一個循環(huán)訪問的對象以評估真實性:

>>> any((False, True))
True

語法上的這種差異非常重要,因為它會影響每個工具的可用性和可讀性。例如,如果您有一個Iterable,則可以將Iterable直接傳遞給any()。要從中獲得類似的行為or,您需要使用循環(huán)或類似的函數reduce():

>>> import functools
>>> functools.reduce(lambda x, y: x or y, (True, False, False))
True

在上面的示例中,您曾經reduce()將iterable作為參數傳遞給or。使用可以更有效地完成此操作any,該方法直接接受可迭代對象作為參數。

為了說明每種工具的語法影響其可用性的另一種方式,請設想一下,如果前面的條件是True:

def knows_python(applicant):
   print(f"Determining if {applicant['name']} knows Python...")
   return "python" in applicant["programming_languages"]

def is_local(applicant):
   print(f"Determine if {applicant['name']} lives near the office...")

should_interview = knows_python(applicant) or is_local(applicant)

如果is_local()執(zhí)行時間比較長,那么您knows_python()已經返回時就不想調用它True。這稱為惰性評估或短路評估。默認情況下,or延遲計算條件,而any不會。

在上面的示例中,該程序甚至不需要確定Susan是否是本地用戶,因為它已經確認她知道Python。這樣足以安排一次面試。在這種情況下,延遲調用函數or將是最有效的方法。

為什么不使用它any()呢?您已經在上面學到了any()將Iterable作為參數,Python會根據Iterable類型評估條件。因此,如果您使用列表,Python會在調用列表之前knows_python()和is_local()創(chuàng)建列表的同時執(zhí)行以下操作any():

should_interview = any([knows_python(applicant), is_local(applicant)])

在這里,Python會招募is_local()每個申請人,甚至是那些了解Python的人。因為is_local()執(zhí)行將花費很長時間并且有時是不必要的,所以這是邏輯的低效實現(xiàn)。

當您使用可迭代對象時,有多種方法可以使Python懶惰地調用函數,例如使用map()或使用生成器表達式構建迭代器:

any((meets_criteria(applicant) for applicant in applicants))

本示例使用生成器表達式生成布爾值,該布爾值指示申請人是否滿足面試條件。符合條件的申請人any()將在True不檢查其余申請人的情況下返回。但是請記住,這些類型的變通辦法也存在其自身的問題,可能并不適合每種情況。

要記住的最重要的事情是any()和之間的語法差異or會影響其可用性。

語法并不是影響這些工具可用性的唯一區(qū)別。接下來,讓我們看一下不同的返回值,any()以及or它們如何影響您決定使用哪種工具。

返回值

Pythonany()和or返回不同類型的值。any()返回一個布爾值,該布爾值指示是否在迭代器中找到真實值:

>>> any((1, 0))
True

在此示例中,any()找到一個真實值(整數1),因此它返回了布爾值True。

or另一方面,返回找到的第一個真實值,該值不一定是布爾值。如果沒有真實值,則or返回最后一個值

>>> 1 or 0
1

>>> None or 0
0

在第一示例中,or評估1,這是truthy,并且在不評估返回它0。在第二個示例中,Nonefassy是虛假的,因此接下來要or進行評估0,這也是falsy。但是,由于沒有更多的表達式要檢查,因此or返回最后一個值0。

在確定使用哪種工具時,考慮要知道對象的實際值還是僅在對象集合中某處是否存在真實值時,這會很有幫助。

結論

恭喜你!你學會了插件和使用的出局any()在Python和之間的差異any()和or。通過對這兩個工具有更深入的了解,您已經準備好在自己的代碼中進行選擇。