0 安装环境
- 使用PyCharm打开项目时,默认是base环境,如果自定义了环境,需要修改Python Interpreter。
0.1 pip相关
0.1.1 pip不是内部命令问题
- 查看是否添加环境变量,没有则添加
将C:\Program Files (x86)\Python\Python36-32\Scripts添加到环境变量Path中
原文链接:https://blog.csdn.net/wochunyang/article/details/52312370
0.1.2 更换国内pip源
- 详见博客:Python 更换国内pip源
0.1.3 更新pip
python -m pip install --upgrade pip
0.1.4 CentOS 7.x 下载 Python 3.8.x
1 基本语法
1.1 查看变量类型,type()
1.2 前缀操作与*
*
和 **
的用法包括:
- 使用
*
和**
向函数传递参数 - 使用
*
和**
捕捉传递至函数的参数 - 使用
*
接受 keyword-only 参数 - 使用
*
捕捉元组解包过程中的项 - 使用
*
将可迭代对象解包至列表/元组 - 使用
**
将字典解包至其他字典
1.3 argparse参数解析
1.3.1 Namespace与dict互转
import argparse
# dict => Namespace
dic = dict(a=1, b=2)
args = argparse.Namespace(**dict)
# Namespace => dict
dic = vars(args)
1.4 判断类型,type() 与 isinstance()
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
isinstance(obj, str)
type(obj)
1.5 @ 装饰器或者矩阵乘法matmul
1.6 返回不可变集合,frozenset()
2 文件操作
2.1 创建文件和文件夹
2.1.1 创建文件夹
### 创建文件夹
import os
def mkdir(path):
if not os.path.exists(path): #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) #makedirs 创建文件时如果路径不存在会创建这个路径
print("--- new folder... ---")
print("--- OK ---")
else:
print "--- There is this folder! ---"
file_path = "G:\\xxoo\\test"
mkdir(file_path) #调用函数
import os
folder = os.getcwd()[:-4] + 'new_folder\\test\\'
#获取此py文件路径,在此路径选创建在new_folder文件夹中的test文件夹
if not os.path.exists(folder):
os.makedirs(folder)
2.1.2 创建文件
import os
file = open('C:\\Users\Administrator\\Desktop\\' + 'new' + '.txt','w')
file.close()
2.2 获取文件路径
2.2.1 获取.py文件路径
import os
print(os.getcwd())
2.2.2 获取文件绝对路径
os.path.abspath(file_path)
2.2.3 改变当前工作目录
import os
os.chdir("目标目录") #修改当前工作目录
2.3 删除文件与文件夹
import os
import shutil
os.remove(path) #删除文件
os.removedirs(path) #删除空文件夹
os.rmdir(path) #删除空文件夹
# os只能删除空文件夹,删除非空文件夹使用shutil
shutil.rmtree(path) #递归删除文件夹,即:删除非空文件夹
原文链接:python 删除文件夹、删除非空文件夹
2.4 csv文件读取
2.4.1 写入文件,writer = csv.writer(csvfile)
import csv
#python2可以用file替代open
with open("test.csv","w") as csvfile:
writer = csv.writer(csvfile)
#先写入columns_name
writer.writerow(["index","a","b"])
#写入多行用writerows
writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
2.4.2 读取文件,reader = csv.reader(csvfile)
import csv
with open("test.csv","r") as csvfile:
reader = csv.reader(csvfile)
#这里不需要readlines
for line in reader:
print(line)
# 获取文件行数
print(list(reader))
2.4.3 不同文件读写模式,’w’, ‘a’, ‘r’
- ‘w’,表示覆盖,文件不存在会创建
- ‘w+’,表示读写,参考’w’,文件不存在会创建,存在会覆盖
- ‘a’,追加
- ‘a+’,追加且可读
- ‘r’,表示读取,文件不存在会报错
- ‘r+’,可读可写,若文件不存在,会报错
2.4.4 保证csv文件存在,with open(path, ‘a+’) as csvfile
2.5 获取文件夹下所有文件
path = os.listdir(os.getcwd()) # 不会区分文件与文件夹
# 进一步识别
for p in path:
if os.path.isdir(p):
# 打印文件夹名
print(p)
2.6 txt文件读写
2.6.1 读取txt文件
- 一次性读取,read()
with open("test.txt", "r") as f: # 打开文件
data = f.read() # 读取文件
print(data)
- 分行读取,readlines()
with open("test.txt", "r") as f:
data = f.readlines() # list列表
print(data)
2.6.3 写入txt文件
with open("test.txt","w") as f:
f.write(string) # 不会自动分行,如果需要分行,需要在string中人为添加换行符 \n
# 注意如果直接使用f.write('\n'),不会换行会显示'\n'字符
f.write('\r\n') # 正确直接使用写法
3 装饰器
3.1 @staticmethod或@classmetho
- 通常来说,我们使用一个类的方法时,首先要实例化这个类,再用实例化的类来调用其方法
- 使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
4 matplotlib
4.1 散点图 matplotlib.pyplot.scatter
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs
- 参数说明:
x, y: float or array-like, shape (n, )
The data positions.
s: float or array-like, shape (n, ), optional
The marker size in points**2. Default is rcParams['lines.markersize'] ** 2
.
c: array-like or list of colors or color, optional
The marker colors.
marker: MarkerStyle
86)
The marker style. marker can be either an instance of the class or the text shorthand for a particular marker. See matplotlib.markers
for more information about marker styles.
alpha: float, default: None
The alpha blending value, between 0 (transparent) and 1 (opaque).
5 错误和异常
5.1 assert断言
- 语法格式如下:
assert expression
等价于:
if not expression:
raise AssertionError
- assert 后面也可以紧跟参数:
assert expression [, arguments]
等价于:
if not expression:
raise AssertionError(arguments)
6 时间与日期
6.1 计算Python的代码块或程序的运行时间
- 方法一
import datetime
start = datetime.datetime.now()
run_function():
# do something
end = datetime.datetime.now()
print (end-start)
- 方法二
import time
start = time.time()
run_function()
end = time.time()
print str(end-start)
- 方法三,推荐使用
import time
start = time.clock()
run_function()
end = time.clock()
print str(end-start)
# Python3.8不再支持time.clock,但在调用时依然包含该方法;需要用用time.perf_counter()替换
6.2 格式化时间,time.strftime(‘%m-%d’, time.localtime())
import time
# 格式化成2016-03-20 11:45:39形式
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 格式化成Sat Mar 28 22:24:24 2016形式
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
# 将格式字符串转换为时间戳
a = "Sat Mar 28 22:24:24 2016"
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))
6.3 获取当前时间,time.localtime(time.time())
7 PyMySQL
7.1 安装
pip3 install PyMySQL
python3 setup.py install
7.2 数据库连接
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 关闭数据库连接
db.close()
7.3 增删改查操作
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
### 具体执行语句放在此处 ###
# 关闭数据库连接
db.close()
- 插入
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
- 删除
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
- 修改
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
- 查询
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
8 字符串
8.1 其他类型转为字符串
str()
8.2 字符串前面的u,r,b,f
- 字符串前加 u
u"我是含有中文字符组成的字符串。"
作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
- 字符串前加 r
r"\n\n\n\n” # \n表示一个普通生字符串 \n\n\n\n,而不表示换行了。
作用:加r, 则表示’\n\n\n\n’字符 ,表示不用转义;不加r, 转义,则变成了换行。
应用:常用于正则表达式,对应着re模块。
- 字符串前加 b
response = b'<h1>Hello World!</h1>' # b' ' 表示这是一个 bytes 对象
作用: b” “前缀表示后面字符串是bytes 类型。
用处:网络编程中,服务器和浏览器只认bytes 类型数据。
如:send 函数的参数和 recv 函数的返回值都是 bytes 类型
附:
在 Python3 中,bytes 和 str 的互相转换方式是
str.encode('utf-8')
bytes.decode('utf-8')
- 字符串前加 f
import time
t0 = time.time()
time.sleep(1)
name = 'processing'
# 以f开头表示在字符串内支持大括号内的python 表达式
print(f'{name} done in {time.time() - t0:.2f} s')
输出:processing done in 1.00 s
9 pickle数据持久存储
python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
9.1 读取\写入 文件
pickle.dump(obj, file, [,protocol])
注解:将对象obj保存到文件file中去。
参数:- protocol为序列化使用的协议版本。0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。
- file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以’w’方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。
pickle.load(file)
注解:从file中读取一个字符串,并将它重构为原来的python对象。
参数:- file:类文件对象,有read()和readline()接口。
10 tqdm
Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)。
11 字典dict
11.1 update()
把字典dict2的键/值对更新到dict里。
dict.update(dict2)
11.2 get()
返回指定键的值。
dict.get(key, default=None)
参数:
- key – 字典中要查找的键。
- default – 如果指定键的值不存在时,返回该默认值。
11.3 按key删除元素,pop(key)
11.4 遍历字典,for k,v in dict.item()
11.5 一般复制为浅复制,对原dict操作会修改新dict
- 来源博客:[Python] dict字典的浅复制与深复制
Python中针对dict字典有两种复制:
(1)浅复制:利用 copy() 或者 dict() ;复制后对原dict的内部子对象(方括号[]内元素)进行操作时,由浅复制得到的dict会受该操作影响
(2)深复制:利用 deepcopy() ;复制后对原dict的内部子对象(方括号[]内元素)进行操作时,由深复制得到的dict不会受该操作影响
from copy import deepcopy
def test():
d1 = {"a": {"keys": [1, 2, 3]}, 'b': {"keys": [4, 5, 6]}}
d2 = d1.copy() # 浅复制
d3 = dict(d1) # 浅复制
d4 = deepcopy(d1) # 深复制
print("d1=%s \nd2=%s \nd3=%s \nd4=%s" % (d1, d2, d3, d4))
d1["a"]["keys"] = [1, 2] # 修改d1的值
print("d1 modified.")
print("d1=%s \nd2=%s \nd3=%s \nd4=%s" % (d1, d2, d3, d4))
"""
输出结果:
d1={'a': {'keys': [1, 2, 3]}, 'b': {'keys': [4, 5, 6]}}
d2={'a': {'keys': [1, 2, 3]}, 'b': {'keys': [4, 5, 6]}}
d3={'a': {'keys': [1, 2, 3]}, 'b': {'keys': [4, 5, 6]}}
d4={'a': {'keys': [1, 2, 3]}, 'b': {'keys': [4, 5, 6]}}
d1 modified.
d1={'a': {'keys': [1, 2]}, 'b': {'keys': [4, 5, 6]}}
d2={'a': {'keys': [1, 2]}, 'b': {'keys': [4, 5, 6]}}
d3={'a': {'keys': [1, 2]}, 'b': {'keys': [4, 5, 6]}}
d4={'a': {'keys': [1, 2, 3]}, 'b': {'keys': [4, 5, 6]}}
"""
12 字符串str
12.1 移除字符串头尾指定的字符,strip()
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
12.2 eval()
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
>>>x = 7
>>> eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85
12.3 寻找子串,index()与find()
如果找不到目标子串,index会报错,find会返回-1
原文链接:python find和index的区别
12.4 字符串切割,str.split(‘ ‘)
12.5 多种字符替换为一个字符,re.sun(r’[>*#]’, ‘ ‘,str)
import re
a='fs233*bb>>c##ad'
re.sub(r'[\*>#]','-',a)
print(a)
### 输出结果 ###
fs233bbcad
re.sub() 的第一个参数是pattern,使用正则表达式,所以例子中 [*>#] 代表 [] 中的任何一个字符,即替换a中*># 为’ ‘。
原文链接:python多种字符替换为一个字符
12.6 字符串整体替换,replace(substr, str)
str = 'akakak'
str = str.replace('k',' 8') # 将字符串里的k全部替换为8
print str
>> 'a8a8a8' # 输出结果
13 列表List
13.1 在列表末尾一次性追加另一个序列中的多个值,extend()
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
13.2 去掉列表中的一个元素(默认最后一个元素),pop(index)
去掉列表中的一个元素(默认最后一个元素)
13.3 将list与元组放置在一个list中
each_data=[2,3,4]
data0 = [tuple([0,1])]
for j in each_data:
data0.append(j) # 正确用法 [(0, 1), 4, 5]
data1 = [tuple([0,1])]+each_data # 正确用法 [(0, 1), 4, 5] ,但是要求each_data要为list,不能为ndarray等
data2 =[tuple([0,1]),each_data] # 错误用法,[(0, 1), [2, 3, 4]]
data3 = [[0,1],each_data] # 错误用法 [[0, 1], [2, 3, 4]]
13.4 生成tuple必须从其他序列转为tuple
13.5 list包含数字,不能直接转化成字符串
print(" ".join('%s' %id for id in list1))
13.6 负数索引,从后往前索引
13.7 同时遍历两个list,zip()
13.8 切片,list[start : end : step]
start是包含的,end是不包含的。 str、tuple都可以进行切片操作
13.9 指定位置插入元素,list.insert(index,item)
13.10 拼接成字符串,’ ‘.join(list)
- 列表里面的元素必须全是字符串才可以使用join()进行拼接
- 返回的是一个字符串
原文链接:Python 将一个列表里面的元素拼接成一个字符串
13.11 添加多个元素,extend()
- append一个list时,会把list当作整体添加
- extend一个list时,会把list内所有元素逐个添加
13.12 json与list互换
- list转换成json:
str_json = json.dumps(list, ensure_ascii=False, indent=2)
- json转换成list:
list = json.loads(str_json)
13.13 将多维list转为一维,多层嵌套的列表推导式
c = [j for i in b for j in i]
13.14 将元组列表分成为多个列表
- 以两个元素的元组为例
a,b = zip(*y)
或者需要它们作为列表而不是元组
a,b = map(list,zip(*y))
13.15 删除元素
13.15.1 根据索引删除一个或多个,del listname[index]
13.15.2 根据索引删除一个,listname.pop(index)
13.15.3 根据值删除,listname.remove(value)
13.15.4 删除所有元素,listname.clear()
13.16 sort之后一定要重新复制给原来的list
14 数字Number
14.1 round()
round() 方法返回浮点数x的四舍五入值。
15 内存管理
15.1 手动释放内存,del + gc.collect()
import gc
del a
gc.collect()
16 Json数据
16.1 Json数据与普通数据的互转
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
json.dumps(data) # 对数据进行编码。
json.loads(json_data) #对数据进行解码。
16.2 python使用json.dump()的中文编码问题
当json中有中文字符串时:
- open时加上encoding=‘utf-8’,
- dump时加上ensure_ascii=False,(这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False)
17 异常处理
17.1 try-except-finally
try:
divide(1,1)
except:
print("divide by 0")
else:
print("the code is no problem")
finally:
print("this is finally code,i'm running")
原文链接:https://blog.csdn.net/lwgkzl/article/details/81059433
18 随机数
18.1 无重复随机采样,random.sample(list, k)
18.2 赋权采样,random.choices(population, weights=None)
19 安装setup
19.1 setup配置参数详解与实例
(因为目前还没有需求,所以只引用他人博客)
19.2 安装setup
python setup.py build
python setup.py install
19.3 报错package找不到
注意在需要导入模块的根目录添加__init__.py文件(里面可以不含任何内容)
20 元组
20.1 有名元组
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
>>> s = Student('Jim', 21, 'male', '123@qq.com')
>>> s.name
'Jim'
>>> s.age
21
21 可视化matplotlib
21.1 热力图 seaborn
官方文档:seaborn.heatmap
基本用法
import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set_theme()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, cbar=Fasle) # 输入二维数据即可
- Python自带颜色条colormap:Python可视化|matplotlib07-自带颜色条Colormap(三)
- cbar:是否绘制颜色条
21.2 plot示例
2.1.2.1 多图简单示例
y1 = figure.add_subplot(111) # 图总数为1行1列,第1个图
y1.plot(node_dropout, hr, color='r', linestyle='-.', linewidth=1, clip_on=False, marker='o')
- color:线条颜色
- linestype:线条风格
- clip_on:超出部分是否剪切,设置False可以让边界上的 marker 也显示完整
- marker:代表每个点的样式
21.2.2 设置轴标签
y1.set_ylabel('HR@10')
21.2.3 设置图标题
y1.set_title(title) # 设置图标题
21.2.4 设置背景栅格
y1.grid(color='black', linestyle='-', linewidth=1, alpha=0.1) # alpha为透明度
21.2.5 设置边框属性-颜色等
ax = plt.gca() # 获取当前的axes
ax.spines['left'].set_color('red')
ax.spines['right'].set_color('blue')
21.2.6 设置左右边界与图的间隔
figure.subplots_adjust(right=0.89)
21.2.7 设置刻度文字颜色
y1.tick_params(axis='y', colors='red')
21.2.8 导出图片
plt.savefig(output_predir+type+'.jpg', dpi=80, transparent=True)
- dpi:图片大小
- transparent:背景是否透明
21.2.9 关闭坐标轴显示
plt.axis('off')
21.3 绘制双Y轴图
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0., np.e, 0.01)
y1 = np.exp(-x)
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1)
ax1.set_ylabel('Y values for exp(-x)')
ax1.set_title("Double Y axis")
ax2 = ax1.twinx() # 关键函数
ax2.plot(x, y2, 'r')
ax2.set_xlim([0, np.e])
ax2.set_ylabel('Y values for ln(x)')
ax2.set_xlabel('Same X for both exp(-x) and ln(x)')
plt.show()
21.4 多图绘制
21.4.1 subplot,有规律分布
subplot是均匀的分割绘图区,来进行子图的放置。
- 需要注意的是subplot并不适合来绘制跨行或者跨列的子图,跨行与跨列的子图绘制,交给subplot2grid()更容易完成。
- 如果分割的图只是个位数时,那么原本的表示方法:(2,2,1),与(221)等效,其他的不可如此。
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
# 数据
x = np.linspace(-10, 10, 100)
y1 = x
y2 = x**2
y3 = x**3
# 创建一个figure窗体
fig = plt.figure(num="子图得比较")
fig.suptitle("draw some subplot")
# 绘制第一个子图
ax1 = plt.subplot(2, 2, 1)
plt.plot(x, y1)
ax1.set_title("y1 = x")
# 绘制第二个子图
ax2 = plt.subplot(222)
plt.plot(x, y2)
ax2.set_title("y2=x**2")
# 绘制第三个子图
ax3 = plt.subplot(223)
plt.plot(x, y3)
ax3.set_title("y3=x**3")
# 展示
plt.show()
21.4.2 subplot2grid,无规律分布
subplot2grid((分割),(起始位置),colspan=列宽, rowspan=行宽)
例如:plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=1),
将整块figure画布分成3行3列的格子,从第2行,第一列画起该子图,列宽占两格,行宽占一格。
像figure一样,定义subplot2grid()子图以后,后续的操作都在该子图上,直到另一个子图的出现。
import matplotlib.pyplot as plt
# 创建画布
plt.figure()
# 创建子图
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3, rowspan=1)
ax1.plot([1, 2], [1, 2])
ax1.set_title("No1")
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=1)
ax3 = plt.subplot2grid((3, 3), (1, 2), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0), colspan=1, rowspan=1)
ax5 = plt.subplot2grid((3, 3), (2, 1), colspan=1, rowspan=1)
plt.show()
22 itertools
Itertools模块, itertools提供了高效快捷的用于操作迭代对象的函数。通过使用这个模块,可以简化代码。
22.1 去除迭代元素内嵌的迭代元素,itertools.chain
import itertools as it
b=[[1,2],[5,6],[8,9]]
b_update=it.chain(*b)
print(type(b_update)) #itertools返回的对象是个类
print(list(b_update)) #转化成列表输出
22.2 对传进来的iterable对象逐个进行某个操作,itertools.accumulate
a=[1,2,3,4,5]
b=accumulate(a) #默认是累加,可以添加累乘,传入参数operator.mul即可
>>> b #这里返回的是一个可迭代对象
<itertools.accumulate object at 0x7f3e5c2f4e48>
>>> list(b) #强制转化
[1, 3, 6, 10, 15]