python有什麼類似特性(或者是解釋型語言特性)?

想簡單了解一下以上原因是基於python產生的還是大部分解釋型語言的特點

還想知道python中還有什麼類似這樣的特性?

以下是關於修改前的上一個描述混亂的問題....

(不好意思拉...上次提出問題時描述寫的那麼嗅...很感謝大大們的解釋,已解決)


按照你說的問題,有兩個很簡單的方法可以解除你的疑惑:要麼依靠編譯原理的知識進行推斷,要麼讀解釋器的源碼。不過這裡也還是簡單介紹一下這個過程吧。

首先,and是邏輯運算符,通常來說邏輯算符都有短路(shortcut)特性。這不是什麼稀奇的玩意,因為無論C也好C++也好Java也好……甚至可以說幾乎所有主流高級語言都包含這個功能——在做邏輯運算時(不包括位運算),如果算到某個步驟時已經可以確定運算式的值,則結果可以確定,就不再進行後續的沒有必要的運算了。因此確實如你所舉的例子,

False and foo

因為這是個邏輯運算式,其結果在計算到False時就可以確定,它便不再處理後續。如果這是個編譯語言,它會表現為不會對第二個運算數進行求值(如果求值本身有副作用,則有明顯差異),而由於CPython是解釋執行的,解釋器忽略了後續的部分,因此這個未定義的foo是完全不會訪問到的,於是不會有任何報錯。

如果你想要知道得更多,就會涉及一些編譯原理(是的,就算是解釋語言,要說明實現還是得懟編譯原理)知識。當然你也可以選擇看解釋器源碼來分析。

代碼到後續執行機制之間,有兩個過程,一個是丟給Tokenizer,做語法斷句,解析代碼結構,形成一個AST;後續則是針對AST執行。

還是那個例子,它首先會構建AST,得到一個類似這樣的結構

[op]and
/
[name]False [name]foo

這個稱之為AST,Abstract Syntax Tree,抽象語法樹。 每段Python代碼在丟進解釋器這個階段,都會幹這樣的事情。更複雜的調用會有更複雜的結構,但其原理是一致的。這個階段,Python只是考慮進行基本語法判斷,所以當你括弧不配對、縮進不對頭、缺冒號之類的情況發生時,這一步無法正確構建AST,就會報Syntax Error。

如果是編譯語言,構建AST之後則會在下一步構建指令,它必須要弄懂每個元素是什麼東西才能繼續整改編譯流程,對於foo這個沒有出現過的name,是報錯還是定義成一個新的variable之類,不同語言有不同的做法(通常情況是報錯,不然一個新定義的變數初始化過程都沒有能算個啥);對於解釋語言,則在構建AST後直接一邊構造指令一邊執行,就可以像Python這樣走一步看一步。

執行的時候,先從AST的樹根走起,用遍歷這棵AST:

1. 走到and節點,這是個二目邏輯運算符;算符求值順序是由左至右,

2. 走到False節點,這是個name,然後查看當前scope的name表,得到結論——這是個邏輯假;

3. 返回到and,得到第一計算數結果是邏輯假。因為and運算是僅當兩個運算數都為邏輯真時結果為真,而此時第一計算數已經為假,結果必然是假,跳過對第二計算數的求值(跳過右兒子求值),返回結果邏輯假。

於是按照這個流程,加上Python的動態特性(name動態可變,用時查找name),右邊的foo根本不會用到,也就不會執行計算;不會計算,也就不會在當前scope里查找foo這個name,也就不會給你來個Name Error。但如果把兩個運算數反過來,則先解析foo,得到Name Error;如果把and替換成or,不構成短路條件,則仍會要對foo求值,得到Name Error;如果把and替換成其它運算(例如位運算|),算符不具備短路計算的特性,仍會計算第二運算數,也會得到Name Error。

簡單的講大體就這麼回事了。


能寫加減乘除是因為你知道數學中的四則運算。

不會寫邏輯表達式是因為你缺的是:數學中的布爾運算


true 和 false 的運算叫布爾運算,這個高中數學應該教過,高考要考的內容。

你要學是高中數學,而不是 python。


也許題主是在照著什麼書在學習?不過建議初學者不要把太多語法技巧當成常態來使用...

至少在基礎打牢之前..

如果題主不是問的這個..那我想..

從提問來分析,題主思維角度是比較有深度的?卻沒有什麼編程方面的經驗?...當然也有可能是水平比較高深.我沒能理解到題主問題中的哲學意義?..尷尬了..orz


正如你問題問的很亂,不知道怎麼提問——答的人也不知道該怎麼回答你。

我感覺你不光是在問邏輯運算的問題——只是邏輯運算是你目前初學唯一接觸到的東西,然後被你拿出來舉例子了。我覺得你想問得更多的是——編程語言到底是個什麼概念的東西?它是怎麼運行的?我們寫下一行代碼,是做了什麼?這麼做有什麼意義?能用它幹什麼?我現在什麼都不懂,就知道一個「邏輯運算」,想學更多的「語法點」,卻因為毫無基礎,一肚子疑惑導致學不下去。但又想快速成長,可自己又是那種刨根問底,眼裡容不得沙子的性格,帶著疑惑就寸步難行,很糾結。。。是不是?

如果是的話,評論回復下,我就繼續給你扯一點。


個人覺得題主是這個意思吧

看描述真累,不如show code

建議先好好學習下邏輯運算,以及Python對於布爾類型的概念


我目前學的語言里and邏輯都是先看前者。如果前者為真再看後者,前者為假直接輸出假。

所以False and 劉嵇蠱窊 會輸出False。反過來會拋錯誤。


除非你想走編譯原理等方向否則不建議去鑽牛角尖「想這個東西是怎麼實現的」

Coldwings 已經從編譯原理的基礎(語法樹)方向做了一個很專業的回答

從提問來看你很需要一個基礎的邏輯/語言感,也就是說你需要先知道基本邏輯運算/條件控制/變數等東西,然後你才可以更進一步去知道「這個東西是怎麼實現的」,否則一切都是空中樓閣,到頭來除了牛角越鑽越小以外什麼都得不到

官方文檔也不建議你去翻,對於你而言太深太深


數學邏輯里的與或非。在代碼中常用做且和或||,python中即and or ,例如A and B 。

條件A:武漢在湖北。

條件B:武漢今天下雨了。

A and B 兩個條件都是真命題則為真

A or B 兩個條件有一個是真命題即為真

寫代碼其中就會有無數個如果A 執行XXX 如果非A執行XXX

給高級語言描述的是邏輯

教程:可以看穆雪峰大大的


推薦閱讀:

新手遇到笨辦法學python第13題?
Python中locale如何配置setlocale()的參數?
你看好 Python 3 嗎?
如何用python網路爬蟲求兩個城市間鐵路距離呢?
python中如何理解裝飾器代碼?

TAG:編程語言 | Python | 編程 | Python3x | 計算機語言 |