仿照內建函數sorted,自行實現一個sort函數,能夠為列表進行排序
看下面實例的前提是掌握 0、掌握sorted函數的用法、1、函數基本概念、2、函數是如何傳參的、3、掌握三元表達式、4、掌握內建函數enumerate的用法、5、掌握else子句是怎么執行的,6、insert函數的使用方法、7、函數的doc文檔 可以參考本人相關博客文章
思路
- 內建函數sorted函數,返回一個新的列表,可以設置升序或降序
- 可以遍歷傳入列表,新建一個列表,通過新列表中的當前值比較,用插入排序的方式把數插入到新列表
這是sorted的官方文檔介紹:,我們可以按照這個參數形式進行定義我們自己的函數
第一步:先寫一個函數,能夠傳入一個列表,並且對列表中的元素進行排序
def sort(iterable):
""" 這個函數可接收一個可迭代對象(這里用列表),然后把這個列表按照大小排序 """
new_list = [] # 新建一個列表,存放排序后的元素,這樣就不會修改傳入的列表了
for x in iterable: # 遍歷傳入的列表
for i,v in enumerate(new_list): # 遍歷獲取new_list中的索引和元素
if x > v: # 依次用x和new_list中的所有元素進行比較
new_list.insert(i, x) # 當發現x大於v的時候把x插入到v的前面
break # 只要插入了就把x這個數字處理好了break就不會執行else了
else: # 這樣設置的目的是,第一次遍歷new_lists時,new_list是空列表
new_list.append(x) # 把第一個x加入到空的new_list中,只執行一次
return new_list # 排序后返回新生成的有序的列表new_list
進行傳參測試:
sort([3, 2, 6, 4, 1, 8, 5, 9, 7]) # 傳入一個列表
# out: [9, 8, 7, 6, 5, 4, 3, 2, 1]
第二步,根據第一步的基礎之上增加按照類型比較大小和決定升序降序
def sort(iterable, *, key=None, reverse=False):
''' 仿照上面的參數進行定義函數,這里的iterable就是用來接收傳入的列表,key則是用來接收數據類型,就是每個元素按照什么類型進行排序,reverse就是用來決定排序是按照升序排還是降序排 '''
new_list = [] # 新建一個列表,存放排序后的元素,這樣就不會修改傳入的列表了
for x in iterable: # 遍歷傳入的列表
x = key(x) if key else x # 通過三元表達式來決定x的數據類型
for i,v in enumerate(new_list): # 獲取new_list中的索引和元素
v = key(v) if key else v # 同樣,如果傳入了key就處理為key類型
com = x > v if reverse else x < v # 根據傳入的reverse來決定升降
if com:
new_list.insert(i, x) # 這里插入的x還是沒有改變類型的x
break # 只要break就不會執行else了
else: # 這樣設置的目的是,第一次遍歷new_lists時,new_list是空列表
new_list.append(x)
return new_list # 排序后返回新生成的有序的列表new_list
進行傳參測試:
sort([3, 2, 6, 4, 1, 8, 5, 9, 7], key=int,reverse=True)#按照整數類型,降序排序
# out: [9, 8, 7, 6, 5, 4, 3, 2, 1] 排序完成
總結
我們嘗試着自己去實現一個python已經給過的內建函數,看上去好像是沒什么用,因為內建函數都可以直接拿來使用,但是在實現的過程中我們從構想,到思考如何入手,再到每一步的實施,這都使用了我們學過的各種知識以及細節,這就像解數學證明題一樣,看似編出來了一段絕不會拿到生產線上的代碼,但是實質上我們在有意無意的鍛煉我們對待代碼的態度以及各種手法,以后是否加班可能就是由我們的基本功來決定了,不能手高眼低,腳踏實地,勿忘初心!