當前位置:吉日网官网 - 傳統節日 - 假期讓妳秒變Ph高手

假期讓妳秒變Ph高手

搞懂這些問題讓妳秒變Python高手快來學習吧

搞懂這些問題, 讓妳秒變Pytho高手

1.為什麽使用縮進來分組語句?

Guido van Rossum認為使用縮進進行分組非常優雅, 並且大大

提高了普通Python程序的清晰度。大多數人在壹段時間後就學

會並喜歡上這個功能。

由於沒有開始/結束括號,因此解析器感知的分組與人類讀者之

間不會存在分歧。偶爾C程序員會遇到像這樣的代碼片段:

如果條件為真,則只執行x++語句,但縮進會使妳認為情況並

非如此。即使是經驗豐富的C程序員有時會長時間盯著它,想

知道為什麽即使x>y,y也在減少。

因為沒有開始/結束括號, 所以Python不太容易發生編碼式沖

突。在C中,括號可以放到許多不同的位置。如果您習慣於閱

讀和編寫使用壹種風格的代碼,那麽在閱讀(或被要求編寫)

另壹種風格時,您至少會感到有些不安。

許多編碼風格將開始/結束括號單獨放在壹行上。這使得程序相

當長,浪費了寶貴的屏幕空間,使得更難以對程序進行全面的

搞懂這些問題, 讓妳秒變Pytho高手

了解。理想情況下,函數應該適合壹個屏幕(例如,20--30行

) 。20行Python可以完成比20行C更多的工作。這不僅僅是

由於缺少開始/結束括號--缺少聲明和高級數據類型也是其中的

原因--但縮進基於語法肯定有幫助。

2.為什麽簡單的算術運算得到奇怪的結果?

請看下壹個問題。

3.為什麽浮點計算不準確?

用戶經常對這樣的結果感到驚訝:

並且認為這是Python中的壹個bug。其實不是這樣。這與

Python關系不大, 而與底層平臺如何處理浮點數字關系更大。

CPython中的float類型使用C語言的double類型進行存儲。

float對象的值是以固定的精度(通常為53位) 存儲的二進制

浮點數, 由於Python使用C操作, 而後者依賴於處理器中的

硬件實現來執行浮點運算。這意味著就浮點運算而言, Python

的行為類似於許多流行的語言, 包括C和Java。

許多可以輕松地用十進制表示的數字不能用二進制浮點表示。

例如,在輸入以下語句後:

搞懂這些問題, 讓妳秒變Pytho高手

>>>x=1.2

為x存儲的值是與十進制的值1.2(非常接近)的近似值,但不完

全等於它。在典型的機器上,實際存儲的值是:

1.8811601198116911901160119911891190118011001180110011

(binary)

它對應於十進制數值:

1.1999999999999999555910790149937383830547332763671875

(decimal)

典型的53位精度為Python浮點數提供了15-16位小數的精度

-4.為什麽Python字符串是不可變的?

有幾個優點。

壹個是性能:知道字符串是不可變的,意味著我們可以在創建

時為它分配空間,並且存儲需求是固定不變的。這也是元組和

列表之間區別的原因之壹。

另壹個優點是, Python中的字符串被視為與數字壹樣“基本”

。任何動作都不會將值8更改為其他值, 在Python中, 任何動

作都不會將字符串"8"更改為其他值。

5.為什麽必須在方法定義和調用中顯式使用“self”?

這個想法借鑒了Modula-3語言。出於多種原因它被證明是非常

有用的。

搞懂這些問題,讓妳秒變Pytho高手

首先,更明顯的顯示出,使用的是方法或實例屬性而不是局部

變量。閱讀self.x或self.meth() 可以清楚地表明, 即使您不知

道類的定義,也會使用實例變量或方法。在C++中,可以通過

缺少局部變量聲明來判斷(假設全局變量很少見或容易識別)

--但是在Python中沒有局部變量聲明, 所以必須查找類定義

才能確定。壹些C++和Java編碼標準要求實例屬性具有m_前

綴,因此這種顯式性在這些語言中仍然有用。

其次,這意味著如果要顯式引用或從特定類調用該方法,不需

要特殊語法。在C++中,如果妳想使用在派生類中重寫基類中

的方法, 妳必須使用::運算符--在Python中妳可以編寫

baseclass.methodname(self, ) 。這對於in it() 方法非常有用,

