python布爾類型和邏輯運算

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/12/15/10124444.html
-Advertisement-
Play Games

布爾類型 python中True表示真,False表示假,它們是布爾類型: 在python中,bool的True和False是數值1和0的字元串表示格式,實際上 bool類型是int類型的一個子類 。 因為True/False是數值1和0的另一種表示方式,它們可以直接參与數值運算。 True/Fal ...


布爾類型

python中True表示真,False表示假,它們是布爾類型:

>>> type(True)
<class 'bool'>

在python中,bool的True和False是數值1和0的字元串表示格式,實際上bool類型是int類型的一個子類

>>> bool.__bases__
(<class 'int'>,)

因為True/False是數值1和0的另一種表示方式,它們可以直接參与數值運算。

>>> True + 2
3
>>> False + 2 - 1
1

True/False的各種形式

雖然True代表1,False代表0。但實際上,python中的任何一個數據對象要麼是True,要麼是False,所以可以直接在布爾測試的表達式中使用,而並非一定要去大小比較、通過函數測試等等。比如:

if "a":
while 1:

可以通過bool()函數來測試數據對象、表達式是True還是False。例如:

>>> bool(0)
False
>>> bool(1)
True
>>> bool('a')
True
>>> bool('')
False

那麼,哪些類型的數據是True,哪些類型的數據是False?

  • 整數值0、浮點數值0.0等、空字元串都為假
  • None為假
  • 空數據對象都是假,比如[]{}()
    • 元組比較特殊,如果元組中有元素,但全是為假的元素,則也為假

以下是各種內置數據類型的一些真、假示例:

          True                 False
        ----------------------------------
number:   1、1.1               0、0.0
string:   'a'                  ''
None:                          None
list:     ['a']、[1]           []
       [0]、['']、[None]
Set/Dict: {'a'}                {}
tuple:    ('a')、(1)           ()、('')、(0)、(None)

看幾個示例:

>>> bool(1), bool(0)
(True, False)

>>> bool('a'), bool('')
(True, False)

>>> bool(None)
False

>>> bool(['a']), bool([1]), bool([]), bool(['']), bool([()])
(True, True, False, True, True)

>>> bool({'a'}), bool({}), bool({''})
(True, False, True)

>>> bool(('a')), bool(()), bool(('')), bool((0)), bool(({}))
(True, False, False, False, False)

None

None為假,它不是表示對象為空,也不是表示對象未定義。它自身就是一個實實在在的數據對象,在記憶體中有自己的記憶體地址。可以認為,None是一種特殊的數據對象,像數值1、字元串'a'一樣,只不過記憶體中這個數據對象裡面存儲的數據是我們不得而知的,但它永遠表示為False

在Python中,沒有顯式定義return語句的函數、方法並不意味著沒有返回值,它們的預設返回值是None。比如print()函數:

>>> a=print("aa")
aa
>>> print(a)
None

None有時候有些小技巧。比如,訪問或設置超出列表長度的元素時會報錯:

