Day 06 python学习笔记

news2025/1/13 14:23:01

常见排序算法

先简单讲解一下如何交换两个变量的值

  1. 创建临时变量
  2. 直接交换(a,b = b,a)
例:
临时变量:
c = a
a = b
b = c




#直接交换
a , b = b , a

冒泡排序

两两比较,找最大值换到最后,再找次大值,放次之

以下以找最大值为例子:

# 冒泡排序 大数上浮法、小数下沉法(每次找最小值往最前边排或每次找最大值往最后排)
arr = [30,8,-10,22,26,3,2,9,11]

def bubble_sort(arr):
    for i in range(0, len(arr)-1):  #为了控制比较操作的循环次数
        for j in range(0, len(arr)-1-i):  #选择操作的元素(索引下标)
            if arr[j] >= arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
            else:
                pass     #空语句,防止报错
    return arr
if __name__ == '__main__':   #python的main函数 防止被别的模块导入时执行
    a = bubble_sort(arr)
    print(a)


结果:
[-10, 2, 3, 8, 9, 11, 22, 26, 30]

图解:

选择排序

每次找最小值,以假设最小值进行位置互换。(循环后面全部找出最小值后换)
[30,8,-10,22,26,3,2,9,11]
第一次 假设30最小,在其他当中找最小值,即-10,进行位置互换
[-10,8,30,22,26,3,2,9,11]
第二次 假设8最小,在其他当中找最小值,即2,进行位置互换
[-10,2,30,22,26,3,8,9,11]

# 选择排序
# 类似于冒泡排序,每一次找到最小值
arr = [8,3,2,6,1,4,9,7]
def xuanze(arr):
    for i in range(0, len(arr)-1):  #控制循环的次数(即开始的起点)
        min = i    #假定第一个为最小值(创建个临时变量)
        for j in range(i+1, len(arr)):   #从开始起点循环到结束
            if arr[j] < arr[min]:    #如果小则交换,将下标交换
                min = j
        if i != min:   #循环结束,判断是否后面有小值,有则交换
            arr[i], arr[min] = arr[min], arr[i]
    return arr
if __name__ == '__main__':
    a = xuanze(arr)
    print(a)


结果:
[1, 2, 3, 4, 6, 7, 8, 9]

插入排序

默认第一个值为有序的,之后一次插入后面的每一个值(多次比较),最终得出排序结果。保证 前面的数都是有序

例:

[6,5,3,8,7,2,4]

第一次 假设第一位(6)有序(最小),将后一位(第二位)与第一位对比,若第二位小将其插入到第一位前作为第一位

[5,6,3,8,7,2,4]

第二次 假设前两位有序,将后一位(第三位)与第二位对比,若比第二位小,再与第一位对比,若比第一位大比第二位小则将其插入到第二位前作为第二位,反之若比第一位小则将其插入到第一位前作为第一位

[3,5,6,8,7,2,4]

第三次 假设前三位有序,将后一位(第四位)与第三位对比,,若比第三位大,则保持原位,默认前四位有序,若比第三位小,再与第二位和第一位(前面有序的全部)对比,若比第二位大比第三位小则将其插入到第三位前作为第三位,反之若比第一位大比第二位小则将其插入到第二位前作为第二位,若比第一位小则将其插入到第一位前作为第一位

[3,5,6,8,7,2,4]


#插入排序
num = [11,2,12,13,1,4]
def insert_sort(num):
    for i in range(0, len(num)-1):  #默认有序下标(i前包括i全部有序)
        for j in range(i+1, 0, -1):  #i+1 往前比较
            if num[j] < num[j-1]:
                num[j], num[j-1] = num[j-1], num[j]
    return num
insert_sort(num)   #函数调用
print(num)

计数排序

计数排序(Counting Sort)是一种不比较数据大小的排序算法,是一种牺牲空间换取时间的排序算法

计数排序适合数据量大且数据范围小的数据排序,如对人的年龄进行排序,对考试成绩进行排序等

找到待排序列表中的最大值 k,开辟一个长度为 k+1 的计数列表

例(元素不重复):

原容器:

arr  = [2,3,1,6,5,7]

创建新容器(7+1)

arr0 = [0, 0, 0, 0, 0, 0, 0, 0] 

