Python學習(1):基本資料型別
python是一門新興的膠水語言,在國外得到了廣泛的應用。在國外,程式設計基礎課一般會選擇pyhon作為程式語言。在國內,大學程式設計課上使用的語言一開始都是C語言,幾年來也在逐漸往python上轉。python以其簡單易用,函式庫眾多而備受青睞。在機器學習領域,學術界一般會用matlab或者R來做相關的研究。而由於matlab屬於付費軟體,其使用受到版權的限制,因而在工業界應用不多。python、scala、tenserflow是目前機器學習方面使用比較多的的幾門程式語言。
一、程式設計環境
pyhon安裝:
1.首先下載安裝python。
2.安裝下載包。
3.新增環境變數,把python的安裝路徑新增到path中。
4.測試。在cmd中輸入python,出現版本資訊即為安裝成功。
為了方便安裝pyhon的其它安裝包,一般會用到pip方法。有了pip之後,再安裝python的其它庫時,可以直接在cmd中輸入pip install XXX(pyhon庫名 )即可安裝。
pip安裝:
1.下載最新的
2.解壓安裝。
3.下載Windows的easy install,並安裝。
4.安裝setuptools工具。
5.命令列工具cd切換到pip的目錄,找到setup.py檔案,然後輸入python setup.py install,執行即可(之所以能執行這步,是因為之前安裝的setuptools工具,以後就可以隨意安裝python的庫了,只要找對setup.py檔案的路徑,執行上述命令,就可以方便的安裝了)。
6.把python的安裝路徑新增到環境變數path中,例如G:\python2.6\Scripts
7.完成!
二、基本語法
python的基本語法與C語言、matlab基本一致,個人覺得python是更接近與matlab的一門語言。
python中對於製表符(Tab)的運用十分嚴格,錯誤的對齊方式會導致程式編譯出錯。這個特點帶來的一個好處是python中一個語句塊結束的時候,不需要附加識別符號。在C語言中需要用“{}”來表明這是一個語句塊。在matlab中用end來表示語句塊的結束。在python中這些都是不必要的。當需要寫一個語句塊時,在前面加上製表符(Tab)就行。退出語句塊時,則不加製表符(Tab)即可。
python中的for、while、break、continue的運用與其他程式語言相同,不再過多介紹。
python中的 in 操作的使用在C語言和matlab中都沒有,因此特別地提一提。一般情況下,s1 in s表示是否在s中存在s1序列,存在則返回True。而在迴圈中,如 for a in s: 則會依次將s中的元素賦給a。
python的print(): 對於需要格式化輸出某個變數的值的時候,print的用法與C語言類似,但是還有所不同。一般用法有兩種,分別為:
name='Hansyang'
print("My name is %s and weight is %d kg!" % ('Hansyang', 22) )
print("My name is”,name, "and weight is", 22)
兩種方法不能混合使用。
格式化字元的符號為:
%c 格式化字元及其ASCII碼
%s 格式化字串
%d 格式化整數
%u 格式化無符號整型
%o 格式化無符號八進位制數
%x 格式化無符號十六進位制數
%X 格式化無符號十六進位制數(大寫)
%f 格式化浮點數字,可指定小數點後的精度
%e 用科學計數法格式化浮點數
%E 作用同%e,用科學計數法格式化浮點數
%g %f和%e的簡寫
%G %f 和 %E 的簡寫
%p 用十六進位制數格式化變數的地址
三、變數型別
Python 中的資料基本分為數字、字串、列表、元組和字典。
變數型別的定義:
數字:無標識,直接賦值為數字,如:s=5。
字串:”“或者”進行標識,如s=’hello world’或者s=”hello world”。
列表:最常用的型別,用[]進行標識,如:s=[‘abcd’,123,2]。
元組:只讀列表,不可二次賦值,用()進行標識,如s=(‘abcd’,123,2)。
字典:用{x:y,}來標識,如:s={‘name’:’zhangsan’,’age’:22}。需要注意的是中間的“:”必須存在。此處區別於集合類資料,集合是將所有量當成集合元素來考慮,重複的量將會被當成同種元素,常用於去除重複量。二者存在很大區別。
每種變數有其特殊方法:
數字:
對於數字類的變數,有一些常用函式,不屬於任何包,可直接使用的有:
函式 返回值 ( 描述 )
abs(x) 返回數字的絕對值,如abs(-10) 返回 10
ceil(x) 返回數字的上入整數,如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x) 返回e的x次冪(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回數字的絕對值,如math.fabs(-10) 返回10.0
floor(x) 返回數字的下舍整數,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10為基數的x的對數,如math.log10(100)返回 2.0
max(x1, x2,…) 返回給定引數的最大值,引數可以為序列。
min(x1, x2,…) 返回給定引數的最小值,引數可以為序列。
modf(x) 返回x的整數部分與小數部分,兩部分的數值符號與x相同,整數部分以浮點型表示。
pow(x, y) x**y 運算後的值。
round(x [,n]) 返回浮點數x的四捨五入值,如給出n值,則代表舍入到小數點後的位數。
sqrt(x) 返回數字x的平方根,數字可以為負數,返回型別為實數,如math.sqrt(4)返回 2+0j。
對於隨機數,需要在import隨機數的包之後才能使用:
choice(seq) 從序列的元素中隨機挑選一個元素,比如random.choice(range(10)),從0到9中隨機挑選一個整數。
randrange ([start,] stop [,step]) 從指定範圍內,按指定基數遞增的集合中獲取一個隨機數,基數預設值為1
random() 隨機生成下一個實數,它在[0,1)範圍內。
seed([x]) 改變隨機數生成器的種子seed。如果你不瞭解其原理,你不必特別去設定seed,Python會幫你選擇seed。
shuffle(lst) 將序列的所有元素隨機排序
uniform(x, y) 隨機生成下一個實數,它在[x,y]範圍內。
還有其他的比如三角函式等,不太常用,故不列出。
列表
對於列表類和字串類的變數,可以通過s[i]的方式訪問單個元素值,也可以用s[j:k]的方式訪問多個連續元素。
在列表、字串中都可以用‘+’來實現兩個同類變數的連線,而在字典中則不可以使用‘+’來實現。
同時,還可以用*來實現列表的重複。
del s[k] 可以刪除列表中的某個變數。
len(s) 獲得列表長度。
max(s)/min(s) 最大/最小值。
cmp(s1,s2) 比較是否相同。
s.count(obj) 統計某個元素在列表中出現的次數
s.index(obj) 從列表中找出某個值第一個匹配項的索引位置
s.insert(index, obj) 將物件插入列表
s.pop(index=-1) 移除列表中的一個元素(預設最後一個元素),並且返回該元素的值
s.remove(obj) 移除列表中某個值的第一個匹配項
s.reverse() 反向列表中元素
s.sort([func]) 對原列表進行排序
s.extend(s1) 在列表末尾一次性追加另一個序列中的多個值(用新列表擴充套件原來的列表),即將s1中的每個元素依次加在s的後面,與’+’的作用相同。
s.append(s1) 將s1作為一個整體,加在s後面。注意此處需要與s.extend區分開來。
示例:
s0=[1,2,3,4]
s1=s0
s2=[1,2]
print(s0.extend(s2))
print(s1.append(s2))
結果為:
[1,2,3,4,1,2]
[1,2,3,4,[1,2]]
字串
對於字串的操作與對於列表的基礎操作基本一致,包括’+’,’*’的使用和字串元素的讀取,都是一致的。字串的函式與列表的函式存在很大區別:
string.capitalize() 把字串的第一個字元大寫
string.center(width) 返回一個原字串居中,並使用空格填充至長度 width 的新字串
string.count(str, beg=0, end=len(string)) 返回 str 在 string 裡面出現的次數,如果 beg 或者 end 指定則返回指定範圍內 str 出現的次數
string.decode(encoding=’UTF-8’, errors=’strict’) 以 encoding 指定的編碼格式解碼 string,如果出錯預設報一個 ValueError 的 異 常 , 除 非 errors 指 定 的 是 ‘ignore’ 或 者’replace’
string.encode(encoding=’UTF-8’, errors=’strict’) 以 encoding 指定的編碼格式編碼 string,如果出錯預設報一個ValueError 的異常,除非 errors 指定的是’ignore’或者’replace’
string.endswith(obj, beg=0, end=len(string)) 檢查字串是否以 obj 結束,如果beg 或者 end 指定則檢查指定的範圍內是否以 obj 結束,如果是,返回 True,否則返回 False.
string.expandtabs(tabsize=8) 把字串 string 中的 tab 符號轉為空格,tab 符號預設的空格數是 8。
string.find(str, beg=0, end=len(string)) 檢測 str 是否包含在 string 中,如果 beg 和 end 指定範圍,則檢查是否包含在指定範圍內,如果是返回開始的索引值,否則返回-1
string.index(str, beg=0, end=len(string)) 跟find()方法一樣,只不過如果str不在 string中會報一個異常.
string.isalnum() 如果 string 至少有一個字元並且所有字元都是字母或數字則返
回 True,否則返回 False
string.isalpha() 如果 string 至少有一個字元並且所有字元都是字母則返回 True,
否則返回 False
string.isdecimal() 如果 string 只包含十進位制數字則返回 True 否則返回 False.
string.isdigit() 如果 string 只包含數字則返回 True 否則返回 False.
string.islower() 如果 string 中包含至少一個區分大小寫的字元,並且所有這些(區分大小寫的)字元都是小寫,則返回 True,否則返回 False
string.isnumeric() 如果 string 中只包含數字字元,則返回 True,否則返回 False
string.isspace() 如果 string 中只包含空格,則返回 True,否則返回 False.
string.istitle() 如果 string 是標題化的(見 title())則返回 True,否則返回 False
string.isupper() 如果 string 中包含至少一個區分大小寫的字元,並且所有這些(區分大小寫的)字元都是大寫,則返回 True,否則返回 False
string.join(seq) 以 string 作為分隔符,將 seq 中所有的元素(的字串表示)合併為一個新的字串
string.ljust(width) 返回一個原字串左對齊,並使用空格填充至長度 width 的新字串
string.lower() 轉換 string 中所有大寫字元為小寫.
string.lstrip() 截掉 string 左邊的空格
string.maketrans(intab, outtab]) maketrans() 方法用於建立字元對映的轉換表,對於接受兩個引數的最簡單的呼叫方式,第一個引數是字串,表示需要轉換的字元,第二個引數也是字串表示轉換的目標。
max(str) 返回字串 str 中最大的字母。
min(str) 返回字串 str 中最小的字母。
string.partition(str) 有點像 find()和 split()的結合體,從 str 出現的第一個位置起,把 字 符 串 string 分 成 一 個 3 元 素 的 元 組 (string_pre_str,str,string_post_str),如果 string 中不包含str 則 string_pre_str == string.
string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替換成 str2,如果 num 指定,則替換不超過 num 次.
string.rfind(str, beg=0,end=len(string) ) 類似於 find()函式,不過是從右邊開始查詢.
string.rindex( str, beg=0,end=len(string)) 類似於 index(),不過是從右邊開始.
string.rjust(width) 返回一個原字串右對齊,並使用空格填充至長度 width 的新字串
string.rpartition(str) 類似於 partition()函式,不過是從右邊開始查詢.
string.rstrip() 刪除 string 字串末尾的空格.
string.split(str=”“, num=string.count(str)) 以 str 為分隔符切片 string,如果 num有指定值,則僅分隔 num 個子字串
string.splitlines(num=string.count(‘\n’)) 按照行分隔,返回一個包含各行作為元素的列表,如果 num 指定則僅切片 num 個行.
string.startswith(obj, beg=0,end=len(string)) 檢查字串是否是以 obj 開頭,是則返回 True,否則返回 False。如果beg 和 end 指定值,則在指定範圍內檢查.
string.strip([obj]) 在 string 上執行 lstrip()和 rstrip()
string.swapcase() 翻轉 string 中的大小寫
string.title() 返回”標題化”的 string,就是說所有單詞都是以大寫開始,其餘字母均為小寫(見 istitle())
string.translate(str, del=”“) 根據 str 給出的表(包含 256 個字元)轉換 string 的字元,
要過濾掉的字元放到 del 引數中
string.upper() 轉換 string 中的小寫字母為大寫
string.zfill(width) 返回長度為 width 的字串,原字串 string 右對齊,前面填充0
string.isdecimal() isdecimal()方法檢查字串是否只包含十進位制字元。這種方法只存在於unicode物件。
元組
使用較少,不作介紹。
字典
字典中每個元素由鍵和鍵值組成,鍵可以是數字、字串或者元組,不能是列表。鍵相當於每個元素的身份證號,必須唯一。建立時,如果有一個鍵被用了兩次,只有後一個的值會被儲存下來。
字典中的元素的訪問與列表類似,不同之處在於編號變成了鍵。
字典的內建函式和方法有:
cmp(dict1, dict2) 比較兩個字典元素。
len(dict) 計算字典元素個數,即鍵的總數。
str(dict) 輸出字典可列印的字串表示。
type(variable) 返回輸入的變數型別,如果變數是字典就返回字典型別。
dict.clear() 刪除字典內所有元素
dict.copy() 返回一個字典的淺複製
dict.fromkeys(seq,val) 建立一個新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對應的初始值
dict.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回default值dict.has_key(key) 如果鍵在字典dict裡返回true,否則返回false
dict.items() 以列表返回可遍歷的(鍵, 值) 元組陣列
dict.keys() 以列表返回一個字典所有的鍵
dict.setdefault(key, default=None) 和get()類似, 但如果鍵不存在於字典中,將會新增鍵並將值設為default
dict.update(dict2) 把字典dict2的鍵/值對更新到dict裡
dict.values() 以列表返回字典中的所有值
結束語
python中的基本變數型別就只有以上五種,由於元組不常用,其實真正常用的變數型別只有四種。掌握了這四種變數型別,就算基本掌握了python的使用,至少在topcoder的SRM比賽中,基本就可以使用python來進行程式設計了。但是僅僅掌握這部分內容,只是掌握了python中最基礎的用法。要想使用python來進行機器學習演算法的開發,還有很多東西需要學習。
後期對於python的學習中,將會在檔案處理、GUI程式設計、多執行緒、分散式計算等方面逐層深入。由於python簡單易用的特點,對於有程式設計基礎的人來說,學習階段應該在一週內就能完成。後期的專案實訓,才是耗時費力的階段。
我在之前的學習中,對於Java和C++都有過接觸,曾經也想學習這兩門程式語言。但是學習的時候都是零零散散,最後花了很多時間,還是沒有掌握這兩門語言的用法。每次參加SRM演算法比賽,要麼是在C++的框架下寫C程式碼,要麼就是邊寫Java邊查各個型別的變數的用法。後期如果有時間,可以考慮系統地把這兩門語言的基礎性的用法再過一遍,以便將來在面對實際專案時,有更多的選擇。