1. 程式人生 > 實用技巧 >斐波那契數列的兩種解法:1.遞迴2.字典

斐波那契數列的兩種解法:1.遞迴2.字典

此文轉載自:https://blog.csdn.net/hihell/article/details/109999211

滾雪球學 Python,目標就是讓 Python 學起來之後,越滾越大。

已完成的文章

標題連結
1. 這才是 Python 學習的正確起手姿勢,滾雪球學 Pythonhttps://dream.blog.csdn.net/article/details/109586142
2. 無門檻學會資料型別與輸入、輸出函式,滾雪球學 Pythonhttps://dream.blog.csdn.net/article/details/109697047
3. 無轉折不程式設計,滾雪球學 Pythonhttps://dream.blog.csdn.net/article/details/109785235

滾雪球學 Python 目錄

本系列文章將在2021年春節前完成,歡迎關注,點贊,評論 --- 夢想橡皮擦

四、列表一學完,Python 會一半

4.1 列表是個啥

列表,先記住英文為 list ,它是 Python 中一種可以動態新增刪除內容的資料型別,由一系列的元素組成。直白點說列表是將多個變數組合在一起的那麼一個容器。

很多文章會找一個與列表相似的程式設計概念,一般會說 Python 中的列表跟其他語言的陣列

一樣,但對於沒有任何程式設計概念的同學來說,陣列也是一個陌生概念。其實你可以簡單理解一下即可,Python 中的列表就是一個容器,裡面可以放任意資料型別的變數。

4.1.1 列表定義

列表定義的格式如下

my_list = [元素1,元素2,元素3...]

列表的每一個數據都稱作元素或者項,列表用 [] 包裹,每一個元素用英文 , 分隔,列表可以直接列印輸出。

my_list = ["apple", "orange", "grape", "pear"]
print(my_list)

列表中的元素可以為相同資料型別,也可為不同資料型別,所以列表巢狀列表也是可行的。

my_list = [1, "orange", True, 1.0, [1, 2, 3]]
print(my_list)

4.1.2 列表讀取

列表的讀取需要先學習兩個名詞,一個是索引,另一個是下標,這兩個詞是同一個意思,都是為了準確的獲取列表中的元素。索引先簡單理解成序號一類的概念即可。

首先你要學會的是列表中索引是從 0 開始的,這個概念第一次接觸有點楞,熟悉了就會好很多。就像我們數數字都是從 1 開始數,忽然間需要變成從 0 開始數了,需要適應期。

例如在看一下剛才的列表,嘗試用中文讀取出來每一個元素的索引。

my_list = ["apple", "orange", "grape", "pear"]

索引為 0 的元素是字串 apple,索引為 1 的元素是字串 orange,依次類推。

列表讀取的語法格式如下:

# 列表名[索引]
my_list[i]

以上內容轉換成 Python 程式碼為:

my_list = ["apple", "orange", "grape", "pear"]
print("索引為0的元素是:", my_list[0])
print("索引為1的元素是:", my_list[1])
print("索引為2的元素是:", my_list[2])
print("索引為3的元素是:", my_list[3])

通過索引獲取元素的時候,一定要注意索引是從 0 開始的,從 0 開始的,雖然反覆寫,但是還是很容易被忘記… 唉~

索引除了為正數以外,還可以為負數,獲取列表的最後一個元素的索引是 -1,程式碼如下:

nums = [1,2,3,4,5,6]
print("列表最後一個元素為:",nums[-1])

依據順序,-1 表示最後一個元素,-2 表示倒數第 2 項…

4.1.3 列表切片

編寫程式時對列表的操作經常會有如下場景。

  • 獲取 1~3 項元素;
  • 獲取 4~7 項元素;
  • 獲取第 1,3,5…項元素。

這些內容轉換到列表的實際編碼中,被稱為切片操作,就是你腦中現在呈現的切肉片動作。
具體的語法格式如下:

