Python学习之旅 —— 基础篇(七)反射、冒泡排序算法

本篇要点:

冒泡算法

反射

一、冒泡排序

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码示例:

li = [5, 67, 2, 8, 5, 19, 6, 33, 98, ]

times = len(li)
for i in range(times):
    for j in range(times-1):
        if li[j] > li[j+1]:
            li[j], li[j+1] = li[j+1], li[j]
print(li)
结果:
[2, 5, 5, 6, 8, 19, 33, 67, 98]

### 插入排序、选择排序

二、反射

有时候我们想要导入某个模块的某个方法,或者需要对对象的某个参数赋值,需要通过参数传递字符串的形式输入。在这样的情况你会选择什么样的办法来解决吗?例如:

# 模块 commons.py
def home():
    print("主页面")

def login():
    print("登录页面")

def logout():
    print("退出页面")

# index.py 导入模块
import commons

def run():
    inp = input("请输入要访问的URL: ")
    if inp == "home":
        commons.home()
    elif inp == "login":
        commons.login()
    elif inp == "logout":
        commons.logout()
    else:
        print("404")

if __name__ == ‘__main__‘:
    run()

在上面的代码中使用if语句的话,就是你每写一个方法就得有一个elif语句来判断,假如有1000个方法,这样就得有1000个elif语句。这么看实在是弱爆了。有没有更简单的方法实现字符串参数转换成函数名?那就要使用到反射了。修改后的代码如下:

# 模块 commons.py
def home():
    print("主页面")

def login():
    print("登录页面")

def logout():
    print("退出页面")

# index.py 导入模块
import commons

def run():
    inp = input("请输入要访问的URL: “)  # 字符串类型
    # 利用字符串的形式去对象(模块)中操作(检查、查找、修改、删除)成员
    # delattr()、setattr()  在内存中进行操作
    # 通过hasattr()判断函数是否存在
    if hasattr(commons, inp):
        # 通过反射执行commons模块中的函数
        func = getattr(commons, inp)
        func()
    else:
        print("404")

if __name__ == ‘__main__‘:
    run()

现在只有一个模块,如果有1000个模块,难道要导入1000次?当然不用,我们引入__import__()函数,来实现字符串转换成模块引入。代码如下:

# 模块account.py
def login():
    print("登录页面")

def logout():
    print("退出页面")

# 模块commons.py
def home():
    print("主页面")

# 模块manager.py
def order():
    print("订单页面")

# 主函数 index.py 导入模块
def run():
    # account/login格式
    inp = input("请输入要访问的URL: ")
    m, f = inp.split("/“)  # 将account/login格式分割成两部分 m="account",f="login”  m,f 都是字符串
    obj = __import__(m)  # 导入名字为account的模块

    # 通过反射实现模块中函数的调用
    if hasattr(obj, f):
        func = getattr(obj, f)
        func()
    else:
        print("404")

if __name__ == ‘__main__‘:
    run()

上面的例子其实是伪造了web框架的路由系统。

补充:

__import__("libs.aaa.bbb", fromlist=True)   # 支持目录的拼接,否则只能导入libs

如果完整的软件包想要实现更高的可移植性,需要把文件的主目录放到sys.path中,方便模块的导入,方法如下:

def add_path():
    # 添加程序的执行路径
    import os
    import sys
    # ps.path.abspath(__file__) 获取当前执行文件的绝对路径
    # os.path.dirname() 获取当前路径的上一层路径
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 一直找到主目录为止,然后将主目录添加到sys.path

# __name__ 只有再执行当前文件时,__name__ =__main__,导入不执行
if __name__ == ‘__main__‘:
    add_path()
时间: 2024-10-29 22:05:17

Python学习之旅 —— 基础篇(七)反射、冒泡排序算法的相关文章

Python学习之旅 —— 基础篇(四)内置函数、装饰器

本篇要点: 内置函数 装饰器 一.内置函数 # abs() :取绝对值 >>> res = abs(-10) >>> print(res) 10 # 0,None,"",{},[],() 布尔值都为空 # all(),any() 判断值的真假 # all() 所有为真才为真 p = all([0,1,2,3]) # 0为False,所有p 是False print(p) # any() 任意一个为真即为真 p = any((0,""

Python学习之旅 —— 基础篇(三)set集合、函数、文件操作

本篇要点: 数据类型:set集合 函数 文件操作 三元运算(三目运算)和lambda表达式 一.set集合 python中数据类型的一种,是无序并且不重复的数据集合.set源码: class set(object): """ 创建set集合 set() -> new empty set object 把可迭代的数据类型转换成元组 set(iterable) -> new set object Build an unordered collection of uni

Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器&迭代器、模块

本篇要点:字符串格式化递归生成器和迭代器模块 一.字符串格式化 字符串格式化的两种方式:占位符 %, format函数1.占位符% %[(name)][flags][width].[precision]typecode - (name) 可选,用于选择指定的key - flags 可选,可供选择的值有: - + 右对齐:正数前加正好,负数前加负号: - - 左对齐:正数前无符号,负数前加负号: - 空格 右对齐:正数前加空格,负数前加负号: - 0 右对齐:正数前无符号,负数前加负号:用0填充空

Python学习之旅 —— 基础篇(六)模

本篇要点: 模块   一.模块 模块是实现某个功能的代码集合 函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块.   模块的种类 模块分为三种:     内置标准模块(标准库)     第三方模块(开源模块)     自定义模块   1.自动以模块 & 导入模块 使用模块前需要先将模块导入,模块导入的方式: # 单模块,且在同一目录下,建

Python学习之旅 —— 基础篇(八)面向对象

概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 对比示例:函数式变成和面向对象编程 连接数据库的增删改查 # 函数式编程 def slect(host, username, password, sql): pass def create(host, username, password, database): pass def remove(host, usernam

Python学习总结之一 -- 基础篇

Python学习第一篇 一:写在前面 啊,最近我的新博客一直都没有更新学习内容了,只是最近一直都在忙着寻找实习机会(或许这只是一个借口,真实原因是我太懒惰了,改改改!).终于今天又投递了几个新的实习职位之后幡然醒悟,我的执行力还是太弱了,我得更加有自律性更加坚持才行.所以今天,我把之前学习的Python基础知识总结一下. 二:认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思.我们为什么要学习Python呢?就我而

python学习之路基础篇(第七篇)

一.模块 configparser XML shutil zipfile 和 tarfile subprocess 二.面向对象 什么是面向对象 self是什么鬼 构造方法 面向对象的三大特性:封装,继承,多态 已经学习过的python内置类:str  list  tuple dict  set python自定义类 python单继承 python多继承

python学习之路基础篇(第四篇)

一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串“老男人”转换成utf-8 s = "老男人" ret = bytes(s,encoding="utf-8") print(ret) ret1 = bytes(s,encoding="gbk") print(ret1) #程序运行结果如下: b'\xe8\x80\x81\xe7\x94\xb7\xe4\xba\xba' b'\xc0

python学习之路基础篇(三)

一.简单回顾上次课程内容 主要内容:str|list|dict 类---对象 具体内容可以参考: http://www.cnblogs.com/wupeiqi/articles/5433925.htmlhttp://www.cnblogs.com/wupeiqi/articles/5444685.html 二.python后续学习方法:首先整理课程讲解内容到博客,然后再写作业 三.本次课程内容 1.数据类型-set 小结: 列表和集合set的区别(小知识点):列表:有序 可重复 可嵌套集合set