Python 簡介
Python是一個解釋型的語言,也就是說:解釋器給CPU解釋一行,執行一行,速度相比較C是慢了許多;但,Python內置了大量的庫函數,還有大量的第三方庫,都可以為你編寫程序效力,所以僅需要簡短的代碼,就能干復雜的事情,這也是為什么流傳的“人生苦短,我用Python”的原因。
Python現在用兩個版本2.x和3.x,這兩個版本是不兼容的,本系列筆記是根據Python 3.x版本學習的,但當我在學習Python的過程中,如遇到python 2.x 和 3.x ,使用不同之處的地方,我會記錄下來,以便日后查找。Python既然是一個解釋型的語言,那么在編寫完源碼后(以.py為后綴名的文件)需要通過一個解釋器來逐行的將源碼解釋成機器語言,讓計算機執行。在安裝Python的時候,就自帶了官方的解釋器CPython,這是一個以提供一個命令行形式的解釋器。當然,你也可以不適用官方的,如比較流行的IPython,它是基於CPython之上的,可交互的解釋器。
簡短的Python小程序
那么,我們來開始一個簡短的python小程序吧!在寫程序之前,我們要了解Python是如何運行程序的。Python有兩種方式執行程序,第一是在python的交互式命令行里,輸入一行后,會立馬執行一行,這個可以方便我們用來驗證某一段Python代碼的正確性是非常有幫助的;第二種是在文本編輯器里輸入python源碼,然后保存為x.py文件,在這個文件的當前路徑下,通過 python x.py即可執行文件里的代碼。需要注意的是,不要使用Windows自帶的文本編輯器和word這樣編輯器來寫代碼,盡量不要復制粘貼別人的python代碼,因為會很容易出現縮進的問題。
讓我們和世界打個招呼吧:
print("Hello,world",'Hi,Python')
輸出: Hello,world空格Hi,Python
print()函數是python內置的函數,可以將字符串、變量、表達式等輸出到屏幕中去。這里我們看到,字符串用雙引號和單引號都是可以的(當然,混用是不可以的),這里的“,”逗號,會被輸出為空格。
那有了簡單的輸出了,如何從鍵盤輸入呢?Python提供了一個內置函數input():
name = input('please enter your name:')
在屏幕上會輸出please enter your name:並且等待的你的輸入,若你輸入:
This is Cool!
則,這個字符串“This isCool!”就會賦值給了變量name。注意,你的輸入都被作為字符串來處理。
Python 基本語法
OK,通過上面的簡短不精確的描述,你可能對Python有了一點點的了解,那么現在讓我們來開始學習Python的基本語法吧!
''' 先來一個熱身吧!你做好准備了? ''' raeay = 666 ready = input("Are you ready?") #輸入yes or no, 大小寫都可以 if ready.lower() == 'yes': print('Welcome\nThanks') else if ready.lower() == 'no': print('''Come on Belive in Yourself!''') else: print('Don\'t worry,You Can') print(r'Try again,\nit is easy for you')
‘’‘...''' : 這是一個可以寫多行的注釋
# 是單行注釋
縮進:
縮進是Python的一大特色,是很具有標志性的。當語句遇到:時接下來的語句視為代碼塊,也就是相當於Java 函數中的{語句塊}。這帶來的好處是,看起來很清爽(易於理解代碼),和強制你將一個很復雜的函數,拆分成多個簡單的函數。一般大家遵守的是一個tab鍵的空格(4個),所以你也不要列外。缺點是,當你copy別人的代碼時,要仔細地檢查縮進的問題啦!
ready變量指向的是你輸入的字符,python是一個動態的語言(與之對應的是靜態的語言C,Java),那怎么定義動態和靜態的呢?Python中的變量是可以任意轉換數據類型的,就如現在這個ready變量,在最開始我賦值給它一個整數型數值,那么此時ready變量是int類型(type(ready)來查看),但是,當你輸入字符的時候,ready就是str字符型的啦。Python變量的類型可以隨意變換,而在C語言中,在使用變量前,需要先聲明(int ready,聲明后該變量的數據類型就不會改變啦)才能使用,所以說,Python是一個動態的語言。ready變量和數據(666,和你的輸入)是什么關系呢?在Python中,數據皆是對象,即如:ready = 666,Python解釋器會告訴計算機先在內存中創建一個值為666整數,然后再創建一個名為ready變量,最后將這個ready變量指向整數666。程序執行到下一條,此時你輸入yes,Python解釋器會在內存中創建一個yes的字符串,並且將變量ready指向字符串yes。所以,如果遇到這樣的代碼:a=2; b=a; a=3; 你應該能知道,b指向2,a指向3。
lower()是Python內置函數,’Yes‘.lower() 為:yes,聰明的你,此時猜想 'yes'.upper()會是什么呢?在這我就不講啦,你知道答案的。
\n: 是轉義字符,換行的意思;那你要是想多換幾行,不想每一次換行都碼\n,怎么做呢? -- 通過在print()函數中,輸入
'''
感覺寫的可以啦,換到下一行
在文本編譯器里直接換行就行啦'''
\': 如果想在單引號的里輸出',就使用這種簡單的轉義字符\,那要是不想用轉義字符,可以使用r'你的輸入內容',這樣可以完整的顯示 你的輸入內容(注意,這里你的輸入內容是指,沒有單引號),print(r'Try again,\nit is easy for you'):輸出: Try again,\nit is easy for you
上面介紹到,Python是動態語言,因為變量可以改變其數據類型,那么我們就簡單的說說Python有哪幾種數據類型。
簡單來說,Python有這幾種數據類型,整數型,浮點型,字符串型,布爾型,列表型,字典型,你自己創建的類型。整數型和浮點型數據沒有大小的限制,太大(返回inf)
對於整數(int)和浮點數(float),先來簡單的聊聊他們的除法
/: a/b 無論a,b為整數還是浮點,結果都是浮點
// : 絕對除,a//b, 若a或b有一個為float,結果都為float類型,但值為取整,
%: 取余
對於布爾類型:
True 和 False , 注意大小寫,如 5 > 3 返回 True
三種運算: and 、or、 not
在Python里還有一個特殊的值,空值: None
字符集編碼問題
字符串是一種數據類型,但是字符串比較特殊的還有編碼問題:
Unicode、utf-8、gbk:接下來聊聊令人頭大的編碼問題:
我就簡單的理一理:
我們在用文本編輯器寫Python代碼時,需要注意兩個地方,第一個:# -*- coding: utf-8 -*-
將這個聲明放在文件的最上方,它是用來告訴Python編輯器,這個文件的源碼的字符集編碼是utf-8;第二個:將寫好的文件保存的格式設置為utf-8。這樣執行起來沒有任何問題啦!
讀取文件X到內存時,如果文件X是用utf-8的字符集編碼的話,數字和英文字符是一個字節,中文字符一般是三個字節,每個字節是(8bit),也就是說,文件X在硬盤上保存的是這些字符對應的很多個字節。那當讀入到內存時,全部都轉化為Unicode字符集編碼。當用Python3 open()函數默認設置,讀取文件X時,open()函數會調用當前的系統的字符集編碼(win下默認是gbk)的方式去讀取文件X到內存中去,如果打印此內容,就會出錯! 'gbk' codec can't decode byte 0...
所以,當我們使用open()函數去讀取文件時,要這樣設置f=open(filename,encoding='utf-8')這樣就會按照utf-8的字符集編碼去讀取文件啦,當我們在內存的X文件寫入到硬盤時,我們可以指定其編碼字符如 b'這里是字節,內存里的東西'.decode('utf-8',errors='ignore'),因為在讀取X文件時,X文件可能會出現非法字符,所以在寫入的時候,加上errors='ignore'
格式化輸出:
print('%d,%f,%s' % (23,3.14,'Wa'))
在%(可以為變量,表達式,常量,和字符串),但是,一定要一一對准位置
list 列表:
這個內容可豐富啦,有比較好用的切片,還有列表生成式,今天就簡單談談一些基本的:
a = [1,2.0,'fafa',[1,2,'where']]
列表的元素不限數據類型,a是一個列表從索引0開始,即a[1] 輸出:2.0, a[1:3] 輸出:[2.0,'fafa'], a[-1]輸出:[1,2,'where']
pop()函數刪除list末尾元素,a.pop(1),則刪除列表a第二個元素
insert(索引,內容):插入函數a.insert(0,90)在列表a第一個位置插入了90
append(),向列表末尾追加一個元素,該元素可以為列表,字符串等
extend(),也是向列表a末尾最加一個元素,若該元素為列表b,則將該列表b的元素取出加入到列表a中。如
a = [1, 2.0, 'fafa', [1, 2, 'where']]
a.append([1,2,3]):[1, 2.0, 'fafa', [1, 2, 'where'], [1, 2, 3]]
a.extend([1,2,3]): [1, 2.0, 'fafa', [1, 2, 'where'], 1, 2]
len(a): a列表的元素個數,len('strs'):'strs'字符串中的字符個數
truple元組:
truple元組一旦初始化就不可以改變啦:t = (1,2.0,'fafa',[1,2,'where'])
但是,當t[3][0] = 'A'; t[3][1] = 'B';
則 t: (1, 2.0, 'fafa', ['A', 'B', 'where']),這是為什么呢?
實際上是,不變指的是 指向 不變,也就是,t中第一個元素指向是 1 ,t 中第4個元素指向的是一個列表,但是列表中的第一指向,可以改變呀
所以,當要想創建一個內容不變的truple元組時,那就得保證truple的每一個元素本身也不能變
