zoukankan      html  css  js  c++  java
  • python学习之路-6 冒泡算法、递归、反射、os/sys模块详解

    算法

    冒泡算法

    # 冒泡算法就是将需要排序的元素看作是一个个“气泡”,最小的“气泡”最先浮出水面,排在最前面。从小到大依次排列。
    
    # 代码如下:
    li = [97, 65, 13, 39, 88, 50, 30, 34, 52, 57, 36, 5, 74, 25, ]
    	
    count = len(li)
    for x in range(count):
        for i in range(count):
            if li[i] == li[-1]:
                break
            elif li[i] > li[i+1]:
                li[i], li[i+1] = li[i+1], li[i]
        count -= 1
    	
    print(li)
    

    递归

    在函数内调用函数自己称之为递归

    # 应用案例:实现阶乘  1*2*3*4*5*6*7*8*9*10
    def func(num):
    if num == 1:
        return 1
    return num * func(num - 1)
     
    x = func(10)
    print(x)
     
    # 输出
    3628800
    

    反射

    利用字符串的形式去对象(模块)中操作(寻找(getattr)/检查(hasattr)/删除(delattr)/设置(setattr))成员,缩减了代码的编写

    # 在commons中寻找成员login,并将成员Login的内容赋值给func
    func =  getattr(commons, "login")
    func()  # 相当于执行成员login内的代码
    	
    # 返回一个bool值  查看commons中是否存在login  
    hasattr(commons, "login")   
     
    # 在commons对象中创建成员open_file
    setattr(commons, "open_file")   
     
    # 在commons对象中删除成员open_file
    delattr(commons, "open_file")   
    

    应用案例:

    ① 在模块commons.py中有两个函数用来做登录操作和显示首页操作

    def login():
        print("登录")
     
    def home():
        print("首页")
    

    ② 在index.py中导入commons模块,使用反射根据用户的输入调用相应的方法

    import commons
    inp = input("请输入需要操作的方法:(login/home)")
     
    if hasattr(commons, inp):
        func = getattr(commons, "login")
        func()
    else:
        print("输入错误")
    

    扩展之导入模块:

    # 应用场景:
    比如获取用户输入,根据用户的输入来决定登录、注册,分别导入不同的函数,然后在配合反射
    
    # 使用这种方式也可以导入模块,commons为模块名,
    # 将commons模块的内容导入,赋值给obj
    obj = __import__("commons")
    # 导入多级目录的时候需要设置fromlist=True,如果不设置,则只导入第一层
    obj = __import__("lib.commons", fromlist=True)
    

    四、模块

    sys模块

    # sys.argv  # 在执行程序的时候可以给程序传参数,例如类似执行nginx检测配置文件语法功能的命令, nginx -t
    
    # mode_sys.py
    import sys
    print(sys.argv)
    	
    # 执行程序,返回一个列表
    CongdeMacBook-Pro:class_code congzhang$ python3 mode_sys.py -t
    # 输出
    ['mode_sys.py', '-t']
    
    ------------------------------------------------------------------
    # sys.platform # 获取系统类型,比如程序要在多系统上运行的时候,就需要用到该方法了
    # windows
    >>> import sys
    >>> print(sys.platform)
    win32
    
    # mac
    >>> import sys
    >>> print(sys.platform)
    darwin
    
    # ubuntu
    >>> import sys
    >>> print(sys.platform)
    linux
    
    
    # 应用案例:
    # 假设,我们想实现一个清除终端,linux下用clear, windows下用cls
    
    import sys, os
    ostype = sys.platform
    # 如果系统类型为linux或mac
    if ostype == ”linux” or ostype==”darwin”:
    	cmd=”clear”
    else:
    	cmd=”cls”
    os.system(cmd)  # 调用os.system方法清屏
    
    ------------------------------------------------------------------
    # sys.path  # 查看当前环境变量
    >>> import sys
    >>> print(sys.path)
    ['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages']
    
    # sys.path.append("/home")  # 将/home添加到环境变量中,/home下面的.py文件就可以直接使用import 模块名 来进行导入了
    

    os模块

    python中os模块的一些方法可以直接跟系统(linux/windows)进行交互

    os.name  # 查看当前系统的类型,如果是window 则用'nt'表示,对于Linux/Unix,则用'posix'表示
    >>> os.name
    'posix'
    
    os.getcwd()  # 得到当前工作目录,即当前Python脚本工作的目录路径
    >>> os.getcwd()
    '/Users/congzhang'
    
    os.listdir() # 返回指定目录下的所有文件和目录名
    >>> print(os.listdir())
    ['.bash_history', '.bash_profile', '.bash_sessions', '.CFUserTextEncoding', '.DS_Store', '.idlerc', '.matplotlib', '.python_history', '.sogouinput', '.subversion', '.Trash', '.wiznote', 'Applications', 'Applications (Parallels)', 'data', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public']
    >>> print(os.listdir("/"))
    ['.DocumentRevisions-V100', '.file', '.fseventsd', '.PKInstallSandboxManager', '.Spotlight-V100', '.Trashes', '.vol', 'Applications', 'bin', 'cores', 'dev', 'etc', 'home', 'installer.failurerequests', 'Library', 'net', 'Network', 'private', 'sbin', 'System', 'tmp', 'Users', 'usr', 'var', 'Volumes']
    
    os.remove()  # 只能删除文件,括号内放文件的绝对路径,删除目录会报错的
    >>> os.remove("/Users/congzhang/data/aaa")
    
    os.rmdir()	# 删除指定目录
    os.mkdir()	# 创建目录
    
    os.path.isfile()	# 判断指定对象是否为文件,是则返回True,否则返回False
    os.path.isdir()	# 判断指定对象是否为目录,是则返回True,否则返回False
    os.path.exists()	# 检测指定对象是否存在,是则返回True,否则返回False
    
    os.system()  # 运行系统命令
    >>> os.system('ls')
    Applications			Movies
    Applications (Parallels)	Music
    Desktop				Pictures
    Documents			Public
    Downloads			data
    Library
    0
    
    os.path.split()	# 返回路径的目录和文件名
    # 这里svn是目录,只是判断是不是以‘/’结尾,是则判定最后一个为文件,否则为目录
    >>> os.path.split("/Users/congzhang/data/svn")
    ('/Users/congzhang/data', 'svn')
    >>> os.path.split("/Users/congzhang/data/svn/")
    ('/Users/congzhang/data/svn', '')
    
    os.path.join(path, name)	# 连接目录和文件名
    >>> os.path.join("/home", "xxx.txt")
    '/home/xxx.txt'
    
    os.path.basename(path)		# 返回文件名
    # 跟上面的os.path.split()类似,根据末尾是否存在'/'判断路径最后一段是否为目录
    >>> os.path.basename("/Users/congzhang/data/svn/")
    ''
    >>> os.path.basename("/Users/congzhang/data/svn")
    'svn'
    
    os.path.abspath()	# 使用相对路径获得绝对路径
    >>> os.path.abspath(".")
    '/Users/congzhang'
    
    os.path.dirname(path)	# 返回路径的上一级目录名
    >>> os.path.dirname("/Users/congzhang/data/svn")
    '/Users/congzhang/data'
    >>> os.path.dirname("/Users/congzhang/data/svn/")
    '/Users/congzhang/data/svn'
    
    
  • 相关阅读:
    Linux内核中常用的数据结构和算法(转)
    漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)
    2--STM32+USB移植+HID 与AUDIO类MIDI设备组成的复合设备(原创)
    1--STM32 ADC1与ADC2 16通道DMA采集笔记(原创)
    记不住 Linux 命令?这三个工具可以帮你(转)
    专访笨叔叔:2019年可能是Linux年?(转)
    C语言冒泡排序_4
    USB HID设备报告描述符详解(转)
    C语言数组指针_3
    C语言编程知识点_1
  • 原文地址:https://www.cnblogs.com/CongZhang/p/5608880.html
Copyright © 2011-2022 走看看