下标    0  1  2  3  4  5  6  7

然后找与元素相同的下标值元素加1(两个就是2)

arr0 = [0, 1, 1, 1, 0, 1, 1, 1]

然后再将为1的导出

==>    [1,2,3,5,6,7]   即排序成功

#计数排序
def counting_sort(array): #如果只有一个数无需排序直接返回
    if len(array) < 2:
        return array
    max_num = max(array)
    count = [0] * (max_num + 1)  #创建一个新列表,记录下标索引
    for num in array:  #寻找是否有元素相同的下标值,有则加一,并统计每个值的数量
        count[num] += 1
    new_array = list()  #创建空列表导出
    for i in range(len(count)):  #循环次数(遍历列表全部)
        for j in range(count[i]):  #循环次数(相同元素的数量)
            new_array.append(i)  #将元素i加入new_array
    return new_array


if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 6]
    print(counting_sort(array))


结果:
[2, 2, 3, 3, 5, 5, 5, 6, 7, 7, 7, 9]

二分查找

二分查找(折半查找):在有序序列中高效的查找指定的元素

#二分查找
def binary_search(list,item):
    """二分查找方法"""
    left = 0 # 定义最小下标
    right = len(list)-1 # 定义最大下标
    while left <= right: #while循环,保证可以遍历到指定区域的元素,直到被被寻找的值和中间值相等
        mid = int((left + right)/2) # 寻找数组的中间值
        guess = list[mid] # 获取列表最中间的元素
        if guess == item:
            return mid # 进行条件判断,将中间值和被寻找的值进行比较,相等则返回该值
        if guess > item:
            right = mid-1 # 如果被寻找的值小于中间值,则最大下标变化为中间值的前一个元素下标
        else:
            left = mid + 1 # 如果被寻找的值大于中间值,则最小下标变化为中间值的后一个元素下标
    return None
nums = [1,33,44,66,77,567,5677]
print(binary_search(nums,567))

结果:
5      #返回索引下标

函数

组织好的,可以重复使用的,用于实现特定功能的代码块

len(name)内置函数 len 官方写好的 input print。。。。都是内置函数

避免重复的进行代码书写,提高代码的复用率

函数的定义语法

格式:
def 函数名(参数1,参数2......):
    函数体
    return 语句

#return:返回函数的返回值
#return后边的代码不会再执行了哦
#函数的返回值 将结果返回给调用者

练习:

1、定义一个函数,求其绝对值

def my_abs(x):
    if x < 0:
        return -x
    else:
        return x

a = my_abs(-3)
print(a)
a = my_abs(1)
print(a)


结果:
3
1

2、定义函数,调用后输出“我叫XXX”

def out():
    print("我叫XXX")

b = out()
print(b)

c = out()   #函数名可以赋值给变量
c()         #变量即为函数的别名,函数名+()是执行


结果:
我叫XXX    
None  #函数无返回值
我叫XXX   
#None类型:NoneType的字面量,函数不使用return,返回的是None:返回值没有意义
#None声明无意义的变量
#name=None
#在if判断中:None===False

函数的传参

函数的参数:函数进行计算时,接受外部(调用时)提供的数据

传入参数的类型检查

def my_abs(x):
    if not isinstance(x,(int,float)): #判断如果不是int与float类型报错
        raise TypeError ("i'am sorry") #raise 用于在报错最后显示
    if x < 0:                          
        return -x
    else:
        return x

a = my_abs('a')
print(a)


结果:
Traceback (most recent call last):
  File "D:\pycharm\06-笔记.py", line 39, in <module>
    a = my_abs('a')
  File "D:\pycharm\06-笔记.py", line 33, in my_abs
    raise TypeError ("i'am sorry")
TypeError: i'am sorry     #显示

返回值

事实上,函数返回的是一个元组,多个变量可以同时接收一个元组

#返回值
def sum_01():
    a = 1
    b = 2
    return a,b    #同时返回多个值用 ,隔开即可(元组也可以省略外面的括号)

a = sum_01()   #因为只有一个接收变量,所以多个返回值会以元组的形式给他接收
print(a)
a,b = sum_01()  #多个返回值会以元组的形式返回
print(a)
print(b)

