1. 程式人生 > >Python入門基礎(一)

Python入門基礎(一)

Python的創始人叫吉多·範羅蘇姆(Guido van Rossum),Python誕生於1989年,用於作為ABC語言的繼承。
Python崇尚優美、清晰和簡單,是一個優秀並且廣泛使用的語言。
2016年時,Python排名程式語言第5名。

目前Python的主要應用領域:
1、雲端計算:典型的如OpenStack
2、科學運算、人工智慧:典型如NumPy等
3、Web開發:如Django
4、系統運維
5、金融
6、圖形GUI

程式語言主要由以下幾種分類方法:
1、編譯型和解釋型
2、靜態語言和動態語言
3、強型別定義語言和弱型別定義語言

編譯型:
和組合語言是一樣的,也是一個負責翻譯的程式來對我們的原始碼進行轉換,生成相應的可執行程式碼,這個過程稱為編譯(compile),負責編譯的程式稱為編譯器(compiler)。如果我們寫的程式程式碼都包含在一個原始檔中,那麼編譯之後就會直接生成一個可執行的檔案,我們就可以直接運行了。但是對於一個比較複雜的專案,為了方便管理,我們通常把程式碼分散在各個原始檔中,作為不同的模組來組織。這時編譯各個檔案時,就會生成目標檔案(object files),而不是前面所說的可執行檔案。一般一個原始檔的編譯都會對應一個目標檔案。這些目標檔案裡的內容基本上是可執行程式碼了,但對於整個專案來說,只是一部分,所以還不能直接執行。只有等待所有的原始檔都編譯完成,我們就可以把這些半成品的目標檔案打包成一個可執行檔案,這個工作由另一個程式完成,這個過程是把包含可執行程式碼的目標檔案連線裝配起來,所以又稱為連結(link),負責這個步驟的程式叫做連結程式(linker)。連結程式除了目標檔案之外,可能還有各種資源,如圖形檔案、聲音檔案等,還負責去除目標檔案之間的冗餘重複程式碼等,所以也很累。連結完成之後,一般就可以得到我們想要的可執行檔案了。

解釋型:
編譯型程式,是一次把所有的程式碼轉換成機器語言,然後寫成可執行檔案;而解釋型程式,是每執行到源程式的某一條指令,則會有一個稱之為解釋程式的外殼程式將原始碼轉換成二進位制程式碼以供執行,總而言之,就是不斷的解釋、執行、解釋、執行,所以,解釋型程式碼是離不開解釋程式的。解釋型程式中,由於程式總是以原始碼的形式出現,因此只要有相應的直譯器,移植幾乎不成問題。編譯型程式也可以移植,但是針對不同系統,必須分別重新編譯,對於複雜工程來說,非常耗費時間。但解釋型程式因為一邊解釋,一邊執行,因此速度比編譯型程式要慢上好多,幾百倍也不足為奇。

總結:
編譯型由於速度快,因此對系統要求較低,開發作業系統、資料庫和大型應用等都使用它,比如C/C++、Pascal/Delphi、VB等都是編譯語言。而一些網頁尾本、伺服器指令碼和輔助開發介面等對速度要求不高,對不同系統平臺相容性有要求的一般使用解釋型語言,如Java、JavaScript、VBScript、Perl、Python等。
打個比方,有一本英文書你想看,但是你又不懂英語,於是乎請來一位資深翻譯。這位資深翻譯可以從頭到底給你一口氣全部翻譯完,然後把中文版的書交給你閱讀,這種就是編譯型的方式來處理。而這位資深翻譯可以翻譯一個章節後,你可以閱讀翻譯完的這個章節,之後這位資深翻譯繼續翻譯下面的章節,翻譯完畢後,你才能再讀接下去的章節,但是當你想回看之前的章節,那麼必須由這名翻譯再次翻譯一下這個你想再次看的章節,等待翻譯完畢後,你才能再次閱讀這個章節,這種就是解釋型的方式來處理。

動態型別語言:
動態型別語言是指在執行期間採取做資料型別檢查的語言。也就是說,在用動態型別的語言程式設計時,永遠也不用給任何變數指定資料型別,該語言會在你第一次賦值給變數時,在內部將資料型別記錄下來。Python和Ruby就是一種典型的動態型別語言,其它的各種指令碼語言如VBScript也多少屬於動態型別語言。

