全棧 - 4 Python 先學會基本語法
這是全棧數據工程師養成攻略系列教程的第四期:4 Python 先學會基本語法。
Python簡單易學,但又博大精深。許多人號稱精通Python,卻不會寫Pythonic的代碼,對很多常用包的使用也並不熟悉。學海無涯,我們先來了解一些Python中最基本的內容。
Python的特點
- 解釋型語言,無需編譯即可運行
- 提供了互動式命令行
- 基於對象的編程思想
- 跨平台和良好的兼容性,在Windows、Mac、Linux上都可運行
- 簡單好用而且功能強大
中文編碼
很多同學在打開數據時會遇上亂碼問題,其原因是字符集的編碼問題。Linux和Mac默認的編碼集是UTF8,而Windows則是ASCII。如果數據編碼的字符集,和你使用Python進行處理時所用的字符集不同,則會出現亂碼問題。
這裡是一篇參考文章,Python字元編碼詳解 - AstralWind - 博客園,詳細地介紹了Python中文編碼所涉及的內容。
另外,我個人的習慣是在Python代碼的頭部加入以下內容,其中第二行聲明了使用UTF8字符集。
#!/usr/bin/env pythonn# coding:utf8n
變數
Python中的變數可以看作是一個個容器,裡面存放著我們需要使用到的值。Python對變數名的要求和其他語言一樣:可以包括英文、數字以及下劃線,但不能以數字開頭,區分大小寫。當然我推薦,變數名用純英文就很好,並且取一些有意義的名稱,便於自己理解每個變數的作用。
Python是一門弱類型的語言,在使用變數時無需聲明其類型。Python中的變數包括以下幾類:數值、字元串、列表、元組、字典。
數值
數值包括整型和浮點型,分別對應整數和浮點數,後者精度更高。
# 整型na = 1n# 浮點型nb = 2.1nprint a, bn
字元串
字元串也就是我們經常接觸到的文本,可以往裡面放任意長度的內容,用單引號或雙引號括起來。應當注意,中文以及中文符號只能出現在字元串內,如果在下面第三行中使用了中文輸入法的逗號 , ,Python將報錯。
c = Hellond = 你好nprint c, dn
使用 + 可以拼接兩個字元串。
print c + dn
使用 len() 可以得到字元串的長度。
print len(Hello World)n
使用切片可以訪問字元串中的某個字元或某個片段。
# 位置下標從0開始nc = Hello Worldn# 列印結果為H,下標為0表示第一個字元nprint c[0]n# 列印結果為d,下標為負數表示從後往前數n# 所以-1表示倒數第一個字元nprint c[-1]n# 使用:返回一個片段,冒號前後分別為開始下標和結束下標n# 包括開始下標,但不包括結束下標n# 因此c[1:5]表示,返回下標從1到4的片段,即第二個到第五個字元nprint c[1:5]n# 冒號前後的下標同樣可以使用負數n# 或者不提供,表示從最左端開始或一直到最右端nprint c[1:-1], c[:5], c[3:]n
列表
列表好比一條隊伍,裡面依次存放著多個變數。列表和字元串類似,但字元串中的每個元素都是字元,而列表中的每個元素可以是任意類型的變數。
# 使用[]定義一個空列表,使用append()向列表尾部添加一個元素n# 如果要添加到首部,就用prepend()好了na = []na.append(1)na.append(2.1)na.append(Hello)nprint an
使用 len() 可以獲得列表的長度。
print len(a)n
列表元素的按下標訪問和賦值等操作,和字元串都是類似的。
print a[1], a[-1]na[1] = 100nprint an
使用 del 刪除列表中的某個元素。
del a[0]nprint an
元組
元組和列表類似,唯一的不同是元組中的元素在初始化之後不能再更改,因此可以理解成一個只讀的變數。
# 使用()定義一個元組na = (1, 2.1, Hello)n# 嘗試修改元組中的元素會報錯na[0] = 100n
字典
字典是一種極為重要的變數類型,使用一個key來訪問相應的value,即一種鍵值對的數據形式。
# 使用{}定義一個字典na = {}n# 使用key來賦值valuena[k1] = 1na[k2] = 2.1na[k3] = Hellon
所以能夠總結出字典和列表的不同。列表中的元素是有序對等的,所以是用下標來賦值和訪問,而字典中的元素是無序的,所以是用key來操作相應的value。
# 也可以在定義字典和列表的同時進行賦值nli = [1, 2.1, Hello]ndi = {k1: 1, k2: 2.1, k3: Hello}n
使用 has_key() 判斷字典中是否有某個key。
print di.has_key(k4)n
如果訪問不存在的key,Python將會報錯。在賦值的時候,如果key已經存在,則會用新的value覆蓋已有的value。
注釋
被注釋的代碼將不會運行,可以看作是寫給自己和其他程序猿閱讀的一些筆記和說明,提高代碼可讀性。
# 這裡是單行注釋nnn這裡是n很多行n注釋nn
在Sublime中,選中需要注釋的內容,按Ctrl+/即可完成注釋。
保留字元
在Python中,有一些字元串具有某些特定功能,如 import 、 class 等。我們在選擇變數名時,應注意避開這些保留字元。
# 以下變數賦值將報錯nimport = 1n
行和縮進
在Python中,代碼塊的邊界不是通過大括弧等符號進行顯式劃分,而是通過行的縮進實現的。連續相同縮進水平的代碼處於同一個代碼塊,在使用 for 、 while 、 if 、 try 等語法時需要注意每行代碼的縮進。
運算符
運算符的作用是根據已有的變數生成新的變數,主要有以下幾種:
- 算術運算符:+,-,*,/,%,即加、減、乘、除、取余
- 比較運算符:==,!=,>,<,>=,<=,即等於、不等於、大於、小於、大於等於、小於等於
- 賦值運算符:=,+=,-=,*=,/=,%=,即賦值、加賦值、減賦值、乘賦值、除賦值、取余賦值
- 邏輯運算符:and,or,not,即與、或、非
a = 1nb = 2nprint a + bnnprint a == bnn# 等價於 a = a + 3na += 3nprint annc = Truend = Falsenprint c and dn
條件
在寫代碼的時候,往往需要根據某些條件進行判斷,並根據判斷結果執行不同的分支代碼。
a = 1n# 單個條件nif a == 1:n print 11111nn# 處理條件不成立的分支nif a == 2:n print 22222nelse:n print 33333nn# 多個條件,加多少個都可以nif a == 1:n print 11111nelif a == 2:n print 22222nelse:n print 33333n
需要注意的是,但凡出現了 if 和 elif ,就需要加上相應的條件判斷,並且注意代碼的縮進。
在Sublime中輸入 if 會出現相應的提示,可以方便地補全代碼,在換行時游標也會自動跳到合適的縮進處。
循環
如果需要列印從1到100的100個數,肯定不會傻傻地寫100行print代碼,而是會用循環來處理類似的重複性工作。
while 循環
while 循環的思想是,只要某一條件成立,就不斷執行循環體里的代碼,直到條件不再成立。
flag = 1nwhile flag < 10:n print flagn # 一定要記得在循環體里修改條件變數n # 否則可能導致死循環n flag += 1n
for 循環
for 循環的循環次數一般是事先預知的,將一個標誌變數從某個起始值迭代到某個終止值後即結束。
# x從0開始,一直到9結束nfor x in xrange(0, 10):n print xn
可以用 for 循環方便地遍歷列表和字典。
li = [1, 2.1, Hello]ndict = {k1: 1, k2: 2.1, k3: Hello}nn# 遍歷列表,這裡的item只是一個臨時變數,取別的名稱也行nfor item in li:n print itemnn# 遍歷字典的全部key,這裡的key也只是一個臨時變數,名稱不重要nfor key in dict.keys():n print keynn# 遍歷字典的全部value,這裡的value也只是一個臨時變數,名稱不重要nfor value in dict.values():n print valuenn# 同時遍歷key和valuenfor key, value in dict.items():n print key, valuen
循環控制
循環控制主要包括三種: pass 、 continue 、 break 。
pass 表示什麼也不做,只是佔一行代碼的位置;continue 表示立即退出本輪循環,繼續執行後續輪循環;break 表示立即推出循環,後續循環也不再執行。
for x in xrange(0, 10):n if x == 5:n passn else:n print xnnfor x in xrange(0, 10):n if x == 5:n continuen print xnnfor x in xrange(0, 10):n if x == 5:n breakn print xn
時間
在處理數據時,很多地方都會涉及到時間,例如數據產生的時間。
先介紹一下時間戳的概念,時間戳指的是從1970年1月1日0時0分0秒開始,到某一時刻所經歷的秒數,可以是整數或者小數,後者的精度更高。
為什麼需要時間戳這樣的一個概念?因為對於同一個時刻,不同人的描述可能不同,畢竟文本的形式千變萬化,而時間戳使得時間的表達得到了統一,每個時刻只能用唯一的整數或浮點數來表示,同時也便於計算時間差這樣的處理。
# 來看一下當前時刻的時間戳吧nimport timent = time.time()nprint t, type(t)n
關於時間戳,最常用的處理便是時間戳和時間文本之間的轉換,例如將 2016年10月1日 10時0分0秒 轉為時間戳。
import timen# 時間文本轉時間戳,精確到秒na = 2016-10-01 10:00:00na = int(time.mktime(time.strptime(a,%Y-%m-%d %H:%M:%S)))nprint an# 時間戳轉時間文本nb = int(time.time())nb = time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(b))nprint bn
其中, %Y 、 %m 等都是時間欄位,前者表示四位的年份,後者表示兩位的月份。
文件
文件操作包括向文件中寫內容,以及從文件中讀內容,使用 open() 打開一個文件。
# 寫文件n# 重新寫模式,打開文件時會將文件內容清空nfw = open(data.txt, w)n# a為追加寫模式,打開文件後保留原始內容,繼續寫入nfor x in xrange(0, 10):n # 將整數轉成文本再寫入n fw.write(str(x))n # 也可以每次寫入之後換行,n為轉義字元,表示換行n # fw.write(str(x) + n)nfw.close()nn# 讀文件nfr = open(data.txt, r)n# 一行一行地讀,line只是個臨時變數,取別的名稱也行nfor line in fr:n print linen # 如果每行後面有換行,可以將換行符去掉,使內容更緊湊n # strip()可以去掉字元串兩端的空白字元n # print line.strip()nfr.close()n
異常
Python代碼中可能會出現一些可以預知的問題,例如字典訪問的key不存在。如果不加處理,發生問題的時候Python便會報錯並退出,可能之前跑了很久又要重頭再來。因此,我們需要對可能出現的異常進行捕捉和處理。異常的結構由 try 、 except 、 else 、 finally 四部分組成。
try:n # 嘗試執行這些代碼n print 1 / 0nexcept Exception, e:n # 如果出現異常就進行處理n # e為出現的異常類型n print enelse:n # try里的代碼沒有出錯n # 可以執行後續工作了n print 沒有出錯nfinally:n # 無論是否出錯,都會執行的代碼n print 一定會執行n
函數
函數的作用是代碼模塊化,將可重用的代碼封裝成一個函數,這樣在需要使用的時候就只需調用寫好的函數即可,而不用重新寫一遍代碼。
函數的使用包括兩個部分,函數的定義和函數的調用。除此之外,函數可以有一個或多個參數,參數之間以逗號分開,為函數的功能提供更多的靈活性。
# 定義函數ndef hello(name1, name2):n print Hello + name1 + + name2nn# 調用函數nhello(Python, JavaScript)n
補充學習
以上所介紹的,都是Python中最基礎和最常用的內容,先掌握這些就可以跟上後續章節。
當然,如果希望更全面更系統地學習一遍Python,可以參考以下鏈接。學習時間更多、成本更高,但是能掌握得更全更深。
- 菜鳥教程:Python 基礎教程 | 菜鳥教程
- 廖雪峰的Python教程:Python教程
視頻鏈接:
數據類型與運算符判斷、循環與時間讀寫文件、異常以及函數推薦閱讀:
※如何成為全棧工程師
※用Ubuntu做日常開發電腦的系統是一種怎樣的體驗?
※Angular4正式版發布了,如何正確認識?
※全棧設計師的前景如何?
※怎麼看待李笑來的全棧工程師課程?