zoukankan      html  css  js  c++  java
  • python学习之算法、自定义模块、系统标准模块(上)

    算法、自定义模块、系统标准模块(time 、datetime 、random 、OS 、sys 、hashlib 、json和pickle)

    一:算法回顾:

    冒泡算法,也叫冒泡排序,其特点如下:
    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.针对所有的元素重复以上的步骤,除了最后一个。
    4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    使用python的冒泡排序完成一组无序队列的排序:
    data = [10,4,33,21,54,3,8,11,5,22,2,2,2,1,17,13,6]
    print(data,"原队列")
    for j in range(1,len(data)-2): #大循环,列表队列总长度减2,因为下面比较的是根据元素的下标就向后推移了两个下标位
        for i in  range(len(data)-j): #每次小循环的次数减去大循环已经循环过的次数,因为大循环每循环一次就将将一个最大的元素放在了最右侧,次元素就不需要循环了
            if data[i] > data[i+1]: #假入第一个元素大于第二个元素
                tmp = data[i+1] #第一步先把第二个元素保存至一个临时变量
                data[i+1] = data[i] #第二步把第二个元素的值等于前面一个较大的元素的值
                data[i] = tmp #第三步把前一个元素等于后面较小元素的的临时变量,这样就完成了位置的替换
    print(data,"冒泡排序后的队列")
    
    
    
    [10, 4, 33, 21, 54, 3, 8, 11, 5, 22, 2, 2, 2, 1, 17, 13, 6] 原队列
    [1, 2, 2, 2, 3, 4, 5, 6, 8, 10, 11, 13, 17, 21, 22, 33, 54] 冒泡排序后的队列
    
    执行结果:
    

     

    二分查找:利用递归函数完成

    def search(data,n): #定义函数传递两个参数,data是要查找的列表,n是首要查找的值
        mid = int(len(data)/2) #取中间值
        if len(data) >=  1 : #假如队列的长度大于等于1
            if data[mid] > n: #大于等于之后判断中间值是否大于要查找的值,如果大于要查找的值
                print("要查找的%s 在左侧" % data[mid]) #
                search(data[:mid],n) #调用函数本身并将中间的值和要查找的值传递给函数,取队列的左半部分的元素
                #print(mid)
            elif data[mid] < n: #如果小于n
                print("要查找的 %s在右侧" % data[mid])
                search(data[mid:],n) #取队列的右半部分的元素值和要查找的值传递给函数
                #print(mid)
            else: #如果既不大于等于n也不小于n,就是找到了要查找的值
                print("找到了%s" % n)
        else: #如果没有找到
            print("找不到了%s " % n)
    
    if __name__ == "__main__": #主程序执行
        data = list(range(100000)) #生成列表
        search(data,13560) #调用函数并将列表和要查找的值传递给函数

    运行结果:
    要查找的50000 在左侧 要查找的25000 在左侧 要查找的 12500在右侧 要查找的18750 在左侧 要查找的15625 在左侧 要查找的14062 在左侧 要查找的 13281在右侧 要查找的13671 在左侧 要查找的 13476在右侧 要查找的13573 在左侧 要查找的 13524在右侧 要查找的 13548在右侧 找到了13560

     

    二:写一个简单的Web框架模块:

    要求:有处理前端页面展现、后端提交和处理数据库请求的

    过程:

    1,创建一个Python Package叫shop,和directory最大区别是多了一个空的__init__文件,用于不同目录导入模块,在python3没有也可以,

    2,在shop创建一个Python Package创建一个frontend,backend,config用于前端、后端和配置文件信息

    3,在后端backend目录创建Python Package目录db和logic,负责数据库请求和逻辑请求处理

    4,在config创建python文件settings,保存配置信息,如资源保存路径等

    5,解耦,并行开发一个程序,相互可以通过接口调用,提高开发效率及代码利用率

    6,在logic目录创建一个python文件handle,用户处理逻辑请求,内容如下:

    def home():
        print("welcome to home page")
    
    def movie():
        print("welcome to movie page")
    
    def tv():
        print("welcome to tv page")
    

     7,在shop目录创建一个python文件叫index,在里面导入logic里面的handle模块,内容如下:

    from backend.logic import  handle #shop目录下
    handle.home() #执行该模块的方法
    handle.tv() #执行该模块的方法

    测试:现在运行index程序是可以显示home和tv函数返回的数据

    8.在db目录创建一个python文件叫sql_api,内容如下:

    def select(table,column):
        if table == "user":
            user_info = {
                "001":["jack",28,"IT"],
                "002":["tom",24,"IT"],
                "003":["lyly",26,"IT"],
            }
            return  user_info 

    9,在handle导入sql_api模块,内容如下:

    from backend.db.sql_api import  select #跨目录导入模块
    
    def home():
        print("welcome to home page")
        q_data = select("user","abc") #执行导入模块的参数,并传递一个user的值,abc的值没有用到
        print("query res: %s " % q_data) #输出select函数的执行结果
    def movie(): print("welcome to movie page") def tv(): print("welcome to tv page")
    

    10,测试--》执行index主程序,其会返回读取的数据信息,正常如下:

    welcome to home page
    query res: {'001': ['jack', 28, 'IT'], '002': ['tom', 24, 'IT'], '003': ['lyly', 26, 'IT']} 
    welcome to tv page
    

    11,增加数据库登录验证:

    在config创建settings文件,保存配这和验证信息,内容如下:

    DATABASE = {
        "engine":"mysql",
        "host":"localhost",
        "port":"3306",
        "user":"root",
        "password":"123",
    }
    

    12,编辑sql_api导入验证信息,内容如下:

    from  config import  settings
    
    def db_auth(configs):
        if configs.DATABASE["user"] == "root" and configs.DATABASE["password"] == "1123":
            print("数据库认证通过")
            return  True
        else:
            print("数据库认证失败")
    
    def select(table,column):
    
        if db_auth(settings):
            if table == "user":
                user_info = {
                    "001":["jack",28,"IT"],
                    "002":["tom",24,"IT"],
                    "003":["lyly",26,"IT"],
                }
                return  user_info
    

    13,测试,执行index主程序,会显示认证成功并返回查询到的数据库信息,如下:

    welcome to home page
    数据库认证通过
    query res: {'002': ['tom', 24, 'IT'], '003': ['lyly', 26, 'IT'], '001': ['jack', 28, 'IT']} 
    welcome to tv page
    

    14,如果没有认证通过,会显示以下信息

    welcome to home page
    数据库认证失败
    query res: None 
    welcome to tv page 

    三:系统标准模块:

    模块安装;

    需要提前解决依赖关系:

    yum install gcc

    yum install python-devel

    模块安装后会在sys.path定义的一目录当中,如:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages

    通过操作系统 安装:yum,pip,apt-get

    通过源码安装:下载源码,解压源码,进入目录,编译源码 python setup.py build,安装源码 python setup.py install

    安装一个模块:  

    # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
     
    # 下载安装 pycrypto
    wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz
    tar -xvf pycrypto-2.6.1.tar.gz
    cd pycrypto-2.6.1
    python setup.py build
    python setup.py install
     
    # 进入python环境,导入Crypto检查是否安装成功
    

    模块介绍

    time模块

    import  time
    def procedure(n):
        time.sleep(n)
    
    procedure(2)
    print(time.clock(),"返回处理器时间")
    
    procedure(3)
    print(time.process_time(),"返回处理器时间")
    
    
    1.2828922892186587e-06 返回处理器时间
    0.046800299999999996 返回处理器时间

     

    import  time
    print(time.ctime(time.time()-86640),"将时间戳时间转换为字符串格式的时间")
    print(time.gmtime(time.time()-86400),"#将时间戳转换成struct_time格式")
    print(time.localtime(time.time()-86640),"#将时间戳转换成struct_time格式,但返回的是本地时间")
    

    运行结果  

    Sun Feb 21 17:30:24 2016 将时间戳时间转换为字符串格式的时间
    time.struct_time(tm_year=2016, tm_mon=2, tm_mday=21, tm_hour=9, tm_min=34, tm_sec=24, tm_wday=6, tm_yday=52, tm_isdst=0) #将时间戳转换成struct_time格式
    time.struct_time(tm_year=2016, tm_mon=2, tm_mday=21, tm_hour=17, tm_min=30, tm_sec=24, tm_wday=6, tm_yday=52, tm_isdst=0) #将时间戳转换成struct_time格式,但返回的是本地时间
    
    import  time
    print(time.mktime(time.localtime()),"#与time.localtime()功能相反,将struct_time格式转回成时间戳格式")
    #time.sleep(2) #休眠2秒
    print(time.gmtime(),"time.gmtime()")
    print(time.strftime("%Y"))
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()),"#将struct_time格式转成指定的字符串格式")
    print(time.strptime("2016-02-22","%Y-%m-%d"),"#将字符串格式转换成struct_time格式")
    

    2.datetime 模块:

    import  time
    import  datetime
    print(datetime.date.today(),"#输出格式 2016-02-22")
    print(datetime.date.fromtimestamp(time.time()),"#2016-02-22 将时间戳转成日期格式") #2016-01-16 将时间戳转成日期格式
    
    import  datetime
    print(datetime.datetime.now(),"#输出当前的系统时间")
    print(datetime.datetime.now().timetuple(),"##返回struct_time格式")
    

      

    import  datetime
    current_time = datetime.datetime.now()
    print(current_time.replace(),"#当前时间")
    print(current_time.replace(2020,12,20,13,14,15),"#时间替换,可以传递年月日和时间进行与当前的时间替换,传递的时间将当前的时间替换")
    

      

    import  datetime
    str_to_date = datetime.datetime.strptime("83/10/21 12:10:59", "%y/%m/%d %H:%M:%S") #将字符串转换成日期格式
    print(str_to_date,"#将字符串转换成日期格式")
    new_date = datetime.datetime.now() + datetime.timedelta(days=15) #比现在加10天
    print(new_date,"#加15天")
    new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
    print(new_date,"#减10天")
    new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
    print(new_date,"#加10小时")
    new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
    print(new_date,"#加120秒")
     执行结果:

    3、random模块,生成随机的验证码:

    import random
    print(random.random(),"#随机生成小数点以后17位")
    print(random.randint(1,2),"#从1和2中随机生成")
    print(random.randrange(1,10),"#从1和10中随机生成") 

    随机生成6位数的验证码:

    import random
    checkcode = ''
    for i in range(6):
        current = random.randrange(0,9)
        if current != i:
            temp = chr(random.randint(65,90))
        else:
            temp = random.randint(0,9)
        checkcode += str(temp)
    print(checkcode)
    
    执行结果:
    GRHC09 

    4、OS模块:提供对操作系统进行调用的接口  

    import  os
    print(os.getcwd(),"获取当前python脚本的工作路径")
    os.chdir("test") #切换到目录,相当于shell的cd
    print(os.getcwd(),与上次的目录不一样了吧")
    print(os.curdir,"返回当前目录")
    print(os.pardir,"获取当前目录的父目录字符串名:('..')")
    
    import  os
    os.mkdir("pymkdir") #创建目录
    os.makedirs("1/2/3/4/5")  #创建多级目录
    os.rmdir("pymkdir") #删除单个目录
    os.removedirs("1/2/3/4/5") #删除父目录是空目录的目录,直到上级不是空目录
    
    os.mkfifo("test.txt") #Create a "fifo" (a POSIX named pipe)
    os.remove("test.txt") #删除一个文件
    os.rename("test.txt","test1.txt") #重命名
    print(os.stat("test1.txt"))  #获取文件信息
    

      

    import  os
    print(os.listdir("1"),"列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印")
    print(os.sep,"#输出操作系统特定的路径分隔符,win下为\,Linux下为/")
    print(os.linesep,"#输出当前平台使用的行终止符,win下为	
    ,Linux下为
    ")
    print(os.pathsep,"#输出用于分割文件路径的字符串")
    
    
    执行结果:
    ['2'] 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    / #输出操作系统特定的路径分隔符,win下为\,Linux下为/
     #输出当前平台使用的行终止符,win下为    ,Linux下为
    : #输出用于分割文件路径的字符串
    

      

    import  os
    print(os.name,"输出字符串指示当前使用平台。win->'nt'; Linux->'posix'")
    a = os.name
    if a == "posix":
        print("当前系统为linux")
    else:
        print("当前系统为windows")
    
    os.system("pwd") #直接运行shell命令
    print(os.environ,"获取系统环境变量")
    print(os.path.abspath("test.py"),"返回test.py规范化的绝对路径")
    

      

    import  os
    print(os.path.split("/var/log/httpd/access.log"),"将路径和文件分割,以元组显示结果")
    print(os.path.dirname("/var/log/httpd/access.log"),"返回path的目录。其实就是os.path.split(path)的第一个元素")
    print(os.path.basename("/var/log/httpd/access.log"),"返回最后的文件名")
    print(os.path.exists("/var/log/httpd/access.log"),"如果文件存在返回True,不存在返回False")
    
    import  os
    print(os.path.isabs("/tmp/ct.shutdown"),"判断是否绝对路径")
    print(os.path.isfile("/tmp/ct.shutdown"),"判断是否一个已经存在的文件")
    print(os.path.isdir("/tmp/ct.shutdown"),"判断是否一个已经存在的目录")
    print(os.path.join("/tmp/0123","123","234"),"将多个目录合并成绝对路径")
    

      

    import  os
    print(os.path.getatime("/etc/passwd"),"以时间戳返回path所指向的文件或者目录的最后存取时间")
    print(os.path.getmtime("/etc/passwd"),"以时间戳返回path所指向的文件或者目录的最后修改时间")
    print(os.popen("ls -l /").read()) #读取文件或执行命令并将结果返回 

    5.sys模块:用于提供对解释器相关的操作,sys模块提供了许多函数和变量来处理 Python 运行时环境的不同部分

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int值
    sys.path           多个目录之间只见调用模块的时候,尤其是深层次的模块调用浅层次的模块的时候要使用os.path.dirname(os.path.dirname(os.path.abspath(__file__)))这样的方法取得和浅层次文件同样的目录里面才可调用
    sys.platform 返回操作系统平台名称 
    sys.stdout.write('please:') #返回并统计输出的字符个数
    sys.stdin.readline()[2] #读取输入,并返回指定下标的元素
    

      

    >>> a = sys.stdin.readline()
    abcd    
    >>> a
    'abcd
    '
    >>> a = sys.stdin.readline()[:-1] #删除回车,即删除换行符
    
    abcd
    >>> a
    'abcd' 

    6.hashlib模块:

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

    python2.7使用md5模块:、

    import md5
    hash = md5.new()
    hash.update('admin')
    print hash.hexdigest()
    执行结果:
    21232f297a57a5a743894a0e4a801fc3 

    python3.5中使用hashlib模块:

    import  hashlib
    m = hashlib.md5()
    m.update(b"Hello")
    m.update(b"It's me")
    print(m.hexdigest())
    
    m.update(b"xxx")
    print(m.hexdigest())
    
    hash = hashlib.sha512()
    hash.update(b"xxx")
    print(hash.hexdigest())
     
    执行结果:
    5ddeb47b2f925ad0bf249c52e342728a
    5ecd493c71024e56b341b9f80eb119e3
    9057ff1aa9509b2a0af624d687461d2bbeb07e2f37d953b1ce4a9dc921a7f19c45dc35d7c5363b373792add57d0d7dc41596e1c585d6ef7844cdf8ae87af443f
    

      

    import hmac
    h = hmac.new(b'passwprd')
    h.update(b'password')
    print(h.hexdigest())
    
    执行结果:
    b6628c80a2b6954ddf9899e61bf30472 

    7.json和pickle模块:

    pickle模块:只适用于python的特定数据类型,即pickle 是python独有的,支持python里面的字典,字符串,函数等格式,pickle保存的格式其他语言是无法读取的,

    json dumps把数据类型转换成字符串,dump把数据类型转换成字符串并存储在文件中 ,loads把字符串转换成数据类型,load把文件打开从字符串转换成数据类型

    pickle同理

    现在有个场景在不同设备之间进行数据交换很low的方式就是传文件,dumps可以直接把服务器A中内存的东西发给其他服务器,比如B服务器、
    在很多场景下如果用pickle的话那A的和B的程序都的是python程序这个是不现实的,很多时候都是不同的程序之间的内存交换怎么办?就用到了json(和html类似的语言)
    并且josn能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用josn,是这样的josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。
    为什么他不能序列化上面的东西呢?因为josn是跨语言的!

    pickle使用方法如下:  

    #将数据dump到文件
    import pickle
    data = [123123453454456,{"K1":""},{"K2":"K3"}]
    with  open("data.txt","wb") as file1:
        pickle.dump(data,file1) #dunp是直接将文件dump到文件当中,和dumps方法不一样
        file1.write(pickle.dumps(data)) #需要用二进制文件的写入方式打开文件,然后将序列化以后的数据写入到文件,和dump写入文件的方法不同
    
    #从文件读取数据:
    import  pickle
    f = open("data.txt","rb")
    a = pickle.loads(f.readline())
    
    print(a)
    f.close()
    
    执行结果:
    [123123453454456, {'K1': ''}, {'K2': 'K3'}] 

    json:json是各种语言都支持的,json只支持字典格式,json是pyton与java等语言相互支持的。 

    import   json
    data = "123123453454456abcd"
    with open("data.json","w") as f:
        json.dump(data,f) #使用dump方法将data写入到打开的文件
        #f.write(json.dumps(data)) #使用文件write的方法将json序列号后的数据写入文件
        f.close()
    
    读取json文件:
    import  json
    readjson = json.load(open("data.json"))
    print(readjson)
    
    执行结果:
    123123453454456abcd 

     

     

     

     

    def home():    print("welcome to home page")
    def movie():    print("welcome to movie page")
    def tv():    print("welcome to tv page")

  • 相关阅读:
    移动端开发touchstart,touchmove,touchend事件详解和项目
    我对JVM的理解
    快速排序
    归并排序(Merge sort)
    希尔排序
    插入排序
    选择排序
    冒泡排序(Bubble Sort)
    java设计模式之单例模式
    Java中反射机制的理解
  • 原文地址:https://www.cnblogs.com/sunshine-1/p/7441949.html
Copyright © 2011-2022 走看看