這是全棧數據工程師養成攻略系列教程的第四期:4 Python 先學會基本語法。javascript
Python簡單易學,但又博大精深。許多人號稱精通Python,卻不會寫Pythonic的代碼,對不少經常使用包的使用也並不熟悉。學海無涯,咱們先來了解一些Python中最基本的內容。html
不少同窗在打開數據時會趕上亂碼問題,其緣由是字符集的編碼問題。Linux和Mac默認的編碼集是UTF8,而Windows則是ASCII。若是數據編碼的字符集,和你使用Python進行處理時所用的字符集不一樣,則會出現亂碼問題。java
這裏是一篇參考文章,www.cnblogs.com/huxi/archiv…,詳細地介紹了Python中文編碼所涉及的內容。python
另外,我我的的習慣是在Python代碼的頭部加入如下內容,其中第二行聲明瞭使用UTF8字符集。編程
#!/usr/bin/env python
# coding:utf8複製代碼
Python中的變量能夠看做是一個個容器,裏面存放着咱們須要使用到的值。Python對變量名的要求和其餘語言同樣:能夠包括英文、數字以及下劃線,但不能以數字開頭,區分大小寫。固然我推薦,變量名用純英文就很好,而且取一些有意義的名稱,便於本身理解每一個變量的做用。app
Python是一門弱類型的語言,在使用變量時無需聲明其類型。Python中的變量包括如下幾類:數值、字符串、列表、元組、字典。less
數值包括整型和浮點型,分別對應整數和浮點數,後者精度更高。ide
# 整型
a = 1
# 浮點型
b = 2.1
print a, b複製代碼
字符串也就是咱們常常接觸到的文本,能夠往裏面聽任意長度的內容,用單引號或雙引號括起來。應當注意,中文以及中文符號只能出如今字符串內,若是在下面第三行中使用了中文輸入法的逗號 ,
,Python將報錯。模塊化
c = 'Hello'
d = '你好'
print c, d複製代碼
使用 +
能夠拼接兩個字符串。函數
print c + d複製代碼
使用 len()
能夠獲得字符串的長度。
print len('Hello World')複製代碼
使用切片能夠訪問字符串中的某個字符或某個片斷。
# 位置下標從0開始
c = 'Hello World'
# 打印結果爲H,下標爲0表示第一個字符
print c[0]
# 打印結果爲d,下標爲負數表示從後往前數
# 因此-1表示倒數第一個字符
print c[-1]
# 使用:返回一個片斷,冒號先後分別爲開始下標和結束下標
# 包括開始下標,但不包括結束下標
# 所以c[1:5]表示,返回下標從1到4的片斷,即第二個到第五個字符
print c[1:5]
# 冒號先後的下標一樣可使用負數
# 或者不提供,表示從最左端開始或一直到最右端
print c[1:-1], c[:5], c[3:]複製代碼
列表比如一條隊伍,裏面依次存放着多個變量。列表和字符串相似,但字符串中的每一個元素都是字符,而列表中的每一個元素能夠是任意類型的變量。
# 使用[]定義一個空列表,使用append()向列表尾部添加一個元素
# 若是要添加到首部,就用prepend()好了
a = []
a.append(1)
a.append(2.1)
a.append('Hello')
print a複製代碼
使用 len()
能夠得到列表的長度。
print len(a)複製代碼
列表元素的按下標訪問和賦值等操做,和字符串都是相似的。
print a[1], a[-1]
a[1] = 100
print a複製代碼
使用 del
刪除列表中的某個元素。
del a[0]
print a複製代碼
元組和列表相似,惟一的不一樣是元組中的元素在初始化以後不能再更改,所以能夠理解成一個只讀的變量。
# 使用()定義一個元組
a = (1, 2.1, 'Hello')
# 嘗試修改元組中的元素會報錯
a[0] = 100複製代碼
字典是一種極爲重要的變量類型,使用一個key來訪問相應的value,即一種鍵值對的數據形式。
# 使用{}定義一個字典
a = {}
# 使用key來賦值value
a['k1'] = 1
a['k2'] = 2.1
a['k3'] = 'Hello'複製代碼
因此可以總結出字典和列表的不一樣。列表中的元素是有序對等的,因此是用下標來賦值和訪問,而字典中的元素是無序的,因此是用key來操做相應的value。
# 也能夠在定義字典和列表的同時進行賦值
li = [1, 2.1, 'Hello']
di = {'k1': 1, 'k2': 2.1, 'k3': 'Hello'}複製代碼
使用 has_key()
判斷字典中是否有某個key。
print di.has_key('k4')複製代碼
若是訪問不存在的key,Python將會報錯。在賦值的時候,若是key已經存在,則會用新的value覆蓋已有的value。
被註釋的代碼將不會運行,能夠看做是寫給本身和其餘程序猿閱讀的一些筆記和說明,提升代碼可讀性。
# 這裏是單行註釋
'''
這裏是
不少行
註釋
'''複製代碼
在Sublime中,選中須要註釋的內容,按Ctrl+/便可完成註釋。
在Python中,有一些字符串具備某些特定功能,如 import
、 class
等。咱們在選擇變量名時,應注意避開這些保留字符。
# 如下變量賦值將報錯
import = 1複製代碼
在Python中,代碼塊的邊界不是經過大括號等符號進行顯式劃分,而是經過行的縮進實現的。連續相同縮進水平的代碼處於同一個代碼塊,在使用 for
、 while
、 if
、 try
等語法時須要注意每行代碼的縮進。
運算符的做用是根據已有的變量生成新的變量,主要有如下幾種:
a = 1
b = 2
print a + b
print a == b
# 等價於 a = a + 3
a += 3
print a
c = True
d = False
print c and d複製代碼
在寫代碼的時候,每每須要根據某些條件進行判斷,並根據判斷結果執行不一樣的分支代碼。
a = 1
# 單個條件
if a == 1:
print 11111
# 處理條件不成立的分支
if a == 2:
print 22222
else:
print 33333
# 多個條件,加多少個均可以
if a == 1:
print 11111
elif a == 2:
print 22222
else:
print 33333複製代碼
須要注意的是,但凡出現了 if
和 elif
,就須要加上相應的條件判斷,而且注意代碼的縮進。
在Sublime中輸入 if
會出現相應的提示,能夠方便地補全代碼,在換行時光標也會自動跳到合適的縮進處。
若是須要打印從1到100的100個數,確定不會傻傻地寫100行print代碼,而是會用循環來處理相似的重複性工做。
while 循環的思想是,只要某一條件成立,就不斷執行循環體裏的代碼,直到條件再也不成立。
flag = 1
while flag < 10:
print flag
# 必定要記得在循環體裏修改條件變量
# 不然可能致使死循環
flag += 1複製代碼
for 循環的循環次數通常是事先預知的,將一個標誌變量從某個起始值迭代到某個終止值後即結束。
# x從0開始,一直到9結束
for x in xrange(0, 10):
print x複製代碼
能夠用 for 循環方便地遍歷列表和字典。
li = [1, 2.1, 'Hello']
dict = {'k1': 1, 'k2': 2.1, 'k3': 'Hello'}
# 遍歷列表,這裏的item只是一個臨時變量,取別的名稱也行
for item in li:
print item
# 遍歷字典的所有key,這裏的key也只是一個臨時變量,名稱不重要
for key in dict.keys():
print key
# 遍歷字典的所有value,這裏的value也只是一個臨時變量,名稱不重要
for value in dict.values():
print value
# 同時遍歷key和value
for key, value in dict.items():
print key, value複製代碼
循環控制主要包括三種: pass
、 continue
、 break
。
pass
表示什麼也不作,只是佔一行代碼的位置;continue
表示當即退出本輪循環,繼續執行後續輪循環;break
表示當即推出循環,後續循環也再也不執行。
for x in xrange(0, 10):
if x == 5:
pass
else:
print x
for x in xrange(0, 10):
if x == 5:
continue
print x
for x in xrange(0, 10):
if x == 5:
break
print x複製代碼
在處理數據時,不少地方都會涉及到時間,例如數據產生的時間。
先介紹一下時間戳的概念,時間戳指的是從1970年1月1日0時0分0秒開始,到某一時刻所經歷的秒數,能夠是整數或者小數,後者的精度更高。
爲何須要時間戳這樣的一個概念?由於對於同一個時刻,不一樣人的描述可能不一樣,畢竟文本的形式變幻無窮,而時間戳使得時間的表達獲得了統一,每一個時刻只能用惟一的整數或浮點數來表示,同時也便於計算時間差這樣的處理。
# 來看一下當前時刻的時間戳吧
import time
t = time.time()
print t, type(t)複製代碼
關於時間戳,最經常使用的處理即是時間戳和時間文本之間的轉換,例如將 2016年10月1日 10時0分0秒 轉爲時間戳。
import time
# 時間文本轉時間戳,精確到秒
a = '2016-10-01 10:00:00'
a = int(time.mktime(time.strptime(a,'%Y-%m-%d %H:%M:%S')))
print a
# 時間戳轉時間文本
b = int(time.time())
b = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(b))
print b複製代碼
其中, %Y
、 %m
等都是時間字段,前者表示四位的年份,後者表示兩位的月份。
文件操做包括向文件中寫內容,以及從文件中讀內容,使用 open()
打開一個文件。
# 寫文件
# 從新寫模式,打開文件時會將文件內容清空
fw = open('data.txt', 'w')
# 追加寫模式,打開文件後保留原始內容,繼續寫入
for x in xrange(0, 10):
# 將整數轉成文本再寫入
fw.write(str(x))
# 也能夠每次寫入以後換行,\n爲轉義字符,表示換行
# fw.write(str(x) + '\n')
fw.close()
# 讀文件
fr = open('data.txt', 'r')
# 一行一行地讀,line只是個臨時變量,取別的名稱也行
for line in fr:
print line
# 若是每行後面有換行,能夠將換行符去掉,使內容更緊湊
# strip()能夠去掉字符串兩端的空白字符
# print line.strip()
fr.close()複製代碼
Python代碼中可能會出現一些能夠預知的問題,例如字典訪問的key不存在。若是不加處理,發生問題的時候Python便會報錯並退出,可能以前跑了好久又要重頭再來。所以,咱們須要對可能出現的異常進行捕捉和處理。異常的結構由 try
、 except
、 else
、 finally
四部分組成。
try:
# 嘗試執行這些代碼
print 1 / 0
except Exception, e:
# 若是出現異常就進行處理
# e爲出現的異常類型
print e
else:
# try裏的代碼沒有出錯
# 能夠執行後續工做了
print '沒有出錯'
finally:
# 不管是否出錯,都會執行的代碼
print '必定會執行'複製代碼
函數的做用是代碼模塊化,將可重用的代碼封裝成一個函數,這樣在須要使用的時候就只需調用寫好的函數便可,而不用從新寫一遍代碼。
函數的使用包括兩個部分,函數的定義和函數的調用。除此以外,函數能夠有一個或多個參數,參數之間以逗號分開,爲函數的功能提供更多的靈活性。
# 定義函數
def hello(name1, name2):
print 'Hello ' + name1 + ' ' + name2
# 調用函數
hello('Python', 'JavaScript')複製代碼
以上所介紹的,都是Python中最基礎和最經常使用的內容,先掌握這些就能夠跟上後續章節。
固然,若是但願更全面更系統地學習一遍Python,能夠參考如下連接。學習時間更多、成本更高,可是能掌握得更全更深。
視頻連接: