python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...
建議不是你不應該使用True,False或None。這只是你不應該使用如果x == True。
如果x == True是愚蠢的,因為==只是一個二進制運算符!它的返回值為True或False,取決于它的參數是否相等。如果條件為真,則條件將繼續。所以當你寫如果x == True Python將首先評估x == True,如果x是True和False否則將變為True,然后繼續,如果結果是真的。但是如果你期望x是True或False,為什么不直接使用x?
同樣,x == False通常可以由x替換。
在某些情況下,你可能想使用x == True。這是因為if語句條件是“在布爾上下文中評估”,以查看它是否為“真實”,而不是完全對照True。例如,非空字符串,列表和字典都被if語句視為真實的,以及非零數字值,但這些都不等于True。所以如果你想測試一個任意值是否正確的值True,不只是它是否為真,當你會使用如果x == True。但我幾乎從來沒有看到一個用途。它是如此罕見,如果你需要寫,這是值得添加一個評論,所以未來的開發人員(包括可能自己)不只是假設== True是多余的,并刪除它。
使用x是真的,而實際上更糟。你永遠不應該使用基本的內置不可變類型,如布爾值(True,False),數字和字符串。原因是,對于這些類型,我們關心價值,而不是身份。 ==測試這些類型的值是否相同,而始終是測試標識。
測試標識而不是值是壞的,因為一個實現可以理論上構造新的布爾值,而不是去找到現有的值,導致您有兩個True值具有相同的值,但存儲在不同的內存中,具有不同的身份。在實踐中我很確定True和False總是被Python解釋器重用,所以這不會發生,但這是一個實現細節。這個問題使人們一直使用字符串,因為直接出現在程序源中的短字符串和字符串會被Python重用,所以’foo’是’foo’總是返回True。但是很容易構造相同的字符串2種不同的方式,并讓Python給他們不同的身份。請注意以下事項:
>>> stars1 = ''.join('*' for _ in xrange(100))
>>> stars2 = '*' * 100
>>> stars1 is stars2
False
>>> stars1 == stars2
True
編輯:所以事實證明,Python的平等布爾是一個有點意想不到的(至少對我):
>>> True is 1
False
>>> True == 1
True
>>> True == 2
False
>>> False is 0
False
>>> False == 0
True
>>> False == 0.0
True
正如the notes when bools were introduced in Python 2.3.5中解釋的那樣,使用整數1和0來表示True和False的舊行為是好的,但是我們只是想要更多描述性的名稱用于表示真值的數字。
一種實現方法是在內置函數中只有True = 1和False = 0;那么1和True真的會無法區分(包括by)。但這也意味著一個函數返回True將在交互式解釋器中顯示為1,因此所做的是將bool創建為int的子類型。唯一不同的是bool是str和repr; bool實例仍然具有與int實例相同的數據,并且仍然以相同的方式比較等式,所以True == 1。
所以這是錯誤的使用x是True,當x可能已經設置了一些代碼,希望“真是只是另一種方式拼寫1”,因為有很多方法來構造值等于True,但沒有相同的身份:
>>> a = 1L
>>> b = 1L
>>> c = 1
>>> d = 1.0
>>> a == True, b == True, c == True, d == True
(True, True, True, True)
>>> a is b, a is c, a is d, c is d
(False, False, False, False)
并且使用x == True是錯誤的,當x可以是一個任意的Python值,你只想知道它是否是布爾值True。我們唯一確定的是,只是使用x是最好的,當你只是想測試“誠實”。幸好這通常是所有必需的,至少在我寫的代碼!
一個更確定的方式是x == True和type(x)是bool。但是對于一個很晦澀的情況,這變得很冗長。它也不看起來非常Pythonic通過進行顯式類型檢查…但這真的是你在做什么,當你試圖精確測試True而不是真實;鴨式鍵入方式將接受真值,并允許任何用戶定義的類聲明自己是真實的。
如果你處理這個非常精確的真理概念,你不僅不認為非空集合是真的,但也不認為1是真的,那么只是使用x是True可能是好的,因為大概那么你知道x沒有來自認為1是真的代碼。我不認為有任何純python的方式來提出另一個True,生活在一個不同的內存地址(雖然你可能從C做),所以這不應該打破,盡管理論上是“錯誤的”事情去做。
我以前認為布爾人很簡單!
結束編輯
然而,在None的情況下,如果x是None,則使用慣用法。在許多情況下,你可以使用if不是x,因為None對于if語句是一個“falsey”值。但是最好只有這樣做,如果你想要以相同的方式來處理所有falsey值(零值數值類型,空集合和無)。如果你正在處理的值是一些可能的其他值或無表示“無值”(例如,當一個函數返回None失敗),那么更好的使用如果x是無,這樣你不會意外地假定函數失敗,當它剛剛發生返回一個空列表,或數字0。
我使用==而不是為不可變的值類型的參數建議你應該使用如果x ==無,而不是如果x是無。但是,在無Python的情況下,顯式保證在整個Universe中只有一個None,而正常的慣用Python代碼使用的是。
關于是返回None還是引發異常,它取決于上下文。
對于像get_attr這樣的例子,我希望它引發異常,因為我要像do_something_with(get_attr(file))一樣調用它。調用者的正常期望是,他們將獲得屬性值,并讓他們獲得無,并假設屬性值是一個更大的危險,比忘記處理異常,當你可以實際繼續,如果屬性不能被發現。此外,返回None以指示失敗意味著None不是該屬性的有效值。這在某些情況下可能是一個問題。
對于像see_if_matching_file_exists這樣的虛函數,我們提供了一個模式,它檢查幾個地方,看看是否有匹配,如果找到一個匹配可以返回一個匹配,如果沒有匹配,則返回None。但也可以返回一個匹配列表;那么沒有匹配只是空列表(這也是“falsey”;這是其中一種情況,我只是使用如果x看看是否有什么回來)。
因此,當選擇異常和無指示失敗時,必須確定None是否為預期的非失敗值,然后查看調用函數的代碼的期望值。如果“正常”期望是將返回有效值,并且只有偶爾會調用者能夠正常工作,無論是否返回有效值,那么您應該使用異常來指示失敗。如果沒有有效的值會很常見,因此調用者將期望處理這兩種可能性,那么您可以使用None。
總結
以上是生活随笔為你收集整理的python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs点击方法跳不到对于的地方_内脏脂肪怎
- 下一篇: 修改固态硬盘的物理序列号_买固态怕踩坑?