Python基礎學習(二)
字串
Python將字串、列表和元組都當做序列,因此可對序列操作的函式都適用於以上三者,因此在Perl中常用的索引、切片等操作都適用於字串,這相比Perl就方便多了,如:
"Hello"[1]
如果切片始於開頭,則可以省略第一個索引(下面的結果是”Hel”,是因為Python的索引是半閉環,這點跟Perl不一樣,容易搞混):
"Hello"[:3]
可以用下述方式來複制序列(Python中簡單的變數賦值是不等於變數複製的)
a = "Hello" b = a[:]
可以在切片中加上第三個引數即步長
"Hello"[1:4:2]
還可以通過序列乘法來建立指定長度的空列表(一般的空列表都是用[]
直接建立的)
seq = [None] * 10
之前說有運算子in
,其也可以在字串中使用,判斷某個字元是否在字串中(但從這點來看,有時候處理字串時確實要比Perl方便)
'H' in 'Hello'
對於字串操作函式方便,本來我覺得肯定還是R方便,畢竟有個神奇的R包-stringr包,但是Python原來也有個string模組,而且現在還有些內建函式支援字串的操作,如:
-
string.upper()
和string.lower()
函式(大小寫轉化) -
string.count
(返回指定str出現次數) -
string.find
和string.index
(類似於Perl的index,返回指定str的索引) -
string.join
和string.split
(類似於Perl的split和join操作符) -
string.replace
(替換字串) -
string.startswith
(檢查是否以str字串開頭,這個可以省一個正則) -
string.translate
(類似於Perl的正則轉換,但是使用似乎有點繁瑣)
列表
Python裡建立變數時不需要指定型別,因此建立列表只要list = []
即可,整體上與Perl的陣列同一個用法,不外乎索引、切片以增加/刪除列表元素等方法
主要幾個常用函式:
-
字串/元組轉化為列表可以用
list()
函式 -
列表長度
len()
函式 -
取最大/最小數:
max()
和min()
刪除元素:
a = list("Hello") del a[0:2]
列表方法:
list.append("Hello") list.extend([1,2,3]) list.index("Hello") list.insert(1, "Hello") x = list.pop(0) list.count("Hello") list.remove("Hello")
還有一個與列表類似的是元組,兩者的不同之處只在於後者不能被修改!元組以()
建立,或者tuple("Hello")
,因此索引、切片都可對元組使用
除了上述簡單建立列表/元組的方法外,還可以通過表示式(推導式)的方法從序列建立你想要的列表/元組,一般接在for/if語句,如下所示:
vec = [2, 4, 6] [3*x for x in vec if x > 3]
然後如果要用上述方式建立巢狀列表的話:
[[x, x**2] for x in vec if x > 3]
對於巢狀陣列的訪問跟R的訪問方式類似,比Perl要方便點,如matrix = [[1,2,3], [4,5,6]]
,訪問第一個列表中的第一個元素,則matrix[0][0]
,歷遍輸出所有元素,則:
for i in matrix: for j in i: print(j)
del不僅可用於刪除變數,還可以刪除列表中的指定索引的元素,如del list[0:1]
;而刪除整個列表則可以:del list[:]
字典
Python的字典相當於Perl的雜湊,鍵與值之間以冒號分隔,{}
建立字典,或者用dict()
函式將鍵-值對序列轉化為字典
items = [("a", "aaa"), ("b", "bbb")] d = dict(items)
因此Perl中的雜湊規則一般都適用於字典,有些地方Python的字典顯得更加方便一點,如:
- len(d),返回鍵-值的數目
- d[k],返回鍵K對應的值(跟Perl的表示式不一樣),d[k] = v,將鍵k的值為v,可當做更改,也可當做賦值
- del d[k],刪除鍵k的鍵-值對
- k in d,檢視k是否在d字典的鍵中(而Perl中一般用匿名雜湊來判斷鍵是否存在)
- str(d),輸出可列印的字典字串表
對於字典中沒有的鍵也可以賦值(跟Perl一樣,類似於匿名雜湊);對於字典的鍵,可以用數字、字串或者元組,但不能用列表(Perl中的話,一般只能用變數或者引用),但字典的值卻無這個限制,如:
d["aa"] = ["a", "aa"]
字典也有像列表一樣的一系列方法:
-
d.items(),返回鍵-值的列表(叫字典檢視的特殊型別?),主要用於迭代吧,類似於:
for key, value in d.items(): print(key, value)
-
d.keys(),返回字典所有的鍵,返回的也是字典檢視,也可以叫做迭代器?,主要還是用於for迴圈,
list(d.keys())
;對應的還有d.values()
,返回所有的鍵對應的值 -
d.get(),返回指定鍵對應的值,如果鍵不存在則返回None(Perl的話直接訪問鍵就行,鍵不存在的話也不會報錯);類似的還有
d.setdefault()
,如果鍵不存在的話,可以指定鍵返回的值,相當於不返回None,當然如果鍵存在的話,就返回其對應的值 - d.fromkeys(),以輸出的序列為鍵建立一個新的字典,鍵返回值都是None
- d.clear(),清空字典
-
d.copy(),淺複製,建立一個副本字典;當副本修改時,原本無變化,當原本修改時,副本也隨之變化;為了避免以上問題,可以選擇copy模組的深複製函式
deepcopy(d)
在列表中所示的表示式也可以適用於字典(用冒號分割即可):
{x: x**2 for x in (2, 4, 6)}
函式
Python中的函式的定義方式跟Perl和R都大同小異
def func(x): xxxxx
用Python中也是用return語句來提前或者選擇性的返回表示式
對於函式可以設定引數以及預設引數
def func(x, y = "aaa"): print(x) print(y) return
Python自定義函式中可以用*
來收集多餘引數,並將引數放到元組中;而如果要收集預設引數,則用**
來收集,此時是將預設引數和其對應的值放到字典中(在Perl中一般是把引數放到陣列中,然後將其引用作為引數放到函式中,而R則跟Python比較類似,也有預設引數)
對於上述的說的Perl匯入引數的方法,其實Python也有類似操作,就是用*
來分配引數
def func(x, y): return x + y func(*(1,2))
Python 中只有模組(module),類(class)以及函式(def、lambda)才會引入新的作用域,其它的程式碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變數,外部也可以訪問
這點跟Perl不太一樣,Perl在if/for/while等裡面宣告的變數都是區域性變數;對於R來說,在for/while中新建變數也是區域性變數,但是if中的則還是全域性變數的(如果我沒記錯的話。。。),如:
if True: tmp = "1" print(tmp)
如果函式中的變數想要修改作用於以外的變數時,需要用到global
(如果是巢狀作用域以外的變數,則用nonlocal
)
num = 1 def func(): global num num = 123 print(num) func()
參考網站:
ofollow,noindex" target="_blank">Python 3 教程本文出自於http://www.bioinfo-scrounger.com 轉載請註明出處