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"))

原文地址:https://www.cnblogs.com/cxli99/p/8454397.html