Python 函式其他 學習筆記4)

2022-09-09 02:09:14 字數 4324 閱讀 3407

對於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函...