靜態型別語言:
靜態型別語言剛好和動態型別語言相反,它的資料型別是在編譯期間去檢查的,也就是說在寫程式時,是需要宣告變數的資料型別的,如C/C++就是典型的例子,其它的還有C#、Java等。

強型別定義語言:
是指強制資料型別定義的語言。也就是說,一旦一個變數被指定了某個資料型別,如果不經過強制轉換,那麼它就是永遠這個資料型別了。比如說,如果定義了整型變數a,那麼程式就不會把a當做字串型別處理了。強型別定義語言時型別安全的語言。

弱型別定義語言:
資料型別可以被忽略的語言。一個變數可以被賦予不同資料型別的值。

總結:
強型別語言執行速度慢於弱型別語言,但是強型別定義語言更安全,Python是強型別定義語言。另外,一門語言是不是動態語言和是不是強型別定義語言沒有任何關係。

由此得出結論,Python是一門解釋型的動態強型別定義語言。

那麼Python的優缺點有哪些?
優點:
1、優雅、明確、簡單,容易入門
2、開發效率很高,有強大的第三方庫
3、高階語言,無需考慮記憶體呼叫等底層細節
4、可移植性
5、可擴充套件性,如果希望關鍵程式碼不公開,這部分可以用C或C++來寫,然後在Python中使用
6、可嵌入性,可以把Python嵌入C/C++程式,向用戶提供指令碼功能
缺點:
1、速度慢,Python比C和Java都要慢
2、程式碼不能加密
3、執行緒不能利用多CPU

Python直譯器:
當我們編寫Python程式碼時,我們得到的是一個包含Python程式碼的以.py為副檔名的文字檔案。要執行程式碼,就需要Python直譯器去執行.py檔案。
由於整個Python語言從規範到直譯器都是開源的。所以理論上,只要水平夠高,任何人都可以編寫Python直譯器來執行Python程式碼(當然難度很大)。事實上,確實存在多種Python直譯器。
CPython:
存在於Python官方網站,C語言開發的,使用最廣。Linux預設安裝也是這個。
IPython:
基於CPython之上的互動式直譯器。IPython只是在互動方式上有所增強,但是執行程式碼功能和CPython其實一樣。好比很多瀏覽器外觀不同,其實質都是核心呼叫IE。
PyPy:
執行速度快一些,採用JIT技術,對Python程式碼動態編譯(注意不是解釋),所以可以顯著提高Python程式碼執行速度。絕大部分Python程式碼都可以在PyPy下執行,但是PyPy和CPython有些不同,這就導致相同Python程式碼在兩種直譯器下輸出結果有些不同。
Jython:
執行在Java平臺上的Python直譯器,可以直接把Python程式碼編譯成Java位元組碼的執行。
IronPython:
執行在微軟.net平臺上的Python直譯器,可以直接把Python程式碼編譯成.Net的位元組碼。

Twisted目前還不支援[email protected],該模組正在改。

用PyCharm來開發Python程式碼,效果很好,開發效率高。

Python的第一個程式Hello World:
print("Hello World!")
輸出:
Hello World
若是在Linux下執行:
vim hello_world.py
#!/usr/bin/env python -> 最好的寫法
print("Hello World!")
chmod +x hello_world.py
./hello_world.py

關於變數:
變數是用來存資料的,為了後面的呼叫。
name = "Alex Hou"
注意,=兩邊有空格。

示例:
name = "Alex Hou"
print("My name is ",name)
輸出:
My name is Alex Hou

示例:
name = "Alex Hou"
name2 = name
name = "new string"
print(name,name2)
輸出:
new string Alex Hou
說明:
上述示例的原理是這樣的,name這個變數首先被賦值"Alex Hou",接著name2這個變數也被賦值"Alex Hou",這些賦值的行為是在記憶體中開闢新的空間,然後變數通過指標指向這些記憶體地址,因此也就表示該變數中存著這些值,之後name變數又被賦予新的值"new string",此時name變數的指標指向新的記憶體地址,原來的指標失效了,因此name變數此時有了新的值,而name2是不受影響的。

