不要用C語言的思維 來思考python的or 或

2021-10-10 12:52:29 字數 1500 閱讀 5315

我真的學會python了嗎?在寫這篇部落格前,我問我自己

本來覺得python簡單,就很少去糾結python語法的細節

直到今天,發現了自己c語言思維慣性導致的bug

這個bug產生的主要原因是對於python運算子or的理解

特地寫下這篇部落格,解釋一下python中or和c語言中||的不同

先看python**,

i = 1

if i == (2 or 3 or 1):

print("yes")

else:

print("not")

你覺得結果是什麼呢,按c語言的思維套路,當然是輸出yes了

但是結果是not

我一開始以為是自己c語言學忘記了,才出現這個錯誤,特地去c語言裡驗證了一下

由於pycharm不能編譯c檔案,我只好用實驗室的伺服器了。。。

先通過vim新建乙個c檔案

vim test.c
按a進入插入模式

輸入

#include int i = 1;

void main()

按esc ,在按:wq儲存退出

命令列中輸入

gcc test.c -o test1
生成可執行程式test1

我本以為,這裡的c語言和上面的python在邏輯上是一樣的。。。

但是,通過

./test1
執行的結果是yes,

這就有些神奇了。。。至少說明我c語言的邏輯。。。還沒有忘記。。。

通過查閱資料,發現python的or

和c的||不太一樣

具體規則如下

宣告a=10,b=20

x or y

布林"或" - 如果 x 是 true,它返回 x 的值,否則它返回 y 的計算值。

(a or b) 返回 10。

所以在執行if i == (2 or 3 or 1):的時候
他會先計算2 or 3,結果為2,再計算2 or 1,結果為2,最後才是i == 2

當然輸出的是not

順便掛上and,not的具體規則

宣告a=10,b=20

運算子邏輯表示式

描述例項

andx and y

布林"與" - 如果 x 為 false,x and y 返回 false,否則它返回 y 的計算值。

(a and b) 返回 20。

orx or y

布林"或" - 如果 x 是 true,它返回 x 的值,否則它返回 y 的計算值。

(a or b) 返回 10。

notnot x

布林"非" - 如果 x 為 true,返回 false 。如果 x 為 false,它返回 true。

not(a and b) 返回 false

**參考菜鳥教程

SQL 以面向集合的思維方式來思考

圖4 1給出了12張卡片,從中你應該可以找出6個集合。每張卡片左上角的字母表示顏色 r 紅色,g 綠色,p 紫色 試試吧。答案在本章的最後 可別作弊哦!我首先給出第乙個集合 第1行第2列 實心綠色花體 第3行第2列 實心紅色花體 和第3行第4列 實心紫色花體 這個遊戲迫使你按集合來思考,除此以外別無...

c語言 指標的思考

面向指標程式設計 好文!對於指標的思考。理解 指標本身是乙個變數,有值 就是他本身的記憶體位址 指標可以指向別的位址。指標動態申請記憶體,就像在乙個位址上面蓋房子,就算被free掉,也只是這個房子被掀了,並不代表他本身所具有的位址變成了null。結構體指標實際上就是乙個指標,指向了結構體裡面的內容,...

用C語言的思維寫彙編

在c語言中 常量資料 函式 int main在彙編中 data segment 常量資料 data ends code segment assume cs code,ds data main 邏輯 和執行中變數資料 mov ax,4c00h int21h 函式 code ends end mainc...