韩顺平 | 零基础快速学Python(9~11) 排序查找

排序和查找

排序

排序:将多个数据按顺序排列。有冒泡、选择、插入、希尔、归并、快速、堆、计数、捅、基数排序。

冒泡排序

冒泡排序 Bubble Sorting:重复地走访需要排序地元素列表,依次比较相邻的元素,如果顺序错误就交换位置,直至完成。最大/最小元素会慢慢浮到顶/底端,形如冒泡。

num_list = [24, 69, 80, 57, 13, 22]
print("排序前".center(32, "-")) # ---排序前--- 参数为宽度和字符
print(f"num_list: {num_list}")

# num_list.sort() #内置函数排序

# 使用冒泡排序
def bubble_sort(my_list):
    """
    功能:对传入的列表完成从小到大的排序
    :param my_list: 传入的列表
    :return: 无(修改列表会修改原列表)
    """
    # i控制比较轮次
    for i in range(1, len(my_list)):
        # j控制比较的次数,同时可以作为比较元素的索引下标
        for j in range(0, len(my_list) - i):
            if my_list[j] > my_list[j + 1]:
                my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]
        # print(f"第{i}轮排序的结果my_list=", my_list)

bubble_sort(num_list)
print("排序后".center(32, "-"))
print(f"num_list: {num_list}")

查找

常见的查找方法:顺序、二分、插值、斐波那契、数表、分块、哈希查找

顺序查找

names_list = ["白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王", "金毛狮王"]
find_name = "金毛狮王"

# 使用list.index()查找
# res_index = names_list.index(find_name)
# print(res_index)

# 使用顺序查找方法
def seq_search(my_list, find_val):
    #find_index = -1 # 只有一个结果
    find_index = [] # 不止一个结果
    for i in range(len(my_list)):
        if my_list[i] == find_val:
            # print(f"恭喜找到{find_val}")
            # find_index = i
            find_index.append(i)
        # break
    # else: #未执行到break,进入else
    #     print(f"没有找到对应值{find_val}")
    return find_index

res_index = seq_search(names_list, find_name)
print(res_index)

二分查找

二分查找的前提是列表已排序,升序还是降序影响二分查找的代码逻辑,如从小到大的序列
1 找到列表的中间数mid_val 和 find_val比较
2 如果 mid_val > find_val,则到左边查找,否则右边查找,相等返回下标
3 循环1-2
4 如果while结束还没有找到,说明列表无该值

num_list = [1, 8, 10, 89, 1000, 1234]
def binary_search(my_list, find_val):
    left_index = 0
    right_index = len(my_list) - 1
    find_index = -1
    while left_index <= right_index:
        mid_index = (left_index + right_index) // 2
        mid_value = my_list[mid_index]
        if mid_value > find_val:
            right_index = mid_index - 1
        elif mid_value < find_val:
            left_index = mid_index + 1
        else:
            find_index = mid_index
            break
    return find_index

res = binary_search(num_list, 1)
if res == -1:
    print("列表中无该值")
else:
    print(f"查找到该值下标为{res}")

断点调试

断点调试的控制按钮
F7 Step into:跳入方法/函数内
F8 Step over:跳过方法函数,逐行执行代码
shift+F8 Step out:跳出方法/函数
F9 resume:执行到下一个断点

模块和包

模块

介绍:Python把各种定义(函数、类、变量、可执行代码等)存入一个文件,在脚本或解释器的交互式实例中使用,这个.py文件即模块。

模块导入

import写在文件头
基本语法:

[from 模块名] import (函数 || 变量 | *) [as 别名] #[]可选

import 模块1[, 模块2...] # 导入一个或多个模块,建议一行导入一个
模块.函数||变量 # 使用 .表层级关系

from 模块 import 函数||变量 # 导入模块的指定功能
函数||变量 # 直接使用

from 模块 import * # 导入模块的全部功能 ctrl+B查看模块全部功能
函数||变量 # 直接使用

import 模块 as 别名 # 给导入的模块取别名
别名.函数||变量
from 模块 import 函数||变量... as 别名 # 给导入的功能取别名
别名 # 直接使用别名

自定义模块

执行可执行文件,若其中有导入模块,导入模块会执行模块文件中的可执行代码。

# module1.py
def hi():
	print("hi")
hi()

# test.py
from module import *
hi()
"""
hi
hi
"""

当一个python模块或包被导入时,__name__会被设为模块的名称,通常是python文件名去掉后缀;如果模块是在最高层级代码/主程序中执行的,则它的__name__会被设为字符串__main__

# module1.py
def hi():
	print("hi")
hi()
print("module.py:", __name__)

# test.py
from module import *
hi()
print("test.py:", __name__)
"""
hi
module1.py: module1
hi
test.py: __main__
"""
__name__

使用__name__可以避免模块中测试代码的执行。因为执行导入模块时,模块文件的__name__是模块名不等于__main__,所以不会执行模块文件中的可执行代码块;单独执行模块文件时__name__等于__main__,可以继续执行代码。

# module1.py
def hi():
	print("hi")
if __name__ == "__main__":
	hi()

# test.py
from module import *
hi()
"""
hi 
"""
__all__

使用__all__可以控制 import * 时,那些功能被导入,其中 import 模块 方式不受该限制。

# module1.py
__all__ = ['hi'] # __all__ = ['hi', 'ok']
def hi():
	print("hi")
def ok():
	print("ok")
if __name__ == "__main__":
	hi()

# test.py
from module1 import * # 只能导入hi函数
# import module1 #可以导入所有功能
hi()
"""
hi 
"""

包package

从结构上看,包就是一个文件夹,该文件夹下包含了一个__init__.py文件,该文件可用于包含多个模块文件;从逻辑上看,包可以视为模块集合。

  • 包可以有多个层级,通过.确定层级关系。
  • 快捷键alt+enter选择解决方案,shift+alt+enter直接导入
import 包名.模块 # 导入
包名.模块.功能 # 使用

from 包名 import 模块 #导入
模块.功能 #使用

from 包名.模块 import 函数||变量|* #导入
功能 #直接使用

__init__.py通过__all__控制包的允许导入的模块

# __init__.py
__all__ = [允许导入的模块列表] # 对from 包 import * 生效;对import xxx不生效

第三方库

常见的第三方库:网络爬、自动化、数据分析及可视化、web开发、机器学习、其他常用(如OpenCV图像和视频工作库)。(库中有框架、文件)
在这里插入图片描述在这里插入图片描述

pip安装

pip是Python的包管理器工具,允许安装和管理第三方库和依赖
1 进入到命令行控制台
2 语法:pip install 库名/包名

pip install package_name #安装
pip uninstall package_name #卸载
pip list #显示已安装列表

问题:如果执行pip命令出现

`pip` 不是内部或外部命令,也不是可运行程序

1 检查系统环境命令,是否在python3.xx/Scripts文件夹下是否有pythonx.xx\Scrips和pythonx.xx的路径,若没有则添加并应用确认
2 检查pythonx.xx\Scrips路径下是否有pip.exe文件,若没有则打开命令行窗口,执行python -m ensurepip

pip源

默认pip源

国内知名源地址:
豆瓣 https://pypi.douban.com.simple
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
阿里云 https://mirrors.aliyun.com/pypi/simple
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple

pip install -i 指定源地址 库名/包名
通过pycharm安装:Settings > Python Interpreter > + > Option[-i 指定镜像源地址]

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值