特別是在派生類方法想要擴展同名的基類方法,而必須以某種

方式調用基類方法時。

最後, 它解決了變量賦值的語法問題:為了Python中的局部變

量(根據定義!)在函數體中賦值的那些變量(並且沒有明確

聲明為全局)賦值,就必須以某種方式告訴解釋器壹個賦值是

為了分配壹個實例變量而不是壹個局部變量,它最好是通過語

法實現的(出於效率原因)。C++通過聲明來做到這壹點,但

是Python沒有聲明, 僅僅為了這個目的而引入它們會很可惜。

使用顯式的self.var很好地解決了這個問題。類似地, 對於使用

搞懂這些問題, 讓妳秒變Pytho高手

實例變量, 必須編寫self var意味著對方法內部的非限定名稱的

引用不必搜索實例的目錄。換句話說,局部變量和實例變量存

在於兩個不同的命名空間中, 您需要告訴Python使用哪個命名

空間。

6.為什麽不能在表達式中賦值?

不允許在Python表達式中賦值的原因是這些其他語言中常見的

、很難發現的錯誤,是由這個結構引起的:

錯誤是壹個簡單的錯字:x=0,將0賦給變量x,而比較x==

0肯定是可以預期的。

已經有許多替代方案提案。大多數是為了少打壹些字的黑客方

案,但使用任意或隱含的語法或關鍵詞,並不符合語言變更提

案的簡單標準:它應該直觀地向尚未被介紹到這壹概念的人類

讀者提供正確的含義。

最好的方法是使用叠代器, 這樣能通過for語句來循環遍歷對象

。例如file objects支持叠代器協議, 因此可以簡單地寫成:

搞懂這些問題, 讓妳秒變Pytho高手

7為什麽Python對某些功能(例如list.index() ) 使用

方法來實現, 而其他功能(例如len(List) ) 使用函數

實現?

(a)對於某些操作,前綴表示法比後綴更容易閱讀--前綴(和中

綴!)運算在數學中有著悠久的傳統,就像在視覺上幫助數學

家思考問題的記法。比較壹下我們將x*(a+b)這樣的公式改寫為

x_a+x_b的容易程度,以及使用原始00符號做相同事情的笨

拙程度。”

(b) 當讀到寫有len(X) 的代碼時, 就知道它要求的是某件東西的

長度。這告訴我們兩件事:結果是壹個整數,參數是某種容器

。相反, 當閱讀x.len() 時, 必須已經知道x是某種實現接口的

容器, 或者是從具有標準len() 的類繼承的容器。當沒有實現映

射的類有get() 或key() 方法, 或者不是文件的類有write() 方法

時,我們偶爾會感到困惑。

8.為什麽join) 是壹個字符串方法而不是列表或元組方

法?

join() 是字符串方法, 因為在使用該方法時, 您告訴分隔符字符

串去叠代壹個字符串序列,並在相鄰元素之間插入自身。此方

法的參數可以是任何遵循序列規則的對象,包括您自己定義的

任何新的類。對於字節和字節數組對象也有類似的方法。

搞懂這些問題, 讓妳秒變Pytho高手

9.為什麽lambda表達式不包含語句?

Python的lambda表達式不能包含語句, 因為Python的語法

框架不能處理嵌套在表達式內部的語句。然而, 在Python中,

這並不是壹個嚴重的問題。與其他語言中添加功能的lambda

表單不同, Python的lambdas只是壹種速記符號, 如果您懶

得定義函數的話。

函數已經是Python中的第壹類對象, 可以在本地範圍內聲明。

因此, 使用lambda而不是本地定義的函數的唯壹優點是妳不

需要為函數創建壹個名稱--這只是壹個分配了函數對象(與

lambda表達式生成的對象類型完全相同) 的局部變量!

10.難道不能在解釋器中模擬線程,而非得依賴特定於

操作系統的線程實現嗎?

答案1:不幸的是, 解釋器為每個Python堆棧幀推送至少壹個

C堆棧幀。此外, 擴展可以隨時回調Python。因此, 壹個完整

的線程實現需要對C的線程支持。

答案2:幸運的是, Stackless Python有壹個完全重新設計的

解釋器循環,可以避免C堆棧。

  • 上一篇:妳知道侗族有什麽節日嗎?
  • 下一篇:元宵節賞燈的傳說是什麽?
  • copyright 2024吉日网官网