Python編程思想(2):Python主要特性、命名規則與代碼縮進

《Python編程思想》總目錄

目錄

那麼什麼是動態語言呢?

那麼什麼是弱類型語言和強類型語言呢?

Python命名規則

縮進原則


李寧老師的《Python編程思想》上線了,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以關注「極客起源」微信公衆號,並輸入 160442 開始學習。

在正式學習Python語言之前,我們先來了解一下Python有哪些特性,以及Python的基本語法結構是怎樣的。

有很多同學問,Python語言到底能做什麼呢?我的回答是:Python幾乎什麼都能做,包括移動、GUI、Web、數據分析,更是數據挖掘、機器學習、深度學習等技術的首選語言。

基於 Python 的包更是不勝枚舉,“Tiobe 編程語言排行榜”最新統計顯示 Python 是增長最快的語言。

這得益於 Python 語言語法簡單、開發效率高,集成系統非常方便。Python 相關的就業機會也是非常多,待遇也很優厚。因此,不管從易用性,還是工作機會和待遇來說,Python 都是 IT 從業者需要掌握的語言。

現在先讓我來問大家一個問題,Python到底是怎樣一種編程語言呢?

要回答這個問題,首先需要介紹一下Python的量大特性:動態語言和弱類型。

那麼什麼是動態語言呢?

要了解什麼是動態語言,要首先了解“類型檢查”。類型檢查是驗證類型約束的過程,編譯器或解釋器通常在編譯階段或運行階段做類型檢查。

類型檢查就是查看“變量”和它們的”類型”,然後判斷表達式是否合理。例如,不能拿一個 string 類型變量除以浮點數變量。
如果類型檢查發生在程序運行階段,那麼它便是“動態類型語言”。常見的動態語言包括:
Python
JavaScrpit
PHP
類型檢查發生在“編譯階段”的是“靜態類型語言”。常見的靜態類型語言包括:
C
C++
Java
Swift
Kotlin
C#
Scala

現在明白了吧,Python屬於動態類型語言,也就是說,Python中的數據類型在編譯時是不檢查的,只有在運行時纔會檢查。這麼做的好處是在定義變量時可以不事先指定數據類型,或者隨便喂變量指定一個值,反正後期還可以變。但壞處也顯而易見,儘管動態類型帶來了遍歷,但同時也帶來了麻煩。由於變量的數據類型是不確定的,所以就會導致在任何時候,變量可能是任何的數據類型。這樣就會造成一個問題。我們就無法準確的得到變量內部的成員。例如。變量的初始類型是一個類。如果編程語言是靜態類型的,那麼就意味着這個變量的類型永遠不可能變,所以我們可以準確地得知這個變量所對應的這個類裏面的成員,比如說這個類中有什麼方法,有什麼屬性。但是如果這種語言是動態類型的。那麼就意味着這個變量有可能會變成其他的數據類型,比如說,變量可能會變成int類型。如果是這樣的話,我們就沒有辦法準確地得知這個變量所對應的類型中的成員。這也是爲什麼現在幾乎所有的支持動態語言的IDE的用戶體驗都不如支持靜態語言IDE的原因。


那麼什麼是弱類型語言和強類型語言呢?

如果用一句話定義,這句話就是:變量的數據類型一旦被指定,就永遠不會變化,這種語言就稱爲強類型語言。反之。如果變量的數據類型被指定,後期還可以改變這個變量的數據類型,那麼這種語言就稱爲弱類型語言。

根據這個定義。Python很明顯是一種弱類型語言,因爲在任何時候都可以爲Python變量賦任何類型的值。例如,

x = 20          # 整數類型
x = 'hello'     # 字符串類型 
x = 20.12       # 浮點類型
x = True        # 布爾類型

在上面的4行代碼中,變量x改變了4次數據類型,首先爲x賦值爲20,在定義x變量的同時,將x變量的數據類型設置爲整數類型,然後分別將x的數據類型設爲字符串、浮點和布爾類型。任何可以實現這種效果的編程語言都是弱類型語言。

這裏可能會有如下兩個誤解:
1.  有很多編程語言,如Java、Swift、Dart等,都至少有一種數據類型,是所有數據類型的根,如Java中的Object、Swift中的Any、Dart中的dynamic,如果變量聲明爲這些數據類型,同樣可以設置任何,從表面上看,與動態類型語言的效果類似,不過這些語言仍然是強類型語言,因爲變量的類型並沒有改變,只是變量的類型允許設置任何類型的值,因爲這些數據類型是一切類型的根類型。
2. 有很多資料和書將Python說成是強類型語言,理由是不能與其他數據類型在計算表達式中混合使用。例如,在Python語言中有兩個變量x和y,x是字符串類型,y是整數類型。x和y不能直接相加,而需要將x轉換爲整數類型,或者將y轉換爲字符串類型。其實這麼理解是完全錯誤的,因爲這是一個語義的規則。