>>> S = []
>>> S[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> S[1] = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

但是可以預先將某些數量的None對象填充到列表中去,這樣列表就具備了元素,儘管它們都是None對象。

例如,向列表中填充10個None元素:

>>> S = [None] * 10
>>> S
[None, None, None, None, None, None, None, None, None, None]
>>> S[1]
>>> S[1] = 2
>>> S
[None, 2, None, None, None, None, None, None, None, None]

當然,將None換成其它數據也一樣可以,比如0,但用None來填充,一看就知道是為了填充而填充的占位符,不是實際要操作的元素。

另外,預先填充並不能限制列表的長度,可以繼續向這個列表中append()新元素。

邏輯運算:and、or、not

python中只支持字元形式的and、or、not邏輯運算,不支持符號類型的&&、||、!

  • X and Y:X和Y都為真時,返回真
  • X or Y:X或Y為真,返回真
  • not X:X真假取反

需要註意,and和or會短路運算(即只要能確定真假關係,就立即停止運算),並返回運算的結果(不是返回True/False,而是返回表達式的運算結果)。而not運算是返回True/False的。

例如,and的邏輯運算:

>>> 2 and 3, 3 and 2
(3, 2)
>>> [] and {}
[]
>>> 3 and []
[]

上面第一行and測試,因為and左邊的都是True,所以必須得評估and右邊的值,那麼不管and右邊是True還是False,都會返回and右邊的值,比如第一行and測試,第三行and測試。第二行and測試中,因為and左邊為False,所以直接能確定為False,所以直接短路返回[]

再看or邏輯運算:

>>> 2 or 3,3 or 2
(2, 3)
>>> [] or 3
3
>>> [] or {}
{}

上面第一行or測試,因為or左邊已經能直接確定為True,所以直接短路返回or左邊的值。第二行和第三行or測試,因為or左邊都為False,所以必須測試右邊的,所以不管or右邊是True還是False,都返回or右邊的值。

再次說明,and、or返回的不是True/False的布爾值,而是邏輯表達式的運算結果。但因為python中只要是數據,要麼是True,要麼是False,所以and/or/not都可以用於真假測試,只不過and/or還可以在布爾測試的基礎上進行賦值操作。

例如,如果變數a為False,就賦值為某個值,否則採用a原有的值。

a = a or "hhhh"

更通用的,變數A取X、Y、Z等表達式中的一個。

A = X or Y
A = X or Y or Z

不僅如此,and/or還能實現if中選擇值的功能。例如,下麵是等價的:

A = (( X and Y) or Z)

if X:
  A = Y
else:
  A = Z

當然,這種用and/or實現邏輯的可讀性太差,能用if的當然用if。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • lua中有兩種閉包, c閉包和lua閉包 兩種閉包的公共部分: C閉包的結構 結構比較簡單, f是一個滿足 int lua_func(lua_State ) 類型的c函數 upvalue是創建C閉包時壓入的upvalue, 類型是TValue, 可以得知, upvalue可以是任意的lua類型 Lu ...
  • Python開髮菜鳥入坑 項目要求pdf轉成圖片,網上較多的方案對於windows極其不友好,wand,Pythonmagick(win下載地址:www.lfd.uci.edu/~gohlke/pythonlibs/#pythonmagick),imagemagick(win下載地址:www.ima ...
  • Inno Setup 系列之安裝、卸載前檢測進程運行情況並關閉相應進程 ...
  • 從頭開始學習OI之Tarjan. 今天重新學習了Tarjan演算法..來這裡寫一下學習筆記...但是我太菜了..還是講不好怎麼辦... ...
  • 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重覆的三元組。 註意:答案中不可以包含重覆的三元組。 我們先對數組排序,得到如下圖的結果 我們要計算a+b+c=0,先對數組迴圈得到a,然後b就是a的索 ...
  • 題目內容: 這一周的編程題是需要你在課程所給的時鐘程式的基礎上修改而成。但是我們並不直接給你時鐘程式的代碼,請根據視頻自己輸入時鐘程式的Display和Clock類的代碼,然後來做這個題目。 我們需要給時鐘程式加上一個表示秒的Display,然後為Clock增加以下public的成員函數: publ ...
  • 一 在下麵兩種情況下使用靜態方法: 1.當一個方法不需要訪問對象轉態,其所需的參數讀書通過顯示參數提供的(例如 Math.pow). 2.當一個方法只需要訪問類靜態域(enployee.getNextld). 二 方法參數的使用情況 一個方法不能修改一個基本數據類型的參數(即數值型和布爾型). 一個 ...
  • 等值、大小比較 在python中, 只要兩個對象的類型相同,且它們是內置類型(字典除外),那麼這兩個對象就能進行比較 。關鍵詞:內置類型、同類型。所以,兩個對象如果類型不同,就沒法比較,比如數值類型的數值不能和字元串類型的數值或字母比較。 對於python中的等值、不等值、大小比較的規則為何如此,以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...