對於list和tuple來說,可能有事需要獲得他們的子串,而j**a等都提供了類似substring()
的方法來獲取子串,而對於python來說則有一種方法叫 切片
例如:
l = ['michel','sarah','bob','tom']
想要獲取l的前2個元素怎麼辦?
當然也可以使用for
迴圈,但是這樣太麻煩了。
>>>l[0:3]
['michel','sarah','bob']
這樣既可獲得前2個元素,l[0:3]
表示從下標0
開始(包括0
),3
結束(不包括3
)。
如果是從0
開始的話,0
可以省略,即l[:3]
因為下標-1
可以訪問最後乙個元素,所以負數的下標也是可以的。
但是必須是第乙個下標小於第二個下標,(包括第乙個下標,不包括第二個下標)並且為正序輸出的
>>>l[-3
:-1]
['michel','sarah']
l[-3:-1]
表示取l
中的倒數第三個(包括)到倒數第乙個(不包括)
就是遍歷list或者tuple,在j**a中多是for
來完成的
在python中,使用for...in
,它可以用在list,tuple,dict等上,例如在dict上:
>>>dic =
>>.for key in dic
··· print(key)
···x
yz
dict預設迭代的是key,如果迭代value,for value in dic.values()
,都遍歷使用for key,value in d.items()
注意:dict內的順序不一定,遍歷多次的結果可能不一致
如何檢查乙個物件是不是可迭代物件呢?
通過collections模組的iterable型別
>>>from collections import iterable
>>>isinstance('abc',interable)
true
用來快速生成list,例如要生成1*1,2*2,3*3,4*4,5*5,6*6
,我們怎麼做?可以使用迴圈,但是過於麻煩
還可以使用
>>> l = [x * x for x in range(1,7) ]
>>> l
[1, 4, 9, 16, 25, 36]
for
迴圈之後還可以加上if
表示式,來篩選某些數
>>> l = [x * x for x in range(1,7) if x % 2 == 0]
>>> l
[4, 16, 36]
還可以使用兩層迴圈來生成全排列
>>> l = [m + n for m in
'xyz'
for n in
'abc']
>>> l
['xa', 'xb', 'xc', 'ya', 'yb', 'yc', 'za', 'zb', 'zc']
也可以利用一些方法來改變大小寫
>>> l = ['abc','def','ghi']
>>> [s.lower() for s in l]
['abc', 'def', 'ghi']
通過列表生成器我們可以生成乙個list,但是收到記憶體限制,列表的大小肯定會有限制。
python中有乙個機制能夠節省空間,條件是這個列表中的元素能夠能夠按照某種演算法推導出來,然後只在使用的過程中推斷出要使用的後序的元素,這被稱為generator
建立generator
的方法很多,第一種: 只需要把列表生成式中的改為
()
>>> l = [x * x for x in range(10)]
>>> l
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
at 0x000002253945daf0>
我們可以直接答應list
裡面的全部元素,但是我們要怎麼列印generator
裡的元素呢?
使用next()
來訪問下乙個元素,當到最後乙個元素之後沒有更多元素時,會答應stopiteration
錯誤
>>> next(g)
0>>> next(g)
1>>> next(g)
4>>> next(g)
9>>> next(g)
16>>> next(g)
25>>> next(g)
36>>> next(g)
49>>> next(g)
64>>> next(g)
81>>> next(g)
traceback (most recent call last):
file
"", line 1, in
stopiteration
當然一直呼叫next()
多餘麻煩,也可以使用for
迴圈
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...014
9162536
4964
81
在原教程中的斐波那契數列的例子中,
def
fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return
'done'
提到了乙個語句:a, b = b, a + b
這個語句的實際執行相當於:
t = (b, a + b) # t是乙個tuple
a = t[0] #即a = b
b = t[1] #b = a + b !但是此時的a並沒有賦值為b!!!!
關於以上的這個斐波那契數列函式,實際上也是乙個乙個乙個推算的函式,對於這個函式,其實也可以變成generator
的,只需要將print(b)
改為yield b
就可以。
如果乙個函式定義中包含yield
關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator
:
這裡問題就在於generator
函式的執行:在每次執行next()
的時候執行一次,遇到yield
就返回,下一次在上次返回的yield
的位置繼續執行,例如:
def
odd():
print('step 1')
yield
1 print('step 2')
yield(3)
print('step 3')
yield(5
在呼叫時要先生成乙個odd
函式,在呼叫next()
>>> o = odd()
>>> next(o)
step11
>>> next(o)
step
23
當然還可以用for
。
以直接作用於for迴圈的物件統稱為可迭代物件:iterable
。
可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator
。
python學習筆記 4 函式基礎
語法格式 def 函式名 函式封裝的 通過函式名 即可完成對函式的呼叫。注意,函式呼叫不能放在函式定義的前面。舉個栗子 定義函式 num1 num2,括號中的num1和num2為函式中定義的引數 defnum1 num2 num1,num2 result num1 num2 print result...
awk學習筆記 17 其他函式
awk的內建函式不多,除去數學和字串的都歸到其他類了。如下表 函式說明 close expression 用同乙個帶字串值的 expression 引數來關閉由 print 或 printf 語句開啟的或呼叫 getline 函式開啟的檔案或管道。如果檔案或管道成功關閉,則返回 0 其它情況下返回非...
python學習(4)函式
1.因為函式是物件,所以很多構造能輕易的表達出來。比如我們要對下面的string做一些資料清洗 還有一種做法 注意 這種操作很奇特,對於string的內奸函式需要使用str.訪問 乙個更加函式化的方式能夠讓你方便的在乙個高等級上轉變乙個string。可以把函式當做其他函式的引數,比如用內建的map函...