我們不妨做個假設,假設一種編程語言如果是弱類型或強類型,那將永遠是弱類型和強類型語言。如果這個假設成立,那麼未來的Python版本有可能可以讓x和y相加,只要規定數據類型的優先級即可,也就是說,如果兩個完全不同的數據類型的值相加,以誰爲主,這裏姑且規定,String類型在所有內建數據(int、float、bool等)類型中的優先級最高,那麼x + y,其實會自動將y轉換爲字符串,然後再和x連接。這種語言的改進完全有可能。

那可能有的同學會問,這麼改進,不會讓大量已經存在的Python程序出問題嗎?如果只是這種改進,當然不會有任何問題。因爲x + y只有如下3種可能:
1. 直接寫成x + y,這種可能會導致程序出錯,所以程序員會避免這種寫法
2. 將y轉換爲字符串類型,這總情況與支持不同類型相加的Python版本的功能吻合,所以不會出現問題
3. 將x轉換爲整數,再與y相加,其實這就成了兩個整數相加了,也不會有問題;

所以不管是哪種可能,都不會對原來的程序產生任何影響。如果Python的未來版本做了這種改變,那麼就意味着Python就變成了一種弱類型變成。這與前面的假設相悖。

那麼可能有的同學會問,難道Python的未來版本就不能對變量數據類型變化規則作出改變嗎?也就是說,一旦變量的數據類型確定以後,就不能再改變。這麼做,從技術上當然是沒有問題。但這是一個編程語言的變化禁區。因爲一旦這麼變化,那麼現存的Python程序真的會出問題。還是用上面的代碼,這麼變化的後果就意味着後3行代碼將全部出錯。所以對於編程語言的改進,並不是隨意的,否則會造成很大的麻煩。因此,定義什麼是弱類型或強類型語言,一定要在編程語言幾乎不可能改變的特性上,如果變量數據類型的變化規則,這樣纔會符合前面的假設。當然,你可以假設編程語言的這個特性是隨時可以變化的,例如,2012年的時候,是弱類型,在2016年,由於語言升級,所以變成了強類型語言。

現在可以總結一下:

常用的強類型編程語言如下:
C
C++
Java
C#
Swift
Kotlin
Dart

常用的弱類型編程語言如下:
Python
JavaScript
PHP

下面看一下Python不同於其他大多數編程語言的規則。

Python命名規則

首先說明一點,命名規則並不是強制的,這只是約定,你可以不遵守,也可以指定團隊自己使用的命名規則,但最好團隊所有的成員使用同一的規則。下面列出的只是一種普通採用的規則,也是大多數Python程序庫採用的規則。

標識符允許使用英文、數組和下劃線,但不能以數字開頭,這一點和其他編程語言相同;
Python是大小寫敏感的編程語言,所以test和Test表示不同的含義;
變量名用小寫形式,如value、test、hello等。如果變量名包含多個單詞,那麼中間用下劃線分隔,如my_value、product_name等;
方法名與變量名的命名規則相同,如get_value(),set_my_value(...);

常量中所有的英文字母要大寫,如果包含多個單詞,中間用下劃線分隔,如PI、PRODUCT_PRICE等;PS:在Python中並沒有常量,但可以將變量當做常量使用;

類名採用大駝峯命名法,也就是每一個單詞的首字母都要大寫,如MyClass、Product、NewForum等;

如果類中的變量以單下劃線(_)開頭,如_value,是受保護變量,相當於Java中的protected,按官方描述是隻能由本身或子類訪問,但經過測試,外部也可以訪問被聲明爲protected的變量,可能是Python解析器並沒有做這樣的限制;
如果類中的變量以雙下劃線(__)開頭,如__value,是private類型的變量,只允許自身訪問;


縮進原則

這是Python與任何其他編程語言都不同的地方。其他的編程語言都是通過大括號來指定代碼塊的,而Python是通過縮進來指定代碼塊的。代碼塊的縮進可以任意,但同一個代碼塊中的每一行代碼的縮進必須一致。

下面的代碼定義了一個類Product,該類包括一個構造方法和一個普通方法,以及一個普通的類變量。後面的代碼創建了Product對象,並調用了get_name方法。該例包含了類作用域和方法作用域,作用域以冒號(:)開頭,後面作用域中的代碼的縮進要一致,否則程序會報錯。關於類的詳細解釋,會在後面的文章中詳細講解。

class Product:
    name = "iPhone"
    def __init__(self, name):
        self.name = name
    def get_name(self):
        return self.name
product = Product("特斯拉")
print(product.get_name())

其實我一開始學Python時,就感覺這個用縮進確定代碼塊的方式很彆扭,因爲一旦代碼的縮進弄亂了,就很難調整回來,這不像用一對花括號,只要在花括號之間的肯定屬於同一個作用域。如果既然Python這麼用了,就只能接受了。據我所知,數百種編程語言,好像只有Python是這麼做的。不過由於Python的其他特性非常吸引人,所以這點小瑕疵並不影響Python的流行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章