# 讀取從索引 m 到 n-1 的列表元素
my_list[m:n]
# 讀取列表的前 n 項元素
my_list[:n]
# 讀取列表從 m 開始到結尾的元素
my_list[m:]
# 間隔 s,讀取從 m 到 n 的列表元素
my_list[m:n:s]

以上內容反映到程式碼中呈現如下,該部分呈現到程式碼中如下,尤其注意 m 與 n 的取值。

my_list = ["a","b","c","d","e","f"]

# 輸出 ['a', 'b', 'c'] 注意 a,b,c 的索引分別是 0,1,2
print(my_list[0:3])
# 輸出 ['b', 'c', 'd', 'e'] 注意 b,c,d,e 的下標分別是 1,2,3,4
print(my_list[1:5])
# 輸出 ['b', 'c', 'd', 'e', 'f']
print(my_list[1:])
# 輸出 ['a', 'b', 'c', 'd', 'e']
print(my_list[:5])
# 輸出 ['b', 'd']  從索引 1 到索引 3,間隔 1 個索引取
print(my_list[1:4:2])

列表切片在後續的 Python 學習中屬於非常重要的知識點,核心還是理清楚索引是如何對應到列表中每一項元素。

4.1.4 列表相關內建函式

在 Python 中與列表相關的內建函式常見的有 4 個,分別是獲取最大值 max、最小值 min、求和 sum 以及獲取列表元素個數 len。

最大值與最小值

使用 max 與 min 函式可以直接獲取列表中的最大值與最小值,該函式使用有些注意事項需要了解下,具體還是參照程式碼:

my_list1 = ["a","b","c","d","e","f"]
my_list2 = [1,2,3,4,5,6]
my_list3 = ["a",1,2,3,4]

# 輸出 f
print(max(my_list1))
# 輸出 6
print(max(my_list2))
# 報錯
print(max(my_list3))

上述程式碼在執行時發現,前面 2 個列表可以輸出最大值,但是第三個直接報錯,這是因為 max 與 min 只能用於元素全是數字或者全是字串的列表,如果列表中有其他資料型別或者數字與字串混合就會報錯。

min 用法和 max 完全一致,不在編寫程式碼嘗試。

求和
sum 函式可以獲取列表元素總和,但是需要注意下 sum 不能用於元素非數值情況,也就說下面的程式碼是錯誤的。

my_list1 = ["a","b","c","d","e","f"]
print(sum(my_list1))

獲取列表元素個數
該函式使用頻次極高,在很多地方都需要獲取列表元素個數,使用 len 函式即可,由於程式碼非常簡單,自行測試即可。

4.1.5 列表元素的修改與刪除

對於一個列表資料型別的變數來說,它是可以進行修改與刪除元素的,這就是本文開篇提及的列表是 Python 中一種可以動態新增刪除內容的資料型別(該小節暫時還無法對列表進行動態新增,後文會講解到)。
列表的元素可以通過索引進行獲取修改。

my_list1 = ["a","b","c","d","e","f"]
print("修改前的列表",my_list1)
my_list1[4] = "橡皮擦"
print("修改後的列表",my_list1)

列表元素的刪除操作分為兩種情況,簡單說一種是刪除單個元素,一種是刪除多個元素。刪除與列表切片關聯度極高,可比對下述程式碼進行學習。

my_list1 = ["a","b","c","d","e","f"]

# 通過索引刪除某一元素
del my_list1[0]
print(my_list1)

my_list1 = ["a","b","c","d","e","f"]
# 通過索引刪除列表區間元素
del my_list1[0:3]
print(my_list1)

my_list1 = ["a","b","c","d","e","f"]
# 通過索引刪除列表區間元素
del my_list1[0:3:2]
print(my_list1)

刪除操作使用的關鍵字是 del,關鍵點相信你也已經發現,通過索引找到元素然後在通過del刪除元素。

以上內容,請注意是對列表中的元素進行操作,下面我們將學習如何對一個完整的列表進行操作。

4.1.6 列表相加,相乘,刪除

在 Python 中可以直接對列表進行相加與相乘操作,列表與列表之間的相加可以理解為列表的連線,程式碼如下:

