【python-Day6(反射、正则)】

一、冒泡排序

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

练习:

# 冒泡排序
li = [3,10,5,22,89,55,-4,31]

for n in range(1,len(li)):
    for m in range(len(li)-n):
        num1 = li[m]
        num2 = li[m+1]
    if num1 > num2:
        temp = li[m]
        li[m] = num2
        li[m+1] = temp
print(li)

--> [-4, 3, 10, 5, 22, 89, 55, 31]

二、 反射

# 反射:利用字符串的形式去对象(模块)中操作(寻找、删除、设置)成员# hasattr()  getattr()  delattr()  setattr() --> 都是在内存中操作的# 场景:伪造web框架的路由系统

练习:

# 模块 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-13 22:43:28

【python-Day6(反射、正则)】的相关文章

python_way day6 反射,正则 模块

python_way day6 反射 正则 模块 一.模块: 1.sys & os: 我们在写项目的时候,经常遇到模块互相调用的情况,但是在不同的模块下我们通过什么去可以找到这些模块的位置哪? 那就是环境变量! 如何查看当前的环境变量?a = sys.pathprint(a)['D:\\资料\\python\\oldboy13\\jobs\\day5\\conf', 'D:\\资料\\python\\python35\\lib\\site-packages\\requests-2.10.0-py

day6 反射,hashlib模块,正则匹配,冒泡,选择,插入排序

一.反射(自省) 首先通过一个例子来看一下本文中可能用到的对象和相关概念. import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数,foo指向这个函数对象 class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.sayHi访问

python浅谈正则的常用方法

python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去找内容,因为容易理解也方便,),而是正则用好用精通的很难(看过正则表的应该都知道,里面符号对应的方法规则有很多,很灵活),对于接触编程不久的朋友们来说很可能在编程的过程上浪费很多时间,今天我把经常会用到正则简单介绍下,如果不是很特殊基本都覆盖使用. 1.正则的简单介绍 首先你得导入正则方法 impo

python匹配ip正则

python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe2.6.5.7sdfsf2.3.94.5sdf200.198.25.0" res = [] for i in range(1): ip_t = True m_ind = 0 while ip_t: m = re.search(r"(((2([0-4]\d|5[0-5])|((1\d|[1-

python的反射

目前大多数网站都是通过路由的方法来,处理url请求,如果有很多个url的话,不停的include或者用if判断匹配,似乎不太符合情理,因此这里讲讲python的反射机制, 自动装在模块.请看下面的实例: 在目录 /myspace/mywork/python/reflect 有两个文件 index.py account.py account.py内容 #encoding=utf-8 def login(uname): print '恭喜你登录成功'+uname index.py内容 #encodi

python的反射机制

转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 1 2 3 4 5 def f1():     print("f1是这个函数的名字!") s = "

简单谈谈python的反射机制

对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 def f1(): print("f1是这个函数的名字!") s = "f1" print("%s是个字符串" % s) 在上面的代码中,我们必须区分两个概念,f1和“f1".前者是函数f1的

Python之反射练习

Python之反射练习 # 什么是反射?可以用字符串的方式去访问对象的属性 class Test(): _name = "sss" def fun(self): return "Helloword" t = Test() # print(hasattr(t,"_name")) #hasattr(obj,name)#查看类里面有没有name属性 # print(hasattr(t,"fun")) #True if hasattr

python 模块 反射

模块 os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dir1/dir2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os

python基础知识---正则

一.python正则简介 python的re模块,让python能够支持扩展正则 扩展正则的字符集("."  "[abc]"   "(abc)"  "a|b").锚点("$"  "^"  "\<\>").修饰字符("*"  "?"  "+"  "{}")  这里不做介绍 二.r