v,b,n = (3,4,5) #多个变量(与元组元素个数相同)接收元组,依次接收
print(v)
print(b)
print(n)


结果:
(1, 2)
1
2
3
4
5

位置参数

例:两个数字相加的函数的定义

a,b:形式参数
1,2:实际参数
数量不受限制(但形式参数与实际参数数量不同会报错)

形式参数与实际参数数量一致所以依次传递(即位置传参)

1、数量必须与定义时一致
2、位置必须与定义时一致

默认参数

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s


a = power(1)
print(a)

结果:
1

默认值参数设置的注意点

  1. 必选参数在前,默认参数在后(原因:可以把必选的传入完后,后面全部默认)
  2. 多个参数时,把变化小的放在后面。变化小的参数就可以作为默认值参数

好处:降低调用函数的难度

默认参数的坑:

def add_end(L=[]):
    L.append('END')
    return L

add_end()
add_end()


结果:
['END', 'END']
['END', 'END', 'END']

第一次调用add_end()时没有错误,第二次时,就会出现函数似乎记住了第一次调用的函数添加的end的列表

解释:
默认参数必须指向不变对象!(数组可变)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu下yolox tensorrt模型部署

TensorRT系列教程之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列教程之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列教程之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列教程之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列教程之 Linux下 yo…

C#串口原理

串口实际有2种。主要是电压逻辑不一样。玩单片机的人指usb转TTL的串口&#xff1b;普通人指USB转DB9的串口&#xff1b;先看下他们的区别&#xff1a; https://doc.embedfire.com/module/module_tutorial/zh/latest/Module_Manual/port_class/serial_port.html 1. 串口外设总结…

具有快表的地址变换机构

1.快表&#xff08;TLB&#xff09; 快表&#xff0c;又称联想寄存器(TLB&#xff0c;translation lookaside buffer)&#xff0c; 是一种访问速度比内存快很多的高速缓存(TLB不是内存! )&#xff0c; 用来存放最近访问的页表项的副本&#xff0c;可以加速地址变换的速度。 与…

【Java】JDK动态代理实现原理

代理模式 代理模式一般包含三个角色&#xff1a; Subject&#xff1a;主题对象&#xff0c;一般是一个接口&#xff0c;定义一些业务相关的基本方法。RealSubject&#xff1a;具体的主题对象实现类&#xff0c;它会实现Subject接口中的方法。Proxy&#xff1a;代理对象&#x…

使用CSS圆锥渐变创建背景图案

本文翻译自 How to create background pattern using CSS & conic-gradient&#xff0c;作者&#xff1a; Temani Afif&#xff0c; 略有删改。 拥有一个好的背景图案可以使你的网站设计与众不同。多亏了CSS渐变&#xff0c;我们可以使用几行代码创建花哨炫酷的图案。在这篇…

品牌被侵权也可以免费维权了

构成品牌侵权的理由一般有&#xff0c;商标侵权、专利侵权、著作权侵权等&#xff0c;当这些侵权链接持续存在&#xff0c;必然会影响品牌声誉和利益&#xff0c;同时不利于品牌和谐健康的渠道环境构建&#xff0c;低价、假货、窜货也可算作侵权&#xff0c;那何种侵权可以免费…

抖音热搜榜上榜策略

热点事件是抖音热搜榜的常客&#xff0c;要想登上热搜榜&#xff0c;首先要把握住热点&#xff0c;抢占先机。关注时事新闻、娱乐圈动态、社会热点等&#xff0c;结合自己的短视频内容&#xff0c;迅速制作出相关的短视频&#xff0c;以便在话题讨论初期就吸引用户的关注。同时…

获取时间Calendar类(LocalDateTime、LocalDate、LocalTime)

1.Calendar 是一个抽象类&#xff0c;并且构造器是private 2.我们只能通过getInstance()来获取实例 3.里面包含了大量的字段和方法提供给程序员 4. Calendar 没有提供对应的格式化的类&#xff0c;因此需要程序员自己组合来输出(灵活) 5.如果我们想要使用24小时制 Calendar.Hou…

二十五、【色调调整基础】

