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

python——自行实现sorted函数的更多相关文章

  1. Python中的sorted函数以及operator.itemgetter函数 【转载】

    operator.itemgetter函数operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [1,2 ...

  2. Python中的sorted函数以及operator.itemgetter函数

    operator.itemgetter函数operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [1,2 ...

  3. Python自学笔记-sorted()函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 排序算法 排序 ...

  4. Python中的sorted函数

    今天在做一个中文文本分类的项目,遇到了一个sorted函数,发现并不会用... 记录一下: sorted(list, key, reverse) list是给定的列表: key是排序过程调用的函数,也 ...

  5. python sort和sorted函数

    sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 ...

  6. python 中的高级函数sorted()

    Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted() ...

  7. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  8. python几个排序函数 sort sorted argsort

    Python中排序常用到的sort .sorted和argsort函数 [摘要:Python中sort 战 sorted函数 一 .先容 sort函数是list列表中的函数,而 sorted能够对li ...

  9. python 使用内置函数sorted对各种数据类型进行排序

    python有两个内置的函数用于实现排序,一个是list.sort()函数,一个是sorted()函数. 区别1:list.sort()函数只能处理list类型数据的排序:sorted()则可以处理多 ...

随机推荐

  1. 安装Elasticsearch可视化插件

    背景 项目中使用Elasticsearch , 最开始14年使用的时候需要es自己安装插件才能通过web页面查看数据情况,目前新版本的ES安装插件很费劲,通过搜索发现目前谷歌浏览器就有这个插件,这里简 ...

  2. 运维自动化神器ansible之user模块

    运维自动化神器ansible之user模块 一.概述   user模块 可管理远程主机上的 用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 二.参数介绍   name: 用于指定操作 ...

  3. 【元学习】Meta Learning 介绍

    目录 元学习(Meta-learning) 元学习被用在了哪些地方? Few-Shot Learning(小样本学习) 最近的元学习方法如何工作 Model-Agnostic Meta-Learnin ...

  4. 《深入理解Java虚拟机》-----第12章 Java内存模型与线程

    概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...

  5. ASP.NET Core API ——Dapper的使用

    ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l  创建一个IDBConnection的接口对象 l  编 ...

  6. liunx定时备份mongo数据库并实现自动删除N天前备份

    1.脚本文件: #!/bin/sh # dump 命令执行路径,根据mongodb安装路径而定 #!/bin/sh # dump 命令执行路径,根据mongodb安装路径而定 /bin/mongodu ...

  7. SpringBoot中神奇的@Enable*注解?

    在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@EnableAsync.@EnableScheduling等,今天我们就来分析 ...

  8. Hello World ! 节日快乐!

    节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...

  9. C#窗体练习:带历史信息的菜单

    在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用.单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸.下次运行该软件时,上次打开的文件名记录到“文件”菜单的历史菜 ...

  10. 使用js json/xml互相转换

    <html> <head> <title>json与xml互转</title> <script type="text/javascrip ...