• python学习之路基础篇(第六篇)


    一、算法

    • 冒泡排序

      两两比较 打的沉下去,小的浮上来  从而把数字从小到大排列出来

    • 选择排序

      随机取一个索引作为最大值,然后和列表中的其他索引进行比较,如果l[0]<l[1],则将l[1]修改为最大值,继续和其他索引元素比较,将最大值排在最后,完成排序

    • 插入排序

      使用维护一个有序的集合,获取第一个元素作为最大值,然后去列表中的第二个元素,两两比较,如果比第二个元素大于第一个元素则排在第一个元素后面,如果小于第一个元素则排在第一个元素前面,然后依次取列表中的元素按照此方法进行比较,最终完成列表元素从小到大的排序 

    冒泡排序

    需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序

    思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!

    li = [13, 22, 6, 99, 11]
    
    for m in range(4):     # 等价于 #for m in range(len(li)-1):
        if li[m]> li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
    
    li = [13, 22, 6, 99, 11]
    
    for m in range(4):     # 等价于 #for m in range(len(li)-1):
        if li[m]> li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
    
    for m in range(3):     # 等价于 #for m in range(len(li)-2):
        if li[m]> li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
    
    for m in range(2):     # 等价于 #for m in range(len(li)-3):
        if li[m]> li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
    
    for m in range(1):     # 等价于 #for m in range(len(li)-4):
        if li[m]> li[m+1]:
            temp = li[m+1]
            li[m+1] = li[m]
            li[m] = temp
    print li
    
    li = [13, 22, 6, 99, 11]
    
    for i in range(1,5):
        for m in range(len(li)-i): 
            if li[m] > li[m+1]:
                temp = li[m+1]
                li[m+1] = li[m]
                li[m] = temp
    

    二、递归函数的应用

    求7的阶乘 

    def func(num):
        if num == 1:
            return 1
        return num * func(num-1)
    
    x = func(7)
    print(x)
    
    # 程序运行结果如下:
    # 5040
    

    三、反射 

    1.反射必知必会

    def f1():
        print('f1')
    
    #f1和“f1”二者的区别
    # f1  #函数名,是一个变量,代指整个函数
    # "f1"    #字符串对象
    
    #s1.py
    def func():
        print('func')
    
    #index.py
    import s1
    s1.func()
    
    #程序运行结果:func
    #程序的返回值为None
    #如果函数中没有显示的return,则默认的返回值为None
    

    2.需求:根据用户的输入的不同来展示不同页面

    #commons.py
    def login():
        print('login')
    
    def logout():
        print('logout')
    
    def home():
        print('home')
    
    #index.py
    import commons
    
    def run():
        inp = input('请输入你要访问的页面:')
        # inp = login,假设用户输入的是字符串是login,则inp = login
        # commons.inp() # commons.login
        if inp == 'login':
            commons.login()
    
    if __name__ == "__main__":
        run()
    
    #程序运行结果如下:
    请输入你要访问的页面:login
    login
    

    从上面的输出可以看到,程序可以根据用户的输入来显示不同的内容,而用户的输入都是以字符串的形式存在的,我们是否可以利用用户输入的字符串对模块进行相关的操作呢?当然可以,在python中,反射就是利用字符串的实行去对象(默认)中操作(寻找)成员

    #反射:getattr hasattr
    #commons.py
    def login():
        print('login')
    
    def logout():
        print('logout')
    
    def home():
        print('home')
    
    #index.py
    import commons
    def run():
        inp = input('请输入你要访问的页面:')
        if hasattr(commons,inp):
            func = getattr(commons,inp)
            func()
        else:
            print('404 ERROR page!')
    
    if __name__ == "__main__":
        run()
    
    #程序执行结果如下:
    请输入你要访问的页面:403
    404 ERROR page!
    

    3.补充知识

    __main__        #只有执行当前文件时,当前文件的特殊变量__name__=="__main__"
    __file__        #当前py文件所在的路径
    __cached__      #字节码存放的位置
    __package__     #py文件所在的软件包
    

    4.反射和__import__的应用

    __import__:模块的导入  
    #manager.py def order(): print('订单页面') #commons.py def home(): print('首页面') #index.py def run(): #account/login inp = input('请输入要访问的URL:') m, f = inp.split('/') #将用户输入的内容使用/进行分隔,将模块名赋值给m,方法赋值给f #obj = __inport__('lib.' + m,fromlist = True),如果要导入的模块和index不是同级目录,则需要对模块进行拼接,并且设置fromlist=True obj = __import__(m) if hasattr(obj,f): func = getattr(obj,f) func() else: print('404 error page') if __name__ == '__main__': run() #程序运行结果如下: 请输入要访问的URL:commons/order 404 error page 请输入要访问的URL:account/login 登录页面 请输入要访问的URL:commons/home 首页面

    四、加密模块hashlib

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

    import hashlib
     
    # ######## md5 ########
    hash = hashlib.md5()
    # help(hash.update)
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    print(hash.digest())
     
    ######## sha1 ########
     
    hash = hashlib.sha1()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
    # ######## sha256 ########
     
    hash = hashlib.sha256()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
    # ######## sha384 ########
     
    hash = hashlib.sha384()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
    # ######## sha512 ########
     
    hash = hashlib.sha512()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

    import hashlib
    ######### md5 ########
    hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
    hash.update(bytes('admin',encoding="utf-8"))
    print(hash.hexdigest())
    

    python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密

    import hmac
    h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
    h.update(bytes('admin',encoding='utf-8'))
    print(h.hexdigest())
    

    五、正则表达式

    python中re模块提供了正则表达式相关操作

    字符:

    .           匹配除换行符以外的任意字符
    w	    匹配字母或数字或下划线或汉字
    s	    匹配任意的空白符
    d	    匹配数字
    	    匹配单词的开始或结束
    ^	    匹配字符串的开始
    $	    匹配字符串的结束    
    

    次数:

    *          重复零次或更多次
    +	    重复一次或更多次
    ?	    重复零次或一次
    {n}	    重复n次
    {n,}	    重复n次或更多次
    {n,m}	    重复n到m次
    

    match:从气势位置开始匹配,匹配成功返回一个对象,未匹配成功返回None

    # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
     
     match(pattern, string, flags=0)
     # pattern: 正则模型
     # string : 要匹配的字符串
     # falgs  : 匹配模式
         X  VERBOSE     Ignore whitespace and comments for nicer looking RE's.
         I  IGNORECASE  Perform case-insensitive matching.
         M  MULTILINE   "^" matches the beginning of lines (after a newline)
                        as well as the string.
                        "$" matches the end of lines (before a newline) as well
                        as the end of the string.
         S  DOTALL      "." matches any character at all, including the newline.
     
         A  ASCII       For string patterns, make w, W, , B, d, D
                        match the corresponding ASCII character categories
                        (rather than the whole Unicode categories, which is the
                        default).
                        For bytes patterns, this flag is the only available
                        behaviour and needn't be specified.
          
         L  LOCALE      Make w, W, , B, dependent on the current locale.
         U  UNICODE     For compatibility only. Ignored for string patterns (it
                        is the default), and forbidden for bytes patterns.
    
    import re
    
    #match:从字符串的开头进行匹配
    #匹配成功
    res = re.match(".","abc123def")
    #匹配不成功
    res1 = re.match("adf","abc123def")
    #显示匹配的字符
    res2 = re.match(".","abc123def").group()
    print(res)
    print(res1)
    print(res2)
    
    程序输出结果如下:
    <_sre.SRE_Match object; span=(0, 1), match='a'>
    None
    a
    

    search:浏览整个字符串去匹配第一个,未匹配成功返回None

    # search,浏览整个字符串去匹配第一个,未匹配成功返回None
    # search(pattern, string, flags=0)
    #从整个字符串中进行查找一旦匹配就输出结果
    res3 = re.search("d+","abc123def456ghi")
    程序执行结果入如下:
    <_sre.SRE_Match object; span=(3, 6), match='123'>
    #实例2
    name = "Chong li"
    res = re.search("(w+)s(w+)",name).group()
    res1 = re.search("(w+)s(w+)",name).groups()
    print(res)
    print(res1)
    # 程序执行结果:
    Chong li
    ('Chong', 'li')
    
    #实例3
    res = re.search("(?P<name>w+)s(?P<last_name>w+)",name)
    name = res.group("name")
    xing = res.group("last_name")
    print(name)
    print(xing)
    #程序执行结果:
    Chong
    li  

    findall:获取非重复的匹配列表,如果有一个组则以列表形式返回,且每一个匹配均是字符串,如果模型中有多个组,则以列表形式返回,且每一个匹配都是元组,空的匹配也会包含在结果中

    # findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
    # 空的匹配也会包含在结果中
    #findall(pattern, string, flags=0)
    #实例
    #匹配字符串中所有的数字
    res4 = re.findall("d+","abc123def456ghi*sdf3_def")
    #匹配除数字以外的所有内容,也即针对res4取反
    res5 = re.findall("[^d+]","abc123def456ghi*sdf3_def")
    res6 = re.findall("[^d]","abc123def456ghi*sdf3_def")
    print(res4)
    print(res5)
    print(res6)
    
    程序执行结果如下:
    ['123', '456', '3']
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '*', 's', 'd', 'f', '_', 'd', 'e', 'f']
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '*', 's', 'd', 'f', '_', 'd', 'e', 'f']
    

    sub:替换匹配成功的指定位置字符串

    # sub,替换匹配成功的指定位置字符串
     
    sub(pattern, repl, string, count=0, flags=0)
    # pattern: 正则模型
    # repl   : 要替换的字符串或可执行对象
    # string : 要匹配的字符串
    # count  : 指定匹配个数
    # flags  : 匹配模式
    
    #字符串内容的替换
    res9 = re.sub("ab","LI","abc123def456ghi*sdf3_abdef")
    res10 = re.sub("ab","LI","abc123def456ghi*sdf3_abdef",count=1)
    print(res9)
    print(res10)
    
    程序运行结果如下:
    LIc123def456ghi*sdf3_LIdef
    LIc123def456ghi*sdf3_abdef
    

    split:根据正则匹配分隔字符串

    # split,根据正则匹配分割字符串
    #语法
    split(pattern, string, maxsplit=0, flags=0)
    # pattern: 正则模型
    # string : 要匹配的字符串
    # maxsplit:指定分割个数
    # flags  : 匹配模式
    #实例
    #把字符串按照数字进行分隔
    res7 = re.split("d+","abc123def456ghi*sdf3_def")
    #把字符串按照数字或者*进行分隔
    res8 = re.split("[d,*]","abc123def456ghi*sdf3_def")
    print(res7)
    print(res8)
    #程序运行结果如下:
    ['abc', 'def', 'ghi*sdf', '_def']
    ['abc', '', '', 'def', '', '', 'ghi', 'sdf', '_def']
    

      

      

     

      

     

     

      

      

      

     

      

     
  • 相关阅读:
    【洛谷P4887】【模板】莫队二次离线(第十四分块(前体))
    查询数据库表大小
    java程序使用ssl证书连接mysql
    win32- 函数运行速度测试
    回调函数是嘛东西
    win32-读取控制台中所有的字符串
    关于 websocket 的一些学习
    idea下载地址
    ida 重新定义
    P1650 田忌赛马(贪心)
  • 原文地址:https://www.cnblogs.com/yamei/p/5576812.html
Copyright © 2020-2023  润新知