• python之路-基础篇-第五周



    一、正则表达式(续)

    1.匹配IP地址

    
    import re
    a = "192.168.1.1"
    #m = re.search("(d{1,3}(.|)){4}", a)
    #m = re.search("d{1,3}.d{1,3}.d{1,3}.d{1,3}", a)
    m = re.search("(d{1,3}.){3}d{1,3}", a)
    print(m.group())
    

    2.匹配手机号

    
    import re
    str1 = "18651054604"
    m = re.search("1[345678]d{9}",str1)
    print(m.group())
    

    3.分组匹配

    
    import re
    contactInfo = 'Oldboy School, Beijing Changping Shahe: 010-8343245'
    match = re.search('([a-zA-Z ]+), ([a-zA-Z ]+): ([0-9- ]+)', contactInfo) #分组
    print(match.group())
    print(match.group(1))
    print(match.group(2))
    print(match.group(3))
    match = re.search('(?P<last>[a-zA-Z ]+), (?P<first>[a-zA-Z ]+): (?P<phone>[0-9- ]+)', contactInfo)
    print(match.group())
    print(match.group("last"))
    print(match.group("first"))
    print(match.group("phone"))
    
    
    执行结果:
    
    Oldboy School, Beijing Changping Shahe: 010-8343245
    
    Oldboy School
    
    Beijing Changping Shahe
    
    010-8343245
    
    Oldboy School, Beijing Changping Shahe: 010-8343245
    
    Oldboy School
    
    Beijing Changping Shahe
    
    010-8343245
    
    

    4.匹配email地址或网址

    
    import re
    email = "alex.li@126.com   http://www.oldboyedu.com"
    m = re.search("[0-9a-z.]{1,26}@[0-9a-z.]{1,10}.[a-z.]{1,6}",email)
    print(m.group())
    

    二、排序

    1.冒泡排序

    
    #冒泡
    data = [10,4,33,21,54,3,8,11,5,22,2,1,17,13,6]
    
    for j in range(1, len(data)):  #range(1,15)
    
        for i in range(len(data)-j):  #range(15-j)
            if data[i] > data[i+1]:
                tmp = data[i+1]         #交换位置
                data[i+1] = data[i]
                data[i] = tmp
    print(data)
    

    2.其他排序

    参考这里


    三、时间复杂度

    算法复杂度有两个要素,时间复杂度和空间复杂度。其中时间复杂度是指算法执行长度的度量,空间复杂度是算法占用内存空间的度量。

    参考文件:百度文库-时间频度与时间复杂度这里我们只简单阐述一下时间复杂度。

    1.时间频度(语句频度)

    T(n)

    2.时间复杂度(渐进时间复杂度)

    O(f(n)) --其中T(n)/O(f(n))=常数

    一般情况下:

    O(1)<O(log2n)<O(n)<O(n log2 n)<O(n2)<O(n3)<O(2^n)

    所以选择算法复杂度较小的算法。

    指数时间:

    O(2n)

    对数时间:

    O(logN)

    线性时间:

    O(n)

    常数时间:

    O(1)

    平方阶时间(或k次方阶时间)

    O(n2)

    O(n3)

    O(nk)


    四、模块

    1.模块介绍

    1)自定义模块

    如何自定义模块?

    • 弄一堆.py文件,按照一定方法分类,形成一个能够对外提供某些功能的东西;

    • 在python3.x中可不在文件夹中增加__init__.py文件,然而在python2.x中必须要有;

    自己搞一个模块:

    • 文件结构如下:

    jiegou

    • 各文件之间的关系

      • backend文件夹为后台服务相关,包括db和logic两个文件夹,分别处理数据库和逻辑相关的内容。

      • config文件夹为配置相关,有一个setting文件保存配置文件

      • frontend文件夹为前端相关,这里没写内容

      • user_mian.py文件为用户调用,模拟用户操作。

    这里用user_mian中简单调用一个backend中logic的handle文件中的一个home函数,而home函数调用sql_api文件模拟获取从数据库中获得文件,但是在登陆数据库时,模拟从config下setting文件中获取用户名和密码。这样就简单实现一个模块中多个py文件之间的相互调用。

    • sql_api.py
    
    from config import setting
    
    def auth(configs):
        if configs.DATABASE["user"] == "root" and configs.DATABASE["password"] == "123123":    #为了方便验证,就直接写死了
            print("welcom login database")
            return True
        else:
            print("error....")
    
    
    def select(name, age):
        res = auth(setting)
    
        if res:
            return name,age
    
    • handle.py
    
    from backend.db import sql_api
    
    
    def home():
        print("welcome to home page...")
        q_data = sql_api.select("alex", "123")
        print(q_data)
    
    
    def movie():
        print("welcome to movie page...")
    def tv():
        print("welcome to tv page...")
    
    • setting.py
    
    DATABASE = {
        "user":"root",
        "password":"123123",
        "host":"localhost",
        "port":3306,
    }
    
    • user_main.py
    
    from backend.logic import handle
    
    handle.home()
    

    执行user_mian.py后:

    
    welcome to home page...   #handle中home()函数
    
    welcom login database      #sql_api调用了auth(configs),使用setting中的字典验证数据库登陆
    
    ('alex', '123')    #sql_api调用select(name,age)函数
    
    

    2)标准模块(标准库)

    标准库好多,等下写几个刚用的。

    3)开源模块:pip下载

    在https://pypi.python.org/pypi可以下载开源模块

    pypi

    如何下载呢?

    
    比如下载xheap 0.6,打开链接,复制链接,使用pip即可。
    
    $pip https://pypi.python.org/pypi/xheap/0.6
    
    

    2.sys模块

    
    sys.argv           命令行参数List,第一个元素是程序本身路径
    
    sys.exit(n)        退出程序,正常退出时exit(0)
    
    sys.version        获取Python解释程序的版本信息
    
    sys.maxint         最大的Int值
    
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    
    sys.platform       返回操作系统平台名称
    
    sys.stdout.write('please:')    #标准输出文件,可以使用文件的其他操作,如write,flush等
    
    val = sys.stdin.readline()[:-1]  #默认最后会加一个空格,因此去掉
    
    print(val)
    
    
    
    #生成简单的进度条,依次显示10个#号
    
    import sys
    import time
    
    for i in range(10):
        sys.stdout.write("#")
        sys.stdout.flush()
        time.sleep(0.5)
    

    3.os模块

    
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')
    os.pardir  获取当前目录的父目录字符串名:('..')
    os.makedirs('dirname1/dirname2')    可生成多层递归目录
    os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()  删除一个文件
    os.rename("oldname","newname")  重命名文件/目录
    os.stat('path/filename')  获取文件/目录信息
    os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示
    os.environ  获取系统环境变量
    os.path.abspath(path)  返回path规范化的绝对路径
    os.path.split(path)  将path分割成目录和文件名二元组返回
    os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path)  返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)  如果path是绝对路径,返回True
    os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    

    4.random模块

    
    import random
    print(random.random())  #0-1的随机浮点数
    print(random.randint(1,2))  #1-2,包括1和2
    print(random.randrange(1,10))    #1-10,包括1不包括10
    
    
    #生成随机验证码,4位验证码
    
    import random
    check_words = ''
    for i in range(4):
        current = random.randrange(4)
        if check_words != i:
            check_words += str(chr(random.randint(65, 90)))
        else:
            check_words += str(random.randint(0, 9))
    
    print(check_words)
    

    5.time模块和datetime模块

    
    import time
    import datetime
    
    print(time.clock()) #返回处理器时间,3.3开始已废弃
    print(time.process_time()) #返回处理器时间,3.3开始已废弃
    print(time.time()) #返回当前系统时间戳
    print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
    print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
    print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
    print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
    print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
    #time.sleep(4) #sleep
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
    print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式
    
    #datetime module
    
    print(datetime.date.today()) #输出格式 2016-01-26
    print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
    current_time = datetime.datetime.now() #
    print(current_time) #输出2016-01-26 19:04:30.335935
    print(current_time.timetuple()) #返回struct_time格式
    
    #datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
    print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换
    
    str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
    new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
    new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
    new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
    new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
    print(new_date)
    
    
    
    
    

    6.json & pickle 模块

    用于序列化的两个模块

    • json,用于字符串 和 python数据类型间进行转换,多语言之间通用(如java,C#,python)

    • pickle,用于python特有的类型 和 python的数据类型间进行转换,可是使用的数据类型更多

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    
    #json 写
    
    import json
    f = open("data.txt",'w')
    dic1 = {
        "name": "alex",
        "age": 12,
        "job": "ITer"
    }
    
    # res = json.dumps(dic1)
    # f.write(res)
    # 等价于
    json.dump(dic1, f)
    
    f.close()
    
    
    #json 读
    
    import json
    f = open("data.txt",'r')  #使用字符串写入或读取
    #res = json.loads(f.read())
    # 等价于
    res = json.load(f)
    f.close()
    print(res)
    

    同样的pickle:

    
    import pickle
    f = open("data.txt",'wb')  #注意使用二进制来读写
    dic1 = {
        "name": "alex",
        "age": 12,
        "job": "ITer"
    }
    
    # res = pickle.dumps(dic1)
    # f.write(res)
    # 等价于
    pickle.dump(dic1, f)
    
    f.close()
    
    import pickle
    f = open("data.txt",'rb')  #使用二进制写入或读取
    #res = pickle.loads(f.read())
    # 等价于
    res = pickle.load(f)
    f.close()
    print(res)
    
    
    
    
    
  • 相关阅读:
    Windows Intune, 让企业 IT 如履平地
    如何利用 WinDbg 进行双机调试
    微软 Windows Intune 云托管服务试用
    如何安装从 Windows Update 目录下载的驱动程序
    启用特殊池解读 0x000000c5 蓝屏
    C# 配置文件修改的新方法
    Ribbon默认服务器功能区自定义位置
    Update list item using Linq to SharePoint
    TroubleShoot:分配对象查询的问题
    TroubleShoot:C#操作Excel的几个问题
  • 原文地址:https://www.cnblogs.com/felo/p/5172902.html
Copyright © 2020-2023  润新知