目錄:
一、一些關於序列的常用BIF(共11個)
二、課時16課後習題及答案
********************************************
一、一些關於序列的常用BIF(共11個)
********************************************
把列表、元組和字串放在一起學習是有道理的,因為它們有很多共同點:
---都可以通過索引得到每一個元素
---預設索引值總是從0開始
---可以通過分片的方法得到一個範圍內的元素的集合
---有很多共同的操作符(重複操作符、拼接操作符、成員關係操作符)
我們把它們統稱為:序列!下面介紹一些關於序列的常用BIF(內建方法)
1、list([iterable])
list()方法用於把一個可迭代物件轉換為列表,科普下迭代:所謂迭代,是重複反饋過程的活動,其目的通常是為了接近併到達所需的目標或結果。每一次對過程的重複被稱為一次”迭代“,而每一次迭代會被用為下一次迭代的初始值....就目前來說,迭代還就是一個for迴圈,但今後會介紹到迭代器,那個功能,那叫一個驚豔!
這裡說的list()方法要麼不帶引數,要麼帶一個可迭代物件作為引數,而這個序列天生就是可迭代物件(迭代這個概念實際上就是從序列中泛化而來的)。舉幾個例子:
>>> #建立一個列表 >>> a = list() >>> a [] >>> #將字串的每個字元迭代存放到列表中 >>> b = list("FishC") >>> b ['F', 'i', 's', 'h', 'C'] >>> #將元組中的每個元素迭代存放到列表中 >>> c = list((1,1,2,3,5,8,13)) >>> c [1, 1, 2, 3, 5, 8, 13]
實現過程大概就是新建一個列表,然後迴圈通過索引迭代引數的每一個元素並加入列表,迭代完成後返回列表即可。
2、tuple([ iterable])
tuple()方法用於把一個可迭代的物件轉換為元組,具體的方法跟list()一樣。
3、str(obj)
str()方法用於把obj物件轉換為字串,這個方法在前面結合int()和float()方法給大家講過。
4、len(sub)
len()方法用於返回sub引數的長度:
>>> str1 = "I love zww" >>> len(str1) 10 >>> list1 = [1,1,2,3,5,8,13] >>> len(list1) 7 >>> tuple1 ="這","是","一","個","元組" >>> len(tuple1) 5
5、max(...)
max()方法用於返回序列或者引數集合中的最大值,也就是說,max()引數可以是一個序列,返回值是該序列中的最大值;也可以是多個引數,那麼max()將返回這些引數中最大的一個:
>>> list1 = [1,18,13,0,-98,34,54,76,32] >>> max(list1) 76 >>> str1 = "I love zww" >>> max(str1) 'z' >>> max(5,8,1,13,5,29,10,7) 29
6、min(...)
min方法跟max()用法一樣,但效果相反:返回序列或者引數集合的最小值。這裡需要注意的是,使用max()和min()方法都要保證序列或者引數的資料型別統一,否則會出錯。
>>> min(123,'oo',456,'xx') Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> min(123,'oo',456,'xx') TypeError: '<' not supported between instances of 'str' and 'int' >>> list1 = [1,18,13,0,-98,34,54,76,32] >>> list1.append("x") >>> max(list1) Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> max(list1) TypeError: '>' not supported between instances of 'str' and 'int'
人家說:外行看熱鬧,內行看門道。分析下這個錯誤資訊。Python這裡說”'>' not supported between instances of 'str' and 'int'“意思就是不能拿字串和整型進行比較。
你看,str()>int()說明max()和min()方法的內部實現事實上類似於之前提到的,通過索引得到每一個元素,然後將各個元素進行對比。所以不妨根據猜想寫出可能的程式碼:
#猜想下max(tuple1)的實現方式 temp = tuple[0] for each in tuple1: if each > temp: temp = each return temp
由此可見,Python的內建方法也沒啥了不起的。
7、sum(iterable[,start])
sum()方法用於返回序列iterable的總和,用法跟max()和min()方法一樣。但sum()方法有一個可選引數(start),如果設定該引數,表示從該值開始加起,預設值是0:
>>> tuple1 = 1,2,3,4,5 >>> sum(tuple1) 15 >>> sum(tuple1,10) 25
8、sorted(iterable,key=None,reverse=False)
sorted()方法用於返回一個排序的列表,大家還記得列表的內建方法sort()嗎?它們的實現效果是一樣的,但列表的內建方法sort()是實現列表原地排序;而sorted()是返回一個排序後的新列表。
>>> list1 = [1,18,13,0,-98,34,54,76,32] >>> list2 = list1[:] >>> list1.sort() >>> list1 [-98, 0, 1, 13, 18, 32, 34, 54, 76] >>> sorted(list2) [-98, 0, 1, 13, 18, 32, 34, 54, 76] >>> list2 [1, 18, 13, 0, -98, 34, 54, 76, 32]
9、reversed(sequence)
reversed()方法用於返回逆向迭代序列的值。同樣的道理,實現效果跟列表的內建方法reserse()一致。區別是列表的內建方法是原地翻轉,而reversed()是返回一個翻轉後的迭代物件。你沒看錯,它不是返回一個列表,是返回一個迭代物件:
>>> list1 = [1,18,13,0,-98,34,54,76,32] >>> reversed(list1) <list_reverseiterator object at 0x000001DAF03F15C0> >>> for each in reversed(list1): print(each,end=',') 32,76,54,34,-98,0,13,18,1,
10、enumerate(iterable)
enumerate()方法生成由二元組(二元組就是元素數量為二的元組)構成的一個迭代物件,每個二元組是由可迭代引數的索引號及其對應元素組成的。舉個例子:
>>> str1 = "FishC" >>> for each in enumerate(str1): print(each) (0, 'F') (1, 'i') (2, 's') (3, 'h') (4, 'C')
11、zip(,iter2[...])
zip()方法用於返回由各個可迭代物件引數共同組成的元組,舉個例子:
>>> list1 = [1,3,5,7,9] >>> str1 = "FishC" >>> for each in zip(list1,str1): print(each) (1, 'F') (3, 'i') (5, 's') (7, 'h') (9, 'C') >>> tuple1 = (2,4,6,8,10) >>> for each in zip(list1,str1,tuple1): print(each) (1, 'F', 2) (3, 'i', 4) (5, 's', 6) (7, 'h', 8) (9, 'C', 10)
*******************************
二、課時16課後習題及答案
********************************
測試題:
0. 我們根據列表、元祖和字串的共同特點,把它們三統稱為什麼?
1. 請問分別使用什麼BIF,可以把一個可迭代物件轉換為列表、元祖和字串?
2. 你還能複述出“迭代”的概念嗎?
3. 你認為呼叫 max('I love FishC.com') 會返回什麼值?為什麼?
4. 哎呀呀,現在的小屁孩太調皮了,鄰居家的孩子淘氣,把小甲魚剛寫好的程式碼畫了個圖案,麻煩各位魚油恢復下啊,另外這傢伙畫的是神馬嗎?怎麼那麼眼熟啊!??
動動手:
0. 猜想一下 min() 這個BIF的實現過程
1. 視訊中我們說 sum() 這個BIF有個缺陷,就是如果引數裡有字串型別的話就會報錯,請寫出一個新的實現過程,自動“無視”引數裡的字串並返回正確的計算結果
答案:
0. 我們根據列表、元祖和字串的共同特點,把它們三統稱為什麼?
序列,因為他們有以下共同點:
1)都可以通過索引得到每一個元素 2)預設索引值總是從0開始(當然靈活的Python還支援負數索引) 3)可以通過分片的方法得到一個範圍內的元素的集合 4)有很多共同的操作符(重複操作符、拼接操作符、成員關係操作符)
1. 請問分別使用什麼BIF,可以把一個可迭代物件轉換為列表、元祖和字串?
list([iterable]) 把可迭代物件轉換為列表
tuple([iterable]) 把可迭代物件轉換為元祖
str(obj) 把物件轉換為字串
所謂迭代,是重複反饋過程的活動,其目的通常是為了接近併到達所需的目標或結果。每一次對過程的重複被稱為一次“迭代”,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。
>>> temp = 'I love FishC.com!' >>> list(temp) ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'F', 'i', 's', 'h', 'C', '.', 'c', 'o', 'm', '!']
會返回:'v',因為字串在計算機中是以ASCII碼的形式儲存(ASCII對照表:http://bbs.fishc.com/thread-41199-1-1.html),引數中ASCII碼值最大的是'v'對應的118。
name = input('請輸入待查詢的使用者名稱:') score = [['迷途', 85], ['黑夜', 80], ['小布丁', 65], ['福祿娃娃', 95], ['怡靜', 90]] IsFind = False for each in score: if name in each: print(name + '的得分是:', each[1]) IsFind = True break if IsFind == False: print('查詢的資料不存在!')
0. 猜想一下 min() 這個BIF的實現過程
def min(x): least = x[0] for each in x: if each < least: least = each return least print(min('123456789'))
1. 視訊中我們說 sum() 這個BIF有個缺陷,就是如果引數裡有字串型別的話就會報錯,請寫出一個新的實現過程,自動“無視”引數裡的字串並返回正確的計算結果
def sum(x): result = 0 for each in x: if (type(each) == int) or (type(each) == float): result += each else: continue return result print(sum([1, 2.1, 2.3, 'a', '1', True]))