課時16:序列

那是個好男孩發表於2018-08-03

目錄:

    一、一些關於序列的常用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)  把物件轉換為字串

 

2. 你還能複述出“迭代”的概念嗎?
所謂迭代,是重複反饋過程的活動,其目的通常是為了接近併到達所需的目標或結果。每一次對過程的重複被稱為一次“迭代”,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。
>>> temp = 'I love FishC.com!'
>>> list(temp)
['I', ' ', 'l', 'o', 'v', 'e', ' ', 'F', 'i', 's', 'h', 'C', '.', 'c', 'o', 'm', '!']

 

3. 你認為呼叫 max('I love FishC.com') 會返回什麼值?為什麼?

會返回:'v',因為字串在計算機中是以ASCII碼的形式儲存(ASCII對照表:http://bbs.fishc.com/thread-41199-1-1.html),引數中ASCII碼值最大的是'v'對應的118。
 
4. 哎呀呀,現在的小屁孩太調皮了,鄰居家的孩子淘氣,把小甲魚剛寫好的程式碼畫了個圖案,麻煩各位魚油恢復下啊,另外這傢伙畫的是神馬嗎?怎麼那麼眼熟啊!??
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]))

 

相關文章