my_list1 = ["a","b"]
my_list2 = ["c"]
my_list3 = my_list1 + my_list2
print(my_list3)

任意多個列表直接如果用 “+” 進行操作,那麼這些列表將會連線起來形成一個新的大列表。

列表可以與一個數字進行乘法計算,表示重複前面的列表多次,例如下述程式碼:

my_list1 = ["a","b"]
my_list2 = ["c"]
my_list3 = my_list1 * 4
# 輸出結果為 ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
print(my_list3)

上述程式碼用 [a,b] * 4 得到結果為列表 [a,b] 重複出現了 4 次。

4.2 初識 Python 面向物件

Python 是一門面向物件的程式語言,所以在 Python 中所有的資料都是物件,例如之前學習到的整數、浮點數、字串、列表都是物件,關於面向物件的概念不做過多的解釋(畢竟現在解釋也沒啥用,具體等學到面向物件部分在進行說明)。

我們可以給各種物件設計一些 方法,這些 方法 也是廣義上的 函式,是不是聽起來有些繞,在 Python 中已經為一些基本物件內建了一些方法,從列表開始我們將逐步接觸物件的內建方法。

物件方法的呼叫語法格式為:

物件.方法()

4.2.1 字串物件的方法

你首先要知道在 Python 中任意一個數據都是物件,那宣告一個字串變數之後,那這個字串變數就是一個物件,是物件就會有物件的方法。字串常用的方法有:

  1. lower 將字串轉換成小寫
  2. upper 將字串轉換成大寫
  3. title 將字串首字母大寫,其餘小寫
  4. rstrip 移除字串右側空白
  5. lstrip 移除字串左側空白
  6. strip 移除字串兩側空白

字串大小寫說明

my_str = "good moring"
my_strU = my_str.upper()
my_strL = my_str.lower()
my_strT = my_str.title()

# 大寫
print(my_strU)
# 小寫
print(my_strL)
# 首字母大寫
print(my_strT)

輸出結果對應如下:

GOOD MORING
good moring
Good Moring

移除字串開始或者結尾的空白是非常有用的方法,該內容留給你自己來完成。程式碼可以參考 my_str.strip()

4.2.1 快速獲取系統內建方法

在實際開發中,我們很難記住一個物件的所有方法,對於橡皮擦來說編寫程式碼的時候也要藉助於手冊,方法太多不可能記住的,常用的記住就好了,那如何查詢一個物件的所有方法呢,用到的是一個內建函式 dir
例如,你想知道一個字串物件的所有方法,可以編寫如下程式碼。

my_str = "good moring"
print(dir(my_str))

程式碼執行之後,會得到如下內容,其中紅框內容就是剛才提及到的方法。

對於某個方法是如何使用的,可以呼叫之前學習的 help 內建函式進行學習,語法格式如下:

help(物件.方法)

例如獲取字串物件的 rfind 方法。

my_str = "good moring"

print(help(my_str.rfind))

結果如下,稍微閱讀一下即可瞭解 rfind 方法的使用方式。


檢視一下列表的方法
因為後續將繼續學習列表的方法,所以先進行簡單展示。

my_list1 = ["a","b"]
print(dir(my_list1))

本篇部落格後續內容將對紅框部分的方法進行講解,肯定有人會關心沒有在紅框裡面的哪些以兩個_開頭的是啥,它們也是方法,不過現在還不到學習它們的時候。

4.3 通過方法增刪列表元素

4.3.1 列表追加元素

在操作列表時候經常會出現如下場景,需要往已經存在的列表中追加元素,例如原列表有一個元素,現在想追加到兩個。如果直接設定,會出錯提示索引值超過列表長度,請注意該錯誤在操作列表時經常出現。

my_list = ["apple", "orange", "grape"]
my_list[3] = "pear"

該錯誤提示為 IndexError: list assignment index out of range ,這裡需要注意下,在學習或編寫程式碼的過程中要熟悉一些常見的錯誤,以便當這些錯誤出現的時候能夠快速發現原因。

