• 常用模块


    time模块

    time模块:支持三种不同形式的时间,不同形式的时间之间可以转换

    1. 时间戳

    时间戳:时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。

    import time
    
    print(time.time())
    
    # 1566200008.393285
    

    2. 格式化时间

    格式化时间:格式化时间表示的普通的字符串格式的时间。

    import time
    
    print(time.strftime('%Y-%m-%d %X'))
    
    # 2019-08-19 15:35:12
    

    3. 结构化时间

    结构化时间:结构化时间共有9个元素,分别为(年,月,日,时,分,秒,一年中的第几周,一年中的第几天,夏令时)

    import time
    
    print(time.localtime()) # 当地时间(中国时间)
    print(time.gmtime()) # 标准时间
    
    # time.struct_time(tm_year=2019, tm_mon=8, tm_mday=19, tm_hour=15, tm_min=36, tm_sec=51, tm_wday=0, tm_yday=231, tm_isdst=0)
    # time.struct_time(tm_year=2019, tm_mon=8, tm_mday=19, tm_hour=7, tm_min=36, tm_sec=51, tm_wday=0, tm_yday=231, tm_isdst=0)
    

    4. 不同格式时间的转换

    4.1结构化时间转格式化时间
    import time
    print(time.strftime('%Y-%m-%d %X', time.localtime()))
    
    4.2格式化时间转结构化时间
    import time
    print(time.strptime('2019-08-19 15:35:12', '%Y-%m-%d %X'))
    
    4.3结构化时间转时间戳
    import time
    print(time.mktime(time.localtime()))
    
    4.4时间戳转结构化时间
    import time
    print(time.localtime(time.time()))
    

    5. 常用方法

    import time
    
    time.time()
    time.sleep() # 睡眠
    

    datetime模块

    datetime模块:时间的修改

    1. 返回当前时间

    import datetime
    
    print(datetime.datetime.now())
    
    # 2019-08-19 15:48:19.687491
    

    2. 修改时间

    # 当前时间+3天,默认修改天数
    import datetiem
    
    print(datetime.datetime.now() + datetime.timedelta(3))
    
    # 2019-08-22 15:50:31.875349
    
    # 小时/分钟等其他的时间的修改,要加上对应的参数
    print(datetime.datetime.now() + datetime.timedelta(hours=3))
    

    random模块

    1. 常用方法

    1.1 random.random()

    import random
    
    # 打印一个大于0且小于1的
    print(random.random())
    
    # 0.49588168191947324
    

    1.2 random.randint()

    import random
    
    # 打印一个大于等于0且小于等于3的整数
    print(random.randint(0, 100))
    
    # 60
    

    1.3 random.shuffle()

    import random
    
    lt = [1, 2, 3, 4, 5]
    # 打乱容器类元素的顺序
    random.shuffle(lt)
    print(lt)
    
    # [1, 3, 2, 5, 4]
    

    2. 了解

    2.1 random.randrange()

    import random
    
    # 打印一个大于等于1且小于10的整数
    print(random.randrange(1, 10))
    
    # 1
    

    2.2 random.uniform()

    import random
    
    # 打印一个大于1且小于3的小数
    print(random.uniform(1, 3))
    
    # 1.716845798263477
    

    2.3 random.choice()

    import random
    
    # 打印列表内的任意一个元素
    print(random.choice([1, 2, 3, 4, 'a', 'b']))
    
    # 4
    

    2.4 random.sample()

    import random
    
    # 打印列表内n个元素的组合,例如n=2
    print(random.sample([1, 2, 3, 4, 'a', 'b'], 2))
    
    # ['a', 'b']
    

    os模块

    os模块:与操作系统交互,可以操作文件

    1. 常用方法

    1.1 os.listdir()

    import os
    
    # 列出文件夹内所有的文件
    res = os.listdir(r'F:studyPyCharmPyCharm文件')
    print(res)
    
    

    1.2 os.path.join()

    import os
    
    # 拼接地址
    res = os.path.join(r'F:studyPyCharmPyCharm文件', 'os模块')
    print(res)
    
    

    1.3 os.path.dirname()

    import os
    
    # 获取上一级目录
    print(os.path.dirname(__file__))
    
    

    1.4 os.path.abspath()

    import os
    
    # 获取文件的绝对路径
    print(os.path.abspath(__file__))
    
    

    sys模块

    sys模块:与python解释器交互

    import sys
    
    print(sys.argv) # 用cmd执行python文件的时候才能获取参数
    print(sys.path) # 获取环境变量
    

    json和pickle模块

    1. 序列化:将python的数据类型(字典最常用)变成json串

    2. 反序列化:将json串读成python的数据类型(字典最常用)

    json模块

    json模块:支持跨平台,常用的有字典和列表

    import json
    
    dic = {'a': 1}
    
    # 在内存中转换
    data = json.dumps(dic)
    data = json.loads(data)
    
    # 在文件中转换
    with open() as fw:
        json.dump(dic, fw)
    with open() as fr:
        data = json.load(fr)
    

    pickle模块

    pickle模块:可以序列化python中的所有对象,但是无法跨平台

    import pickle
    
    dic = {'a': 1}
    
    # 在内存中转换
    data = pickle.dumps(dic)
    data = pickle.loads(data)
    
    # 在文件中转换
    with open() as fw:
        pickle.dump(dic, fw)
    with open() as fr:
        data = pickle.load(fr)
    

    hashlib和hmac模块

    hashlib模块

    hashlib模块:密码加密

    import hashlib
    
    m = hashlib.md5()
    m.update(b'123456')
    print(m.hexdigest())
    

    特点:

    1. 变成固定的字符串
    2. 相同的字符串哈希后结果一样
    3. 叠加性

    hmac模块

    hmac模块:密码加密,可以加盐处理

    import hmac
    
    m = hmac.new(b'123')
    m.update(b'123456')
    print(m.hexdigest())
    

    logging模块

    logging模块:日志

    import logging
    
    # 1.生成logger对象
    logger = logging.getLogger('xiaowu')
    
    # 2.格式
    formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',)
    formmater2 = logging.Formatter('%(asctime)s :  %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',)
    formmater3 = logging.Formatter('%(name)s %(message)s',)
    
    # 3.打印对象
    h1 = logging.FileHandler('h1.log')
    h2 = logging.StreamHanfler
    
    # 4.对象对象绑定格式
    h1.setFormatter(formmater1)
    h2.setFormatter(formmater2)
    
    # 5.logger绑定打印对象
    logger.addHandler(h1)
    logger.addHandler(h2)
    
    # 6.设置级别
    logger.setLevel(30)
    
    logger.debug('debug')
    logger.info('info')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')
    

    配置日志文件

    import os
    import logging.config
    
    # 定义三种日志输出格式 开始
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]'  # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    # 定义日志输出格式 结束
    
    logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录,需要自定义文件路径 # atm
    logfile_dir = os.path.join(logfile_dir, 'log')  # C:UsersoldboyDesktopatmlog
    
    logfile_name = 'log.log'  # log文件名,需要自定义路径名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):  # C:UsersoldboyDesktopatmlog
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)  # C:UsersoldboyDesktopatmloglog.log
    # 定义日志路径 结束
    
    # log配置字典
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},  # filter可以不定义
        'handlers': {
            # 打印到终端的日志
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            # 打印到文件的日志,收集info及以上的日志
            'default': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M  (*****)
                'backupCount': 5,
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        'loggers': {
            # logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
            '': {
                # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'handlers': ['default', 'console'],
                'level': 'DEBUG',
                'propagate': False,  # 向上(更高level的logger)传递
            },
        },
    }
    
    
    
    def load_my_logging_cfg():
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
        logger = logging.getLogger(__name__)  # 生成一个log实例
        logger.info('It works!')  # 记录该文件的运行状态
        
        return logger
    
    
    if __name__ == '__main__':
        load_my_logging_cfg()
    

    numpy模块

    numpy模块:专门进行数组(矩阵)的运算

    一、创建numpy数组

    numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。

    import numpy as np
    
    # 创建一维的ndarray对象
    print(np.array([1, 2, 3]))
    
    # 创建二维的ndarray对象
    print(np.array([[1, 2, 3], [4, 5, 6]]))
    
    # 创建三维的ndarray对象
    print(np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
    # 三维不要使用numpy模块,使用Tensorflow/pytorch模块
    

    二、numpy数组的常用属性

    属性 解释
    T 数组的转置(对高维数组而言)
    dtype 数组元素的数据类型
    size 数组元素的个数
    ndim 数组的维数
    shape 数组的维度大小(以元组的形式)
    astype 类型转换
    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr)
    
    # [[1 2 3]
    #  [4 5 6]]
    
    print(arr.T)
    
    # [[1 4]
    #  [2 5]
    #  [3 6]]
    
    print(arr.dtype)
    
    # int32
    
    print(arr.size)
    
    # 6
    
    print(arr.ndim)
    
    # 2
    
    print(arr.shape)
    
    # (2, 3)
    
    arr = arr.astype(np.float32)
    print(arr)
    
    # [[1. 2. 3.]
    #  [4. 5. 6.]]
    

    三、切割numpy数组

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr) #二维的numpy数组(一般就是二维) 
    
    # [[1 2 3]
    #  [4 5 6]]
    print(arr[:, :])
    
    # [[1 2 3]
    #  [4 5 6]]
    
    print(arr[0:1, :])
    
    # [[1 2 3]]
    
    print(arr[0:1], [0:1])
    
    # [[1]]
    
    print(arr[0, :])
    
    # [1, 2, 3]
    
    print(arr[0, 0], type(arr[0, 0]))
    
    # 1 <class 'numpy.int32'>
    
    print(arr[0, [0, 2]])
    
    # [1 3]
    

    四、numpy数组元素替换

    import numpy as np
    
    arr = np.array([1, 2, 3], [4, 5, 6])
    print(arr)
    
    # [[1 2 3]
    #  [4 5 6]]
    
    arr[0, :]
    print(arr)
    
    # [[0 0 0]
    #  [4 5 6]]
    
    arr[1, 1] = 1
    print(arr)
    
    # [[0 0 0]
    #  [4 1 6]]
    
    arr[arr < 3] = 3
    print(arr)
    
    # [[3 3 3]
    #  [4 3 6]]
    

    五、numpy数组的合并

    import numpy as np
    
    arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型
    arr2 = np.array([[7, 8, 9], [10, 11, 12]])
    
    print(np.hstack((arr1, arr2))) # 行合并
    
    # [[ 1  2  3  7  8  9]
    #  [ 4  5  6 10 11 12]]
    
    print(np.vstack((arr1, arr2))) # 列合并
    
    # [[ 1  2  3]
    #  [ 4  5  6]
    #  [ 7  8  9]
    #  [10 11 12]]
    
    print(np.concatenate((arr1, arr2))) # 默认列合并
    
    # [[ 1  2  3]
    #  [ 4  5  6]
    #  [ 7  8  9]
    #  [10 11 12]]
    
    print(np.concatenate((arr1, arr2), axis=1)) # 1表示行;0表示列
    
    # [[ 1  2  3  7  8  9]
    #  [ 4  5  6 10 11 12]]
    
    

    六、通过函数创建numpy数组

    方法 详解
    array() 将列表转换为数组,可选择显式指定dtype
    arange() range的numpy版,支持浮点数
    linspace() 类似arange(),第三个参数为数组长度
    zeros() 根据指定形状和dtype创建全0数组
    ones() 根据指定形状和dtype创建全1数组
    eye() 创建单位矩阵
    empty() 创建一个元素全随机的数组
    reshape() 重塑形状

    七、numpy数组运算

    运算符 说明
    + 两个numpy数组对应元素相加
    - 两个numpy数组对应元素相减
    * 两个numpy数组对应元素相乘
    / 两个numpy数组对应元素相除,如果都是整数则取商
    % 两个numpy数组对应元素相除后取余数
    **n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方

    八、numpy数组运算函数

    numpy数组函数 详解
    np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)sin(x)
    np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)cos(x)
    np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)tan(x)
    np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)arcsin(x)
    np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)arccos(x)
    np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)arctan(x)
    np.exp(arr) 对numpy数组arr中每个元素取指数函数,exex
    np.sqrt(arr) 对numpy数组arr中每个元素开根号x−−√

    九、numpy.random生成随机数

    函数名称 函数功能 参数说明
    rand(d0,d1,⋯,dnd0,d1,⋯,dn) 产生均匀分布的随机数 dndn为第n维数据的维度
    randn(d0,d1,⋯,dnd0,d1,⋯,dn) 产生标准正态分布随机数 dndn为第n维数据的维度
    randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
    random_sample([size]) 在[0,1)[0,1)内产生随机数 size为随机数的shape,可以为元祖或者列表
    choice(a[, size]) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
    uniform(low,high [,size]) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
    shuffle(a) 与random.shuffle相同 a为指定数组

    pandas模块

    pandas模块:更多的是excel/csv文件处理,对numpy+xlrd模块做了一层封装

    一、DataFrame(多维)属性

    属性 详解
    dtype是 查看数据类型
    index 查看行序列或者索引
    columns 查看各列的标签
    values 查看数据框内的数据,也即不含表头索引的数据
    describe 查看数据每一列的极值,均值,中位数,只可用于数值型数据
    transpose 转置,也可用T来操作
    sort_index 排序,可按行或列index排序输出
    sort_values 按数据值来排序

    二、DataFrame取值

    1. 通过columns取值

    2. loc(通过行标签取值)

    3. iloc(类似于numpy数组取值)

    4. 使用逻辑判断取值

    三、DataFrame值替换

    df.iloc[0:3, 0:2] = 0   # 把0赋值给0到3列,0到2行的值
    df['c3'] > 10   # 判断c3列的值是否大于10,大于返回True,小于返回False
    

    四、读取CSV文件

    import pandas as pd
    from io import StringIO
    test_data = '''
    5.1,,1.4,0.2
    4.9,3.0,1.4,0.2
    4.7,3.2,,0.2
    7.0,3.2,4.7,1.4
    6.4,3.2,4.5,1.5
    6.9,3.1,4.9,
    ,,,
    '''
    
    test_data = StringIO(test_data)
    df = pd.read_csv(test_data, header=None)
    df.columns = ['c1', 'c2', 'c3', 'c4']
    df
    

    五、处理丢失数据

    df.dropna(axis=0)   # axis=0删除有NaN值的行
    df.dropna(axis=1)   # axis=1删除有NaN值的列
    df.dropna(how='all')   # 删除全为NaN值的行或列
    df.dropna(thresh=4)   # 删除没有四个值的行
    df.dropna(subset=['c2'])   # 删除c2中有NaN值的行
    df.fillna(value=10)   # 填充NaN值
    

    六、合并数据

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame(np.zeros((3, 4)))
    
    df2 = pd.DataFrame(np.ones((3, 4)))
    
    pd.concat((df1, df2), axis=0)   # axis=0合并列
    pd.concat((df1, df2), axis=1)   # axis=1合并行
    df1.append(df2)   # append只能合并列
    

    七、导入导出数据

    使用df=pd.read_excel(filename)读取数据,使用df.to_excel(filename)保存文件

    7.1 读取文件导入数据

    读取文件导入数据函数主要参数:

    参数 详解
    sep 指定分隔符,可用正则表达式如's+'
    header=None 指定文件无行名
    name 指定列名
    index_col 指定某列作为索引
    skip_row 指定跳过某些行
    na_values 指定某些字符串表示缺失值
    parse_dates 指定某些列是否被解析为日期,布尔值或列表

    7.2 写入文件导出数据

    写入文件函数的主要参数:

    参数 详解
    sep 分隔符
    na_rep 指定缺失值转换的字符串,默认为空字符串
    header=False 不保存列名
    index=False 不保存行索引
    cols 指定输出的列,传入列表

    matplotlib模块

    matplotlib模块:画图

    条形图

    import matplotlib.pyplot as plt # 默认支持英文,不支持中文
    classes = ['3grade','4grade','5grade','6grade']
    students = [50,60,55,67]
    
    ind = range(len(classes))
    plt.bar(ind,students,color='darkblue')
    plt.xticks(ind,classes)
    plt.show()
    

    直方图

    import matplotlib.pyplot as plt
    import numpy as np
    
    mu1, mu2, sigma = 50, 100, 10
    
    x1 = mu1 + sigma * np.random.randn(100000)
    x2 = mu2 + sigma * np.random.randn(100000)
    
    fig = plt.figure()
    
    ax1 = fig.add_subplot(1, 2, 1)
    ax1.hist(x1, bins=50, color='yellow')
    ax1.set_title('yellow',)
    
    ax2 = fig.add_subplot(1, 2, 2)
    ax2.hist(x2, bins=100, color='green')
    ax2.set_title('green')
    
    plt.show()
    

    折线图

    import matplotlib.pyplot as plt
    import numpy as np
    
    x1 = np.random.randn(1, 40).cumsum()
    x2 = np.random.randn(1, 40).cumsum()
    x3 = np.random.randn(1, 40).cumsum()
    x4 = np.random.randn(1, 40).cumsum()
    
    plt.plot(x1, marker='o', color='r', label='红线', linestyle='--')
    plt.plot(x2, marker='*', color='y', label='黄线', linestyle='-.')
    plt.plot(x3, marker='s', color='green', label='绿色', linestyle=':')
    plt.plot(x4, marker='x', color='b', label='蓝色', linestyle='-')
    
    plt.show()
    
    

    散点图+直线图

    import matplotlib.pyplot as plt
    import numpy as np
    
    font = FontProperties(fname='D:msyh.ttc')
    
    x1 = np.arange(1,20,2)
    
    y = x1**2
    
    plt.scatter(x1,y,s=100)
    plt.show()
    

    re模块

    re模块:从字符串里找特定的字符

    一、re模块的基本语法(匹配规则):

    1. ^:开头

      import re
      
      s = '人生苦短,python是岸'
      print(re.findall('^人生', s))
      
      # ['人生']
      
    2. $:结尾

      import re
      
      s = '人生苦短,python是岸'
      print(re.findall('是岸$', s))
      
      # ['是岸']
      
    3. []:匹配[]中间的字符,只要单个字符

      import re
      
      s = 'abcdefabcd'
      print(re.findall('[ef]', s))
      
      # ['e', 'f']
      
    4. []+^联用:^对[]内的元素取反

      import re
      
      s = 'abcdefabcd'
      print(re.findall('[^ef]', s))
      
      # ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd']
      
    5. .:任意字符(除了 )

      import re
      
      s = 'abcdaaadef'
      print(re.findall('a.', s))
      
      # ['ab', 'aa', 'ad']
      
      print(re.findall('a..', s))
      
      # ['abc', 'aaa']
      
    6. *:前面的字符0-无穷个

      import re
      
      s = 'abaacaaa'
      print(re.findall('a*', s))
      
      # ['a', '', 'aa', '', 'aaa', '']
      
    7. +:前面的字符1-无穷个

      import re
      
      s = 'abaacaaa'
      print(re.findall('a+', s))
      
      # ['a', 'aa', 'aaa']
      
    8. ?:前面的字符0-1个

      import re
      
      s = 'abaacaaa'
      print(re.findall('a?', s))
      
      # ['a', '', 'a', 'a', '', 'a', 'a', 'a', '']
      
    9. {m}:前面的字符m个

      import re
      
      s = 'abaacaaa'
      print(re.findall('a{3}', s))
      
      # ['aaa']
      
    10. {n,m}:前面的字符n-m个

      import re
      
      s = 'abaacaaa'
      print(re.findall('a{2,3}', s))
      
      # ['aa', 'aaa']
      
    11. d:数字

      import re
      
      s = 's1+s2=s3'
      print(re.findall('d', s))
      
      # ['1', '2', '3']
      
    12. D:非数字

      import re
      
      s = 's1+s2=s3'
      print(re.findall('D', s))
      
      # ['s', '+', 's', '=', 's']
      
    13. w:数字/字母/下划线

      import re
      
      s = 's 1 + s2
       = _ s3'
      print(re.findall('w', s))
      
      # ['s', '1', 's', '2', '_', 's', '3']
      
    14. W:非数字/字母/下划线

      import re
      
      s = 's 1 + s2
       = _ s3'
      print(re.findall('W', s))
      
      # [' ', ' ', '+', ' ', '
      ', ' ', '=', ' ', ' ']
      
    15. s:空格/ /

      import re
      
      s = 's 1 + s2
       = _ s3'
      print(re.findall('s', s))
      
      [' ', ' ', ' ', '
      ', ' ', ' ', ' ']
      
    16. S:非空格/ /

      import re
      
      s = 's 1 + s2
       = _ s3'
      print(re.findall('S', s))
      
      ['s', '1', '+', 's', '2', '=', '_', 's', '3']
      
    17. :取消意义

      import re
      
      s = 'abad'
      print(re.findall(r'a\d', s))
      
      # ['a\d']
      
    18. .*:贪婪模式(最大化),,找到继续找,让结果最大化

      import re
      
      s = 'abbcabc'
      print(re.findall('a.*c', s))
      
      # ['abbcabc']
      
    19. .*?:非贪婪模式(最小化),找到就马上停止

      import re
      
      s = 'abbcabc'
      print(re.findall('a.*?c', s))
      
      # ['abbc', 'abc']
      
    20. ():只要括号内的

      import re
      
      s = 'abacad'
      print(re.findall('a(.)', s))
      
      # ['b', 'c', 'd']
      
    21. A|B:A和B都要

      import re
      
      s = 'abacad'
      print(re.findall('a|b', s))
      
      # ['a', 'b', 'a', 'a']
      

    二、re模块的方法

    修饰符 描述
    re.I 使匹配对大小写不敏感
    re.L 做本地化识别(locale-aware)匹配
    re.M 多行匹配,影响 ^ 和 $
    re.S 使 . 匹配包括换行在内的所有字符
    re.U 根据Unicode字符集解析字符。这个标志影响 w, W, , B.
    re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
    1. re.compile():早期修饰符只能放在compile里面,现在可以直接加在findall()里面

    2. re.findall():打印所有值

      import re
      
      s = '123abc456
      def789'
      print(re.findall('d+', s))
      
      # ['123', '456', '789']
      
    3. re.mathch():从开头开始搜索,搜索到了就有,没搜索到就放回None

      import re
      
      s = '123abc456
      def789'
      res = re.mathch('d+', s)
      print(res.group()) # 拿到返回值并使用.group进行打印
      
      # 123
      
    4. re.search():搜索第一个匹配结果,找到了就不找了

      import re
      
      s = '123abc456
      def789'
      res = re.search('d+', s)
      print(res.group()) # 拿到返回值并使用.group进行打印
      
      # 123
      
    5. re.split():按照匹配规则切割

      import re
      
      s = 'abc123def456ghi789jk'
      print(re.split('d+', s))
      
      # ['abc', 'def', 'ghi', 'jk']
      
    6. re.sub():按照匹配规则替换

      import re
      
      s = 'abc123def456ghi789jk'
      print(re.sub('d+', '**', s))
      
      # abc**def**ghi**jk
      
    7. re.subn():按照匹配规则替换,并计数

      import re
      
      s = 'abc123def456ghi789jk'
      print(re.subn('d+', '**', s))
      
      # ('abc**def**ghi**jk', 3)
      
    8. 分组:一个括号里的叫一个分组

      import re
      
      s = 'abc123edf456'
      res = re.search('abc(?P<abc>d+)edf(?P<edf>d+)', s)
      print(res.groupdict())
      
      # {'abc': '123', 'edf': '456'}
      

    typing模块

    typing模块:提供了Generator(生成器类型),Iterable(可迭代类型),Iterator(迭代器类型)三种数据类型,限制函数

    typing模块的作用

    1. 类型检查,防止运行时出现参数和返回值类型不符合。
    2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
    3. 该模块加入后并不会影响程序的运行,不会报正常的错误,只有提醒。

    collections模块

    collections模块:复杂的数据类型

    1. 有名元组

    可以用属性而不是索引来引用tuple的某个元素

    from collections import namedtuple
    
    point = namedtuple('point',['x', 'y'])
    p = point(1, 2)
    print(p.x)
    print(p.y)
    
    # 1
    # 2
    

    2. 默认字典

    当key不存在的时候,会返回一个默认值

    from collections import defaultdict
    
    dic = defaultdict(lambda: 'NaN')
    dic['a'] = 1
    print(dic['a'])
    print(dic['c'])
    
    # 1
    # NaN
    

    3. 双端队列

    可以追加或删除头部元素

    from collections import depue
    
    de = deque([1, 2, 3])
    de.append(4)
    print(de)
    de.appendleft(0)
    print(de)
    de.popleft()
    print(de)
    
    # deque([1, 2, 3, 4])
    # deque([0, 1, 2, 3, 4])
    # deque([1, 2, 3, 4])
    

    4. 计数器

    可以统计字符出现的个数

    from collections import Counter
    
    s = 'programming'
    c = Counter()
    for i in s:
        c[i] += 1
    print(c)
    
    # Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
    
  • 相关阅读:
    Django 项目试炼blog(8) -- 评论树的显示
    Django 项目试炼blog(7) -- 文章详情页2 -- 前端样式的继承与楼评论显示
    Django 项目试炼blog(6) -- 文章详情页1 -- 点赞功能
    Django 项目试炼blog(5) -- 个人站点的搭建
    Django 项目试炼blog(4)--blog主页的搭建以及admin的使用
    Django 项目试炼blog(3)--基于Form组件ajax用户注册
    Django 项目试炼blog(2)--用户登陆验证
    Django 项目试炼blog(1)
    Django 基于form与ajax发送文件
    Django 分页器制作
  • 原文地址:https://www.cnblogs.com/yunluo/p/11414970.html
Copyright © 2020-2023  润新知