【Python 第51課】 and-or技巧

2021-03-02 Crossin的編程教室

今天介紹一個python中的小技巧:and-or

看下面這段代碼:

a = "heaven"

b = "hell"

c = True and a or b

print c

d = False and a or b

print d

輸出:

heaven

hell

結果很奇怪是不是?

表達式從左往右運算,1和"heaven"做and的結果是"heaven",再與"hell"做or的結果是"heaven";0和"heaven"做and的結果是0,再與"hell"做or的結果是"hell"。

拋開繞人的and和or的邏輯,你只需記住,在一個bool and a or b語句中,當bool條件為真時,結果是a;當bool條件為假時,結果是b。

有學過c/c++的同學應該會發現,這和bool?a:b表達式很像。

有了它,原本需要一個if-else語句表述的邏輯:

if a > 0:

    print "big"

else:

    print "small"

就可以直接寫成:

print (a > 0) and "big" or "small"

然而不幸的是,如果直接這麼用,有一天你會踩到坑的。和c語言中的?:表達式不同,這裡的and or語句是利用了python中的邏輯運算實現的。當a本身是個假值(如0,"")時,結果就不會像你期望的那樣。

比如:

a = ""

b = "hell"

c = True and a or b

print c

得到的結果不是""而是"hell"。因為""和"hell"做and的結果是"hell"。

所以,and-or真正的技巧在於,確保a的值不會為假。最常用的方式是使 a 成為 [a] 、 b 成為 [b],然後使用返回值列表的第一個元素:

a = ""

b = "hell"

c = (True and [a] or [b])[0]

print c

由於[a]是一個非空列表,所以它決不會為假。即使a是0或者''或者其它假值,列表[a]也為真,因為它有一個元素。

在兩個常量值進行選擇時,and-or會讓你的代碼更簡單。但如果你覺得這個技巧帶來的副作用已經讓你頭大了,沒關係,用if-else可以做相同的事情。不過在python的某些情況下,你可能沒法使用if語句,比如lambda函數中,這時候你可能就需要and-or的幫助了。

什麼是lambda函數?呵呵,這是python的高階玩法,暫且按住不表,以後有機會再說。

#==== Crossin的編程教室 ====#

微信ID:crossincode

論壇:http://crossin.me

QQ群:312723402

面向零基礎初學者的編程課

每天5分鐘,輕鬆學編程

回復『 p 』查看python課程

回復『 g 』查看pygame課程

回復『 t 』查看習題

點擊「閱讀原文」進入crossin.me

