Python中三目計算符的正確用法及短路邏輯

来源:http://www.cnblogs.com/oddcc/archive/2016/12/26/6224185.html
-Advertisement-
Play Games

今天在看別人代碼時看到這樣一種寫法, 感覺是個挺容易踩到的坑, 搞清楚後寫出來備忘. 短路邏輯 Python中進行邏輯運算的時候, 預設採用的是一種叫做短路邏輯的運算規則. 名字是很形象的, 下麵直接看代碼 可以看到, 雖然1會被當做布爾值計算, 但整個表達式的計算結果卻不一定是布爾值, 而是根據表 ...


今天在看別人代碼時看到這樣一種寫法, 感覺是個挺容易踩到的坑, 搞清楚後寫出來備忘.

短路邏輯

Python中進行邏輯運算的時候, 預設採用的是一種叫做短路邏輯的運算規則. 名字是很形象的, 下麵直接看代碼

print True and 1
# 1
print True or 1
# True
print False and 1
# False
print False or 1
# 1

可以看到, 雖然1會被當做布爾值計算, 但整個表達式的計算結果卻不一定是布爾值, 而是根據表達式的不同而不同. 上面幾個表達式不同的結果, 就是短路邏輯. 用大白話講, 就是一旦Python能判斷整個表達式是True還是False, 就不會進行後續的計算了, 就是邏輯被短路了, 後續的表達式被忽略了.

比如True or 1的結果為True就是因為不管or後面是任何值, 整個式子的結果都必定是True, 所以Python看到True, 看到or, 後面的1就不看了, 1被短路了, 返回了True; 同樣的False and 1也是一樣, 看到False然後是and不管後面是什麼, 整個式子的結果必定是False, 所以1被短路了, 返回False.

相應的, 為什麼False or 1會返回1, 就是因為Falseor判斷不了式子的結果, 整個式子是True還是False, 是由or後面的值來決定的, 所以Python要把整個式子看完, 所以返回1.

明白了什麼是短路邏輯之後, 我們看一看三目運算符

三目運算符

三目運算符, 又叫三元運算符. 熟悉Java的同學可能會知道, 它的形式是這樣的b?x:y, 對於這個表達式來說, 如果條件bTrue, 那表達式的結果就是x, 如果bFalse, 那表達式的結果就是y. 這是一種很方便的寫法, 比if語句簡潔很多.

但Python中早期沒有類似寫法的三目運算符, 所以就出現了一種利用短路邏輯, 用andor來模擬三目運算符的寫法, 下麵我們看代碼

A = X and 'table' or False

這句代碼就是在利用短路邏輯模擬三目運算符, 當XTrue的時候, A會被賦值為'table', 當XFlase的時候, A會被賦值為False;

乍一看好像很不錯, 但這種寫法卻有個坑, 我們看這句代碼

True and 0 or 1

如果我們把剛纔的寫法當三目運算符來使用, 那麼條件語句是True, 表達式應該返回0才是我們期望的結果, 但實際上這個表達式會返回1; 因為True and 0的值為True, 整個表達式的值是由or之後的值來決定的, 所以Python會對後面的值做判斷, 導致返回了1, 這就是為什麼and...or這個寫法有坑的原因

正確寫法

如果想在Python中使用三目運算符, 可以使用if...else寫法, 具體看代碼

# <為真時的結果> if <判定條件> else <為假時的結果>
0 if True else 1

if...else的寫法, 結果就會跟我們期望的相同, 當條件為True時, 返回前面的值, 條件為False時, 返回後面的值. 不會有坑, 只是寫的時候要註意, 條件和返回值的順序跟Java中的三目運算符不同, 不要搞錯即可



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

-Advertisement-
Play Games
更多相關文章
  • 堅持每天寫一個總結的博客,今天又是一個新的開始! 今天我要說的是一個關於發送簡訊通知發送的問題。具體的業務流程是這樣的,現在需要對用戶的一個提現的申請進行審核,審核的內部需要控制很多的業務, 1.檢查用戶的提現餘額-> 2.減去用戶的賬戶金額->3.減去公司的結算賬戶的餘額-> 4.創建用戶的提現日 ...
  • 可能很多人看到這個標題會有疑問:什麼是土巴啊里模式?一開始我也納悶:難道是土巴兔和阿裡巴巴的結合產物?先不急,聽我慢慢說來。 先提阿裡巴巴,阿裡巴巴是中國第一個做網上批發市場的網站,通過互聯網進行信息傳遞,不受時間和空間的限制。你可以在瞬間將某種商品的圖案、動畫、規格、價格、交貨方式等信息傳到萬里之 ...
  • Python預設版本修改 當電腦安裝了多個版本的Python,而Shell中預設的Python不是你想要的,這個時候就需要對Python的預設版本進行修改。 在Windows中,可以通過修改環境變數的方式來達到目的。 具體做法是在系統屬性的高級選項卡中選擇環境變數: 接著在系統變數中選擇Path進行 ...
  • 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20161227”查看20161226問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161227,【Java每日一題】20161227 註:weknow團隊近期開通並認證了分答,歡迎大家收聽,有問題也歡迎到分答來咨 ...
  • 第1個導航 1 2 3 4 第2個導航 1 2 3 第3個導航 1 2 第4個導航 ... ...
  • 一、包的概念:創建,使用。 1.新建包: 最上面一行,之前不能再有其它代碼了。 package 包名; 註意:包名一般都有命名的規範。例如:com.itnba.maya.zy(從大到小)。 2.使用包: import 包名.*; import 包名.類名; 例如:import com.itnba.m ...
  • 這個類在日常的開發中,還是非常常用的。今天就總結一下Arrays工具類的常用方法。最常用的就是asList,sort,toStream,equals,copyOf了。另外可以深入學習下Arrays的排序演算法,這個還是非常有用的。 所有的方法都是在下麵的類中進行測試的: asList 這個方法可以把數 ...
  • 目的: 使用垃圾回收器的唯一原因就是:回收程式不再使用的記憶體。 針對的目標對象: Java的垃圾回收器會自動回收不再使用的Java對象,釋放記憶體。但是回收的是用new創建的,分配在堆上的記憶體。 finalize(): 那麼,如果不是用這種方式創建的對象,該怎麼回收?比如:Java調用了本地的c語言方 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...