變數定義的規則:
1、變數名只能是字母、數字或者下劃線的任意組合
2、變數名的第一個字元不能是數字
3、以下關鍵字不能宣告為變數名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
4、變數取名要有意義,容易讀懂
5、不寫拼音和中文
6、巧用下劃線,gf_of_alex
7、巧用駝峰寫法,GFOfAlex
8、在Python中表示常量,一般寫全大寫,如PIE = 3.14

關於字元編碼:
Python直譯器在載入.py檔案中的程式碼時,會對內容進行編碼(預設Ascii)
Ascii(American Standard Code for Information Interchange,美國標準資訊交換程式碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其它西歐語言,其最多隻能用8位來表示(1個位元組),所以Ascii碼最多隻能表示255個符號。

Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字元編碼。Unicode是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制碼,規定所有的字元和符號最少由16位來表示(2個位元組),2**16=65536
UTF-8,是對Unicode編碼的壓縮和優化,它不再使用最少使用2個位元組,而是將所有的字元和符號進行分類:Ascii碼中的內容用1個位元組儲存、歐洲的字元用2個位元組儲存、東亞的字元用3個位元組儲存。

註釋:
單行註釋:# 被註釋內容
多行註釋:''' 被註釋內容 ''',或者""" 被註釋內容 """
在Python中,單引號和雙引號基本上是一樣的,除了以下的情況:
msg = "I'm Alex."

關於在Python3.x中的使用者輸入:
使用input函式:
name = input("what is your name?")
print("Hello " + name)
輸入密碼時,如果想要不可見,需要利用getpass模組中的getpass方法,即:
import getpass
pwd = getpass.getpass("請輸入密碼: ")
print(pwd)
注意,getpass模組在PyCharm中不好用,只能在cmd中使用。

列印一個變數的資料型別:
print(type(age))
檢視變數age的資料型別。

Python中的佔位符,顧名思義就是插在輸出裡站位的符號。我們可以把它理解成我們預定飯店。當我們告訴飯店的時候,飯店的系統裡會有我們的預定位置。雖然我們現在沒有去但是後來的顧客就排在我們後面。
常用的佔位符有三個:
1、%s,字元型佔位符。在Python中,input()函式使用者輸入預設是字元型的,因此預設%s佔位符,其餘佔位符不可用,如果需要使用,需要強制轉換,如:
age = int(input("age:"))
由於使用了int()函式,此時的age變數型別是整數型,原來預設是字元型。
如果想轉字元型,可以使用str()函式。
raw_input()是在Python 2.x中使用的,和Python 3.x中的input()是一樣的。
在Python 2.x中也有input()函式,它接收到什麼資料型別,就是什麼資料型別,用起來有些複雜,不建議使用。
2、%d,整數型佔位符。
3、%f,浮點數型佔位符。

Python中的format函式,也可以起到格式化的作用:
format函式常與print()函式結合使用,具備很強的格式化輸出能力。
通過變數,逗號隔開:
print('{我}今天{action}'.format(我='攔路雨',action ='在寫部落格'))
通過位置:
print('{1}今天{0}'.format('攔路雨','寫部落格'))

關於Python中的if函式:
舉例:
_username = "alex"
_password = "abc123"
username = input("username:")
password = getpass.getpass("password")
if _username == username and _password == password:
print("Welcome user {name} login...".format(name=username))
else:
print("Invalid username or password!")
注意,自動縮排。
縮排的目的可以省去結束符,並且結構優雅,縮排還表示邏輯和級別結構。
頂級程式碼必須頂格寫。

==,表示等於。
=,表示賦值。

舉例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
if guess_age == age_of_oldboy:
print("Yes, you got it.")
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")

關於Python中的迴圈,使用while語句:
count = 0
while True: -> 無限迴圈
print("count:",count)
count = count + 1 # count +=1

舉例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
count = 0
while count < 3:
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
else:
print("You have tried too many times.")

關於Python中的迴圈,使用for語句:
for i in range(10):
print("loop ",i)
注意,這裡是0到9的列印。

舉例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
for i in range(3):
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
else:
print("You have tried too many times.")

舉例:
for i in range(0,10,2)
這裡指,從0列印到10,間隔為2,列印0,2,4,6,8

舉例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
for i in range(3):
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
if count == 3:
countine_confirm = input("do you want to keep guessing?")
if continue_confirm != 'n':
count = 0

break是跳出迴圈,並且結束整個迴圈不再繼續。
continue是跳出本次迴圈,進行下一次迴圈。