仿照内建函数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. Redis 介绍学习

    1.Redis 简介 Redis 是一个支持数据结构更多的键值对数据库.它的值不仅可以是字符串等基本数据 类型,也可以是类对象,更可以是 Set.List.计数器等高级的数据结构. Memcached ...

  2. CyclicBarrier 是如何做到等待多线程到达一起执行的?

    我们有些场景,是需要使用 多线各一起执行某些操作的,比如进行并发测试,比如进行多线程数据汇总. 自然,我们可以使用 CountDownLatch, CyclicBarrier, 以及多个 Thread ...

  3. Mac安装Command Line Tools

    从App Store上下载的Xcode,默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序. 在终端中输入命 ...

  4. selenium3与Python3实战 web自动化测试框架 ☝☝☝

    selenium3与Python3实战 web自动化测试框架 selenium3与Python3实战 web自动化测试框架 学习 教程 一.环境搭建 1.selenium环境搭建 Client: py ...

  5. 程序员需要了解的硬核知识之CPU

    大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和CPU打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CP ...

  6. 权限维持-wmi事件

    0x01 前言 WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持. 在2015年的b ...

  7. PHP array_fill_keys

    1.函数的作用:将一个数组的元素分别作为键值和一个指定的值组成新的数组: 2.函数的参数: @params array  $array @params mixed $values 3.例子: < ...

  8. 前端模块化(CommonJs,AMD和CMD)

    前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境 AMD 是 RequireJS 在推广过程中对模块定义的规范化产出. CMD 是 S ...

  9. HDU 5616 Jam's balance(01背包)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...

  10. RIDE-工程、测试套件、测试用例三者关系

    理论 type的选择: 一般来说:测试项目(directory)-测试套件(file)-测试用例 本质上,“测试项目”和“测试套件”并没有什么区别,但是testcase只能放在file类型的test ...