在列表追加元素,Python 中列表物件內建了一個方法,具體格式如下。

my_list.append("新增元素")

例如接下來可以宣告一個空列表,然後往該列表追加元素。

my_list = []
my_list.append("pear")
my_list.append("apple")
my_list.append("orange")

print(my_list)

通過 append 方法,每次都會在列表的末端追加一個元素,用該方法就可以無限制的將列表擴充套件下去。

4.3.2 列表插入元素

append 方法是在列表末尾固定插入元素,如何在任意位置插入元素是一個新的方法,名稱叫做 insert,語法格式如下:

my_list.insert(索引位置,"新增元素")

嘗試在索引 1,索引 2,索引 0 的位置插入元素,程式碼如下:

my_list = ["pear", "apple", "orange"]
my_list.insert(0, "插入")
print(my_list)
my_list = ["pear", "apple", "orange"]
my_list.insert(2, "插入")
print(my_list)

這裡需要注意下當索引超過列表長度時,預設插入末尾。

4.3.3 刪除列表元素

之前的內容中已經介紹過一種刪除列表元素的方式,通過關鍵字 del,該方式存在一個問題就是刪除元素之後沒有獲取到被刪除的元素。接下來的方法將解決該問題,你將能獲取到被刪除的值,該方法是 pop ,語法格式如下:

item = my_list.pop()
item = my_list.pop(索引)

注意在 pop 方法中可以攜帶一個索引值,直接刪除索引位置的元素,如果沒有預設刪除最後一項。變數 item 用於獲取被刪除的值。注意該方法刪除元素的時候,索引不能超過列表長度。

my_list = ["pear", "apple", "orange"]
item = my_list.pop()
print(item)

print("刪除元素之後")
print(my_list)

程式碼執行結果為:

orange
刪除元素之後
['pear', 'apple']

pop 方法是按照索引刪除元素,你還可以直接刪除指定元素,具體方法是 remove,該方法的語法格式如下。

my_list.remove(待刪除元素內容)

注意 remove 刪除元素之後,不會返回被刪除的元素,還存在一個問題是如果待刪除的元素不在列表中,會提示程式碼錯誤。

如果待刪除的元素在列表中出現多個,預設只刪除第一個,如果想要刪除多個,需要用到後面的迴圈知識。

4.4 列表排序

對於列表除了增刪改以外還會涉及排序相關內容,該操作對於列表物件也非常簡單,使用固定的方法即可。

4.4.1 sort 排序

sort 方法可以對列表元素進行排序,預設從小到大,當然也可以修改成從大到小,該方法一般用於純數字或者純英文字元列表排序,如果列表中的元素資料型別比較複雜,該方式不在適用,需要注意一下。

sort 方法的語法格式如下:

my_list.sort()

宣告一個所有元素都是數字的列表,然後進行排序。

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

my_list.sort()
print("排序後:", my_list)

輸出結果如下:

排序前: [3, 4, 1, 2, 9, 8, 7]
排序後: [1, 2, 3, 4, 7, 8, 9]

如果希望按照從大到下進行排序,只需要增加引數(引數概念後面還會繼續學習)reverse=True 即可。

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

my_list.sort(reverse=True)
print("排序後:", my_list)

英文字串的排序結果希望你可以進行一下測試,需要注意對英文字元列表進行排序,建議將字串英文全部修改為小寫。

注意上述 sort 方法排序之後是對原列表中元素順序修改,即修改的是 my_list 列表的順序,如果不想修改原列表的順序,想要新生成一個列表,需要用到的是下述方法。

4.4.2 sorted 排序

sort 排序將造成列表元素順序永久修改,很多時候並不需要修改原列表,這種情況下需要藉助 sorted 函式,注意 sorted 是一個內建函式,並不是列表物件的一個方法,也就是說 sorted 可以用於很多物件的排序。

sorted 函式的語法格式如下:

sorted(待排序列表) # 正序,從小到大
sorted(待排序列表,reverse=True) # 逆序,從大到小

該函式使用之後會返回一個新的列表,你可以用新變數接收一下,具體程式碼如下:

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