文章目录 1、亮度/对比度a、亮度b、对比度 2、曝光度3、阈值4、色阶5、反相6、黑白7、渐变映射 1、亮度/对比度 a、亮度 亮度是指画面的明亮程度 b、对比度 对比度指的是一幅图像中&#xff0c;明暗区域最亮和最暗之间不同亮度层级的测量&#xff0c;如下图所示&#xff0…

递归最小二乘法RLS

参考&#xff1a;RLS递归最小二乘法(Recursive Least Squares)_hymwgk的博客-CSDN博客

Springboot3 + knife4j(springdoc) 框架整合

前言 kinfe4j文档地址&#xff1a;https://doc.xiaominfo.com/docs/quick-start springdoc文档地址&#xff1a;https://springdoc.org/#demos 原本使用的是springfox&#xff0c;自Springboot3开始&#xff0c;knife4j引入了springdoc。 Maven引入 <dependency><…

无线设备的天线怎么安装最好?

天线作为无线传输过程中一个必不可少的配件&#xff0c;因此天线的安装和选型对于无线传输的稳定性发挥着至关重要的作用。本文将介绍影响天线安装对于无线通信效果的影响。 一、天线的工作原理 天线是一种能量变换器&#xff0c;它把传输线上传播的导行波&#xff0c;变换成在…

有哪些免费的数据恢复软件?EasyRecovery免费版下载

EasyRecovery作为一款专业的数据电脑恢复软件&#xff0c;它能够轻松搞定数据恢复&#xff0c;恢复丢失和删除的文件&#xff0c;支持电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘、本地电子邮件和 RAID 磁盘阵列等各类存储设备的数据恢复。这个新版本功能更加强大。目前的最…

54 完全平方数

完全平方数 理解&#xff1a;dp[i] 1 min ⁡ j [ 1 , i ] d p [ i − j 2 ] 1 {\min}_{j[1, \sqrt{i}]}dp[i-j^2] 1minj[1,i ​]​dp[i−j2] (不是贪心)题解1 DP 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数是一个整数&#xff0c;其值…

信号频谱分析与功率谱密度

当我们涉及无线通信、信号处理和电子设备时&#xff0c;信号频谱分析与功率谱密度是两个至关重要的概念。它们帮助我们理解信号的特性、噪声和频率分布&#xff0c;从而优化通信系统、设计滤波器以及进行故障诊断。本文将初步探讨信号频谱分析与功率谱密度&#xff0c;一起理解…

StarRC:版本陈旧引发的多corner提取RC失败

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 运行StarRC提取多corner RC时会遇到提取失败的情况&#xff0c;当分次提取各个corner RC时却成功了&#xff0c;这种时候优先考虑nxtgrd版本陈旧的情况。 debug方法也简单&…

理解LoadRunner,基于此工具进行后端性能测试的详细过程(下)

5、录制并增强虚拟用户脚本 从整体角度看&#xff0c;用LoadRunner 开发虚拟用户脚本主要包括下面四步骤&#xff1a; 识别测试应用使用的协议 录制脚本 完善录制得到的脚本 验证脚本的正确性 识别被测应用使用的协议 如果明确知道了被测系统所采用的协议&#xff0c;可…

java小区物业水电费管理系统springboot+vue

智能小区管理系统被人们投放于现在的生活中进行使用&#xff0c;该款管理类软件就可以让管理人员处理信息的时间介于十几秒之间。在这十几秒内就能完成信息的编辑等操作。有了这样的管理软件&#xff0c;智能小区管理信息的管理就离无纸化办公的目标更贴近了。 这次开发的智能小…

RFID智能制造应用:助力企业提升制造效率!

随着企业间竞争加剧&#xff0c;如何提升企业生产效率&#xff0c;降低成本成为不少制造企业持续追求的目标。利用智能制造中的RFID设备&#xff0c;可以对企业入库、盘点、生产、出库等流程进行监控&#xff0c;本文将探讨智能制造中的RFID设备如何帮助企业提升制造效率&#…

Maven打包知识点

一.前言 今天在工作中需要给测试同学提供一个jar包&#xff0c;里面包含了pom里面得外部依赖&#xff0c;我依旧按照往常得方式进行打包 二.外部依赖变成jar包里面的class 发现打的jar包里面并没有外部依赖。 直接上代码 <plugins><plugin><artifactId>ma…