python——自行实现sorted函数

仿照内建函数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已经给过的内建函数,看上去好像是没什么用,因为内建函数都可以直接拿来使用,但是在实现的过程中我们从构想,到思考如何入手,再到每一步的实施,这都使用了我们学过的各种知识以及细节,这就像解数学证明题一样,看似编出来了一段绝不会拿到生产线上的代码,但是实质上我们在有意无意的锻炼我们对待代码的态度以及各种手法,以后是否加班可能就是由我们的基本功来决定了,不能手高眼低,脚踏实地,勿忘初心!

posted @ 2019-08-20 11:46  段明  阅读(1399)  评论(0编辑  收藏  举报