相關焦點

  • Python學習第112課——numpy中數組查找元素和改變元素的小技巧
    【每天幾分鐘,從零入門python編程的世界!】上節我們學習了如何利用index找到ndarray數組中的一些元素,並把找到的元素生成一個新的ndarray。代碼如下:現在我們學習幾個用index找到ndarray中元素的小技巧。
  • 【Python 第53課】 數學運算
    今天從打飛機遊戲裡中斷一下,說些python的基礎。絕對值三角函數: math.sin(x)math.cos(x)math.tan(x)math.asin(x)math.acos(x)math.atan(x)注意:這裡的x是以弧度為單位,所以計算角度的話,需要先換算角度和弧度互換: math.degrees(x)弧度轉角
  • Python學習第94課-通過第三方接口獲得數據並導入Python繪圖
    【每天幾分鐘,從零入門python編程的世界!】上節課我們學習了導入外部文件數據並繪圖。這節課我們學習通過第三方接口獲得數據並導入Python進行繪圖。我們的數據接口使用Tushare,Tushare是一個免費、開源的python財經數據接口包。
  • [Python第2課]print介紹
    和linux教程放在一起,每天兩篇文章,讓你不但掌握python,還要學會linux的相關技能。   ================進入正題====================    今天提到的命令,昨天課上大家已經見過,就是:print(注意:全是小寫字母)。
  • 【Python 第37課】 字典
  • Python語言基礎50課
    位置:【第006課】循環結構雙色球案例一個小慄子把函數、循環結構、分支結構、表達式及列表等融合在一起,先回顧一下: 列表使用 | 元組拆包是個啥? 函數基本使用方法:函數,即實現一個特定功能的代碼段。是python中的重要技能(工具)。
  • Python學習第119課——numpy中的broadcasting
    【每天幾分鐘,從零入門python編程的世界!】這節課我們學習numpy中的數據的一個多變的特性--broadcasting,broadcasting的官方的說明比較麻煩,我們這裡把它簡化一下,就把它當做「腦補」的意思。
  • python編程30個常用技巧
    打開APP python編程30個常用技巧 深度學習這件小事 發表於 2020-12-24 15:07:51 21、斐波那契數列 斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13;特別指出:第0項是0,第1項是第一個1。從第三項開始,每一項都等於前兩項之和。
  • 【Python 第60課】 隨機數
    如果你在程序中需要其中某一個方法,也可以這樣寫:from random import randintrandint(1, 10)另外,有些編程基礎的同學可能知道,在隨機數中有個seed的概念,需要一個真實的隨機數,比如此刻的時間、滑鼠的位置等等,以此為基礎產生偽隨機數。在python中,默認用系統時間作為seed。
  • Python日課-2.4-pip的使用
    曾老師的 Python 課(連結可點擊) 第一課的所有內容已經全部發布,包括課程 PPT、課程視頻都可以免費獲取,可以使用微信掃描下面的二維碼進群獲取
  • Python學習第141課——Python爬蟲簡介
    【每天幾分鐘,從零入門python編程的世界!】今天我們簡單的了解下網絡爬蟲,網絡爬蟲其實就是一個自動獲取網頁內容的程序。Python的爬蟲需要用到一個第三方的庫requests。requests庫可以在git bash中使用命令pip install requests進行安裝。
  • 開課吧Python線上訓練營課前須知
    小課線上實戰訓練營,接下來你會進入到一個為期5天的體驗學習旅程~python小課--上課形式是什麼?本次Python線上實戰訓練體驗課營包含以下內容:python是什麼? 開課吧「Python 小課」是人工智慧教研團隊歷時12個月,為零基礎學員精心打造的AI編程入門產品。
  • Python學習第61課-shell用cat和less打開文件
    【每天幾分鐘,從零入門python編程的世界!】補充:在第60節課的學習中,我們知道保存網頁用這個命令:curl -L -o 要保存的路徑 要下載的網頁的網址①要保存的路徑的文件名可以是任何後綴,比如.txt,點csv等等都可以。
  • 曾老師的Python課-每日教學-第1周
    曾老師的 Python 課(連結可點擊) 第一課的所有內容已經全部發布,包括課程 PPT、課程視頻都可以免費獲取,可以使用微信掃描下面的二維碼進群獲取
  • Python+AI+選修課第5課:我的第二個AI程序人臉大挪移誕生記
    第一個要修改的地方就是容錯處理,一旦程序錯誤要給出文字提示,而不是python的報錯信息。這個比較容易實現,增加python的異常處理就好。這是python的一個特點。https://www.runoob.com/python3/python3-errors-execptions.html此外,使用'''  ……'''三個單引號進行多行輸出的方法,也是我前段時間學習到的。
  • 少兒python第三課
    有用的連結:少兒Python第一課少兒python第二課http://pythontutor.com
  • Python教程整理!想學的趕緊了
    提取碼:ckqm黑馬Python就業:連結:https://pan.baidu.com/s/1YxIJ2EQqORhQgALvPXuOmA 提取碼:zm32老男孩Python全棧第9期:連結:https://pan.baidu.com/s/191h_P6Ow827op8e9GFTVcw
  • 【第51課】Excel如何另存為PDF格式
    如需複習,請點擊下方連結:【第50課】Excel的相對引用、混合引用、絕對引用如果大家覺得小強哥的文章比較好,希望能點亮文章右下角的「在看」並將此文章分享到朋友圈,讓更多的人一起學習,提供更多的意見和建議。如對小強哥的文章有任何疑問或者質疑的地方,歡迎各位給我指正。
  • Python日課-2.5-python語言的不同實現
    曾老師的 Python 課(連結可點擊) 第一課的所有內容已經全部發布,包括課程 PPT、課程視頻都可以免費獲取,可以使用微信掃描下面的二維碼進群獲取
  • Python學習第87課-數據可視化之圖形標識title、label、legend
    【每天幾分鐘,從零入門python編程的世界!】第86課我們學習了matplotlib,並且用它畫了一個簡單的圖形,但是這個圖形上面沒有標題,沒有標明x軸和y軸,而且用於畫這個圖形的數據都是我們手動以列表的形式輸入進去的。