zoukankan      html  css  js  c++  java
  • Python生成器、迭代器和模块

    ---列表生成式:
    [x for x in range(10)]

    def f(n):
    return n*n*n
    a=[f(x) for x in range(10)]
    print(a)

    ---生成器(generator):
    生成器是一个可迭代对象(iterable),节省空间,调用生成器f()只会把生成器调入内存,而不会像函数那样去执行函数的内容;要想执行生成器,只能使用next(f()),而print(next(d()))是先执行生成器里的内容,然后返回yield的值。
    创建:
    1)
    s=(x for x in range(10))
    print(s) #<generator object <genexpr> at 0x0000025867321A98>
    print(next(s))
    for i in s:
    print(i)
    2)通过关键字yield创建
    def f():
    print('ok1')
    yield 1
    print('ok2')
    yield 2

    g=f() #把函数调入内存,生成生成器,但不会执行
    print(f) #<function f at 0x000002496B5A7F28>
    print(f()) #<generator object f at 0x0000018D1B1B1B48>
    next(g) #ok1
    注意:生成器在创建的时候就已经决定了嫩计算出值的个数,调用的次数超过这个值就会报StopIteration错误。
    print(next(g)) #ok2 2
    #循环打印函数f()
    for i in f():
    print(i) #ok1 1 ok2 2

    #普通函数:
    def f():
    return 1
    print(f) #<function f at 0x0000020EB0FA5048>
    print(f()) # 1

    对象拥有iter方法的称为可迭代对象。
    l=[1,2,3]
    l.__iter__()
    for i in l:
    print(i)
    t=(1,2,3)
    t.__iter__()
    d={'name':'123'}
    d.__iter__()

    #斐波那契数列引入生成器
    def fib(max):
    n,before,after=0,0,1
    while n<max:
    #print(after)
    yield before
    before,after=after,before+after
    # tmp=before
    # before=after
    # after=tmp+after
    n=n+1
    g=fib(6)
    print(g) #<generator object fib at 0x000001C4F7391BA0>
    print(next(g))

    #send方法:可以传值给yield前面的变量
    #第一次send前如果没有next,只能传send(None)
    def bar():
    print('ok1')
    count=yield 1
    print(count)

    oo=yield 2
    print(oo)

    b=bar()
    s=b.send(None) #next(b)第一次send前如果没有next,只能传send(None)
    print(s) #1
    ret=b.send('bb') #bb
    print(ret) #2
    =====================================================================================
    迭代器(iterator):
    满足迭代器协议:内部有iter方法,有next方法
    生成器都是迭代器,迭代器不一定是生成器

    #迭代器满足两个条件,有iter方法,有next方法
    #迭代器 list tuple dict string 都是可迭代对象(Iterable)

    l=[1,2,3]
    d=iter(l) #iter方法作用:返回迭代器对象
    print(d) #<list_iterator object at 0x0000020F0DD07278>

    print(next(d))
    print(next(d))

    #for 循环内部三件事:1 调用可迭代对象的iter方法,返回迭代器对象
    #2 不断调用迭代器的next方法,
    while:
    try:
    i=next(list_Iterator)
    except
    break
    3 处理StopIteration异常
    for i in [1,2,3]:
    iter([1,2,3])

    #isinstance 判断数据类型
    from collections import Iterator(迭代器),Iterable(迭代器对象)
    print(isinstance(2,list))
    l=[1,3,5]
    d=iter(l)
    print(d)
    print(isinstance(l,list))
    print(isinstance(l,Iterable))
    print(isinstance(d,Iterator))

    #使用文件读取,找出文件中最长的行
    print(max(len(x.strip()) for x in open('日志记录','r')))

    =====================================================================================模块:
    时间模块:
    import time
    #print(help(time))
    print(time.time()) #1518957450.2793381 时间戳 ****
    #time.sleep(3) ****
    print(time.clock()) #计算CPU执行的时间
    print(time.gmtime()) #结构化时间,世界标准时间(UTC)
    print(time.localtime()) #本地时间 ****
    struct_time=time.localtime()
    print(time.strftime('%Y--%m--%d %H:%M:%S',struct_time)) #字符串时间,把元祖形式改成自定义的格式 ****
    print(time.strptime('2018--02--18 21:16:41','%Y--%m--%d %H:%M:%S')) #把格式化时间转化为结构化时间 ****
    a=time.strptime('2018--02--18 21:16:41','%Y--%m--%d %H:%M:%S')
    print(a.tm_year)
    #时间表示方式:时间戳,结构化时间,格式换时间
    print(time.ctime()) #把时间戳转化为时间,默认为空
    print(time.mktime(time.localtime())) #结构化时间转换为时间戳

    import datetime
    print(datetime.datetime.now())
    =====================================================================================

    #random模块
    import random
    print(random.random())
    print(random.randint(1,8)) #1到8的整数,包括1和8
    print(random.choice('hello')) #随机选择
    print(random.sample(['123',4,[1,2]],2)) #从一个序列中随机选多次
    print(random.randrange(1,3)) #不包括3
    #生成随机验证码
    def v_code():
    code=''
    for i in range(5):
    # if random.randint(0,3):
    # add=random.randrange(10)
    # else:
    # add=chr(random.randrange(65,91))
    # code+=str(add)
    add=random.choice([random.randrange(10),chr(random.randrange(65,91))])
    code+=str(add)
    print(code)

    v_code()
    #==============================================================
    #OS模块
    #r(raw)是原生字符串
    import os
    print(os.getcwd()) #返回当前目录
    #os.chdir(r'D:') #改变当前工作目录
    #print(os.getcwd())
    print(os.curdir) #放回当前目录
    print(os.pardir) #返回上级目录
    #os.makedirs('abc\alex') #创建多个目录
    #os.removedirs('abc\alex') #删除多个空的目录
    #os.mkdir('pp') #生成当个目录
    #os.rmdir('pp')
    #print(os.listdir(r'E:资源PyProweek1')) #把指定路径文件的列表展示出来
    #os.remove('ff') #只能删除文件,不能删除文件夹
    #os.rename('oldname','newname') #重命名文件或文件夹
    # file=os.stat('.\newname')
    # print(os.stat('.\newname')) #获取文件/目录信息
    # print(file.st_size)
    # print(os.sep) #文件分隔符,Windows是\,Linux是/
    # os.linesep #换行分隔符
    print(os.pathsep) #环境变量的分隔符
    #os.system("bash command") #运行shell命令,直接显示
    print(os.environ) #打印环境变量
    print(os.path.abspath('./newname')) #获取绝对路径
    print(os.path.split('E:资源PyProweek1\newnam')) # 将path分割成目录和文件名二元组返回
    print(os.path.dirname('E:资源PyProweek1\newname')) #返回path的目录。其实就是os.path.split(path)的第一个元素
    print(os.path.basename('E:资源PyProweek1\newname')) #返回path最后的文件名
    print(os.path.exists('path')) #如果path存在,返回True;如果path不存在,返回False
    #os.path.join('path1[, path2[, ...]]') #路径拼接
    #os.path.getatime('path') #返回path所指向的文件或者目录的最后存取时间
    #os.path.getmtime('path') #返回path所指向的文件或者目录的最后修改时间
    #===================================================================
    #sys模块(与Python解释器交互)
    import sys
    print(sys.argv) #命令行参数List,第一个元素是程序本身路径
    # sys.exit(0) #退出程序,正常退出时exit(0)
    print(sys.path) #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    print(sys.platform) #返回操作系统平台名称
    sys.stdout.write('please:') #标准输出
    #====================================================================
    #hashlib 加密
    import hashlib
    m=hashlib.md5()
    print(m)

    m.update('hello world'.encode('utf8'))
    print(m.hexdigest())
    m.update('alex'.encode('utf8'))
    print(m.hexdigest())
    m2=hashlib.md5()
    m2.update('hello worldalex'.encode('utf8'))
    print(m2.hexdigest())

    s=hashlib.sha3_256()
    s.update('hello world'.encode('utf8'))
    print(s.hexdigest())
    #==============================================================
    #logging模块
    import logging
    #日志有级别
    # logging.debug('debug message')
    # logging.info('info message')
    # logging.warning('warning message')
    # logging.error('error message')
    # logging.critical('critical message')

    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a,%d %b %Y %H:%M:%S',
    filename='test.log',
    filemode='a')

    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')

    logger = logging.getLogger()
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('test.log')
    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
    logger.addHandler(ch)

    #为logger设置日志级别
    logger.setLevel(logging.DEBUG)

    logger.debug('logger debug message')
    logger.info('logger info message')
    logger.warning('logger warning message')
    logger.error('logger error message')
    logger.critical('logger critical message')

    #====================================================================================
    #configparser模块
    import configparser
    config = configparser.ConfigParser()
    # config["DEFAULT"] = {'ServerAliveInterval': '45',
    # 'Compression': 'yes',
    # 'CompressionLevel': '9'}
    # config['bitbucket.org'] = {'User':'hg'}
    # config['topsecret.server.com'] = {}
    # topsecret = config['topsecret.server.com']
    # topsecret['Host Port'] = '50022' # mutates the parser
    # topsecret['ForwardX11'] = 'no' # same here
    # config['DEFAULT']['ForwardX11'] = 'yes'
    # with open('example.ini', 'w') as configfile:
    # config.write(configfile)
    #读取操作
    config.read('example.ini')
    #不能读取默认的项
    print(config.sections())
    #取到默认的项的内容
    print(config.defaults())
    print(config['bitbucket.org']['user'])
    #打印其他块的时候,默认块下的内容也一并打印出来
    for key in config['bitbucket.org']:
    print(key)
    #删除操作
    config.remove_section('topsecret.server.com')
    print(config.has_section('topsecret.server.com'))
    #修改操作
    config.set('bitbucket.org','user','alex')
    #==删除某个模块下的内容
    config.remove_option('bitbucket.org','user')
    config.write(open('i.cfg', "w"))

  • 相关阅读:
    多线程编程(二)--进程&amp;&amp;线程
    hdu2222 Keywords Search
    sqlserver 运行正則表達式,调用c# 函数、代码
    【Nutch2.2.1基础教程之2.2】集成Nutch/Hbase/Solr构建搜索引擎之二:内容分析
    ios学习之block初探
    PHP GD 生成图片验证码+session获取储存验证码
    ps 命令详解
    python --subprocess
    python --存储对象
    python --字符串格式化
  • 原文地址:https://www.cnblogs.com/cxli99/p/8454397.html
Copyright © 2011-2022 走看看