new_list = sorted(my_list)
print("排序後:", my_list)
print("排序後:", new_list)

注意排序後新變數為 new_list 對於原 my_list 列表中元素的順序並無影響。

4.5 列表其它方法

4.5.1 列表檢索元素索引

通過 index 方法可以獲取某內容在列表中第一次出現的索引值,格式如下:

索引值 = my_list.index(待查詢值)

該方法注意如果沒有檢索到索引值,會提示錯誤。

my_list = [3, 4, 1, 2, 9, 8, 7]
ke = my_list.index(4)
ke = my_list.index(10)
print(ke)

4.5.2 列表統計元素出現次數

通過 count 方法可以獲取列表特定元素出現的次數,它的語法格式如下:

次數 = my_list.count(待查詢值)

該方法同樣當在列表中找不到待查詢值時會返回 0。

my_list = [3, 4, 3, 2, 3, 8, 7]
nums = my_list.count(3)

print(nums)

4.5.3 列表轉換為字串

通過 join 方法可以將列表中的所有元素組合成一個字串,語法格式如下:

連線字串.join(待轉換列表)

該方法其實準確的說應該是 字串物件的一個方法。

my_list = ["pear", "apple", "orange"]
my_str = "#".join(my_list)

print(my_str)

該方法在使用的時候需要注意,列表中所有元素都必須是字串,否則會出現 expected str instance, int found 錯誤。

4.5.4 列表追加列表

append 方法可以給列表追加元素,extend 可以給一個列表追加一個列表,相當於將兩個列表進行連線。

列表1.extend(列表2)

注意追加的列表預設在原列表末尾追加,所以追加之後原列表中的元素已經發生了改變。

my_list1 = [1, 2, 3]
my_list2 = [4, 5, 6]

my_list1.extend(my_list2)
print(my_list1)

4.6 多維列表

列表中的元素可以為任意資料型別,故列表巢狀列表也是可以的。

my_list = [1,2,3,[4,5,6]]

該方法需要注意獲取巢狀列表中的元素的時候,需要按照層級獲取,例如希望獲取元素 5,首先要獲取最外層列表中的第 4 項元素,即 my_list[3],然後獲取到它之後再獲取它索引位置為 1 的元素,即 my_list[3][1],具體程式碼可以自行嘗試,也可以在內層列表中在巢狀列表,無限迴圈下去。

4.7 特殊的列表字串

現在回過頭來再看一下字串格式為 "abcsdasa",可以將字串看成一個字元組成的列表,一般也稱作字元序列(有順序的列表),字串也不能完全等價於列表,因為字串中不能修改單個元素。

4.7.1 字串索引與切片

字串也可以通過索引訪問某個元素,索引使用方式與列表一致,例如下述程式碼:

my_str = "abcdefghi"
print(my_str[5])
print(my_str[4])
print(my_str[3])

列表切片也可用於字串,相當於獲取字串子串。

4.7.2 可用於字串的部分函式和方法

列表相關的內建方法,例如 len、max、min 也可用於字串,具體內容你可自行嘗試。

4.7.3 將字串轉換成列表

通過內建函式 list 可以將字串轉換成列表,也就是將字串中每個字元都拆解開。

my_str = "abcdefghi"
print(list(my_str))

輸出內容為:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

4.8 這篇部落格的總結

列表在 Python 基礎部分屬於非常重要的資料型別,在寫這篇部落格的時候也在考慮是否將所有內容都包含進去,結果發現內容太多了,很多都與後面產生的極強的關聯性,在本篇部落格中也初步瞭解了面向物件的一些最簡單概念。

本篇部落格省略的部分,後續將補充完整,具體內容先埋個坑。

  • 深複製與淺複製
  • 地址的概念
  • in、not in 表示式
  • is、is not 表示式
  • enumerate 物件

希望在講解這些內容的時候,還能看到堅持學習的你的留言。

最後一碗毒雞湯

只要我肯努力 就沒有搞不砸的事情 O(∩_∩)O 哈哈~