【Python】itertools模块,补充:可迭代对象、迭代器

Python中 itertools模块创建高效迭代器、处理序列数据集。

此模块所有函数返回迭代器,可用for循环获取迭代器中的内容,也可用list(...)用列表形式显示内容。

import itertools[ x for x in dir(itertools) if not x.startswith('_')]
# 结果:
['accumulate', 'chain', 'combinations', 'combinations_with_replacement', 
'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 
'islice', 'pairwise', 'permutations', 'product', 'repeat', 'starmap',
'takewhile', 'tee', 'zip_longest']

【Python】itertools模块

1、chain 【链接多个可迭代对象】

chain(可迭代对象1, 可迭代对象2, ...):返回一个迭代器,包含参数中的所有可迭代对象的内容。

from itertools import *a = [1,2,3,4,5]
b = ["a","b","c","d","e"]chain(a,b)                          # 结果:<itertools.chain object at 0x0000020AD8E77010>
list(chain(a,b))                    # 结果:[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e']
# 或者
for x in chain(a,b):print(x)
# 结果:
1
2
3
4
5
a
b
c
d
e

若不能提前确定所有可迭代对象,或需要懒方法计算,则使用chain.from_iterable(...)。

from itertools import *# 有yield的函数视为生成器,需用next()方法或for循环才开始执行函数。(控制内存占用,且简洁)
def new_iterable():yield [1,2,3]yield ["a","b","c"]for x in chain.from_iterable(new_iterable()):print(x)
# 结果:
1
2
3
a
b
c

2、zip_longest 【类似zip】

内置函数zip()。

zip(可迭代对象1, 可迭代对象2, ...):返回一个迭代器,将多个可迭代对象中的元素,按对应位置一一组成元组形式。若其中一个可迭代对象处理完,则停止。

from itertools import *a = [1,2,3]
b = ["a","b","c","d","e"]list(zip(a,b))                  # 结果:[(1, 'a'), (2, 'b'), (3, 'c')]

zip_longest(可迭代对象1, 可迭代对象2, ...):类似zip。但将所有可迭代对象处理完,若有缺失值则用None填充。可用fillvalue参数指定空缺默认值。

from itertools import *a = [1,2,3]
b = ["a","b","c","d","e"]list(zip_longest(a,b))
# 结果:[(1, 'a'), (2, 'b'), (3, 'c'), (None, 'd'), (None, 'e')]
list(zip_longest(a,b,fillvalue=999))
# 结果:[(1, 'a'), (2, 'b'), (3, 'c'), (999, 'd'), (999, 'e')]

3、starmap 【类似map】

内置函数map()。

map(函数,可迭代对象1, 可迭代对象2, ...):返回一个迭代器,将多个可迭代对象中的元素,依次调用函数处理。若其中一个可迭代对象处理完,则停止。

注:多个可迭代对象,是函数中涉及多个可迭代对象。若函数中只涉及一个可迭代对象,则map参数中只能有一个可迭代对象。

from itertools import *a = [1,2,3,4,5]
list(map(lambda x:x**3,a))          # 结果:[1, 8, 27, 64, 125]a = "hello"
b = "world world"
list(map(lambda x,y:(x,y,x+y),a,b))
# 结果:[('h', 'w', 'hw'), ('e', 'o', 'eo'), ('l', 'r', 'lr'), ('l', 'l', 'll'), ('o', 'd', 'od')]for value in map(lambda x,y:(x,y,x+y),a,b):print('{}+{}->{}'.format(*value))
# 或者
# for x,y,z in map(lambda x,y:(x,y,x+y),a,b):
#     print('{}+{}->{}'.format(x,y,z))
# 结果:
h+w->hw
e+o->eo
l+r->lr
l+l->ll
o+d->od

starmap(函数,可迭代对象):类似map()。区别是:map中的参数是函数和一个或多个可迭代对象,将可迭代对象的每个元素作为单个参数传递给函数即fun(a,b);而starmap中的参数是函数和一个元组形式的可迭代对象,将可迭代对象的每个元组解包成多个参数传递给函数即fun(*c)。

from itertools import *c = [('h', 'w'), ('e', 'o'), ('l', 'r'), ('l', 'l'), ('o', 'd')]
list(starmap(lambda x,y:(x,y,x+y),c))
# 结果:[('h', 'w', 'hw'), ('e', 'o', 'eo'), ('l', 'r', 'lr'), ('l', 'l', 'll'), ('o', 'd', 'od')]for x in starmap(lambda x,y:(x,y,x+y),c):print(x)
# 结果:
('h', 'w', 'hw')
('e', 'o', 'eo')
('l', 'r', 'lr')
('l', 'l', 'll')
('o', 'd', 'od')for value in starmap(lambda x,y:(x,y,x+y),c):print('{}+{}->{}'.format(*value))
# 或者
# for x,y,z in starmap(lambda x,y:(x,y,x+y),c):
#     print('{}+{}->{}'.format(x,y,z))
# 结果:
h+w->hw
e+o->eo
l+r->lr
l+l->ll
o+d->od

4、islice 【类似切片】

  • islice(可迭代对象, end):返回一个迭代器,从可迭代对象中获取从0到end(不含)的元素。
  • islice(可迭代对象, start, end):返回一个迭代器,从可迭代对象中获取起始位置start(含)到结束位置end(不含)的元素。若end是None,则一直到可迭代对象结束。
  • islice(可迭代对象, start, end, step):返回一个迭代器,从可迭代对象中获取起始位置start(含)到结束位置end(不含)且步长间隔step的元素。若end是None,则一直到可迭代对象结束。
from itertools import *list(islice(range(10),5))               # 结果:[0, 1, 2, 3, 4]
list(islice(range(10),5,8))             # 结果:[5, 6, 7]
list(islice(range(10),5,None))          # 结果:[5, 6, 7, 8, 9]
list(islice(range(10),0,8,2))           # 结果:[0, 2, 4, 6]
list(islice(range(10),0,None,2))        # 结果:[0, 2, 4, 6, 8]

 5、accumulate 【累加和】

  • accumulate(可迭代对象):返回一个迭代器,对每个元素依次进行累加和并返回结果。
  • accumulate(可迭代对象, initial=num):返回一个迭代器,在num基础上再对每个元素依次进行累加和并返回结果。
  • accumulate(可迭代对象, 函数):返回一个迭代器,对每个元素依次调用函数并返回结果。
from itertools import *
import operatorlist(accumulate(range(10)))      # 结果:[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
list(accumulate("abcdefg"))      # 结果:['a', 'ab', 'abc', 'abcd', 'abcde', 'abcdef', 'abcdefg']# 在100的基础上,再进行0-9累加和
list(accumulate(range(10),initial=100))    # 结果:[100, 100, 101, 103, 106, 110, 115, 121, 128, 136, 145]# 1-5累积相乘
list(accumulate(range(1,6),operator.mul))   # 结果:[1, 2, 6, 24, 120]

6、count 【无限生成连续的整数】

  • count():返回一个迭代器,无限生成连续的整数,从0开始。
  • count(start):返回一个迭代器,无限生成连续的整数,从start开始。
  • count(start,step):返回一个迭代器,无限生成连续的整数,从start开始步长间隔step。
from itertools import *for x in zip(count(),["ab","cd","ef"]):print(x)
# 结果:
(0, 'ab')
(1, 'cd')
(2, 'ef')list(islice(count(1,4),5))             # 结果:[1, 5, 9, 13, 17]

注解:zip()最短的可迭代对象处理完就停止。count()无限生成连续的整数,但["ab","cd","ef"]长度只有3,处理完就停止。

7、cycle  【无限循环】

cycle(可迭代对象): 返回一个迭代器,将可迭代对象无限循环。

from itertools import *list(zip(range(10),cycle("good")))
# 结果:
[(0, 'g'), (1, 'o'), (2, 'o'), (3, 'd'), (4, 'g'), (5, 'o'), (6, 'o'), (7, 'd'), (8, 'g'), (9, 'o')]list(zip(range(10),cycle(["a","b"])))
# 结果:
[(0, 'a'), (1, 'b'), (2, 'a'), (3, 'b'), (4, 'a'), (5, 'b'), (6, 'a'), (7, 'b'), (8, 'a'), (9, 'b')]

8、repeat 【重复】

 repeat(需重复的数据, num):返回一个迭代器,重复num次。

repeat(n):也可为map或zip提供常量值流(a stream of constant values)。

from itertools import *
from operator import powlist(repeat('abc', 5))         # 结果:['abc', 'abc', 'abc', 'abc', 'abc']
list(repeat(1,5))              # 结果:[1, 1, 1, 1, 1]# 将列表中的数字求3次幂,num**3
a = [1,2,3]
list(map(pow,a,repeat(3)))     # 结果:[1, 8, 27]

9、product 【笛卡尔积】

  • product(可迭代对象1, 可迭代对象2, ...):返回一个迭代器,将多个可迭代对象中的元素依次一一组成元组。
  • product(可迭代对象, repeat=num):返回一个迭代器,将一个可迭代对象和自身进行笛卡尔积。
from itertools import *a = [1,2,3]
b = ["a","b"]
c = "hello"
list(product(a,b,c))
# 结果:
[(1, 'a', 'h'), (1, 'a', 'e'), (1, 'a', 'l'), (1, 'a', 'l'), (1, 'a', 'o'),
(1, 'b', 'h'), (1, 'b', 'e'), (1, 'b', 'l'), (1, 'b', 'l'), (1, 'b', 'o'),
(2, 'a', 'h'), (2, 'a', 'e'), (2, 'a', 'l'), (2, 'a', 'l'), (2, 'a', 'o'), 
(2, 'b', 'h'), (2, 'b', 'e'), (2, 'b', 'l'), (2, 'b', 'l'), (2, 'b', 'o'),
(3, 'a', 'h'), (3, 'a', 'e'), (3, 'a', 'l'), (3, 'a', 'l'), (3, 'a', 'o'), 
(3, 'b', 'h'), (3, 'b', 'e'), (3, 'b', 'l'), (3, 'b', 'l'), (3, 'b', 'o')]a = [1,2,3]
list(product(a, repeat=2))      # 相当于 list(product(a,a))
# 结果:
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

10、permutations 【指定长度的排列组合】

permutations(可迭代对象):返回一个迭代器,将元素重新排列且长度为可迭代对象的长度的所有组合,组合以元组形式。

permutations(可迭代对象, n):返回一个迭代器,将元素重新排列且长度为n的所有组合,组合以元组形式。

from itertools import *a = [1,2,3]
list(permutations(a))
# 结果:
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]list(permutations(a,2))
# 结果:
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

11、combinations 【指定长度的排列组合,没有重复值】

combinations(可迭代对象,r=num):类似permutations。但组合中没有重复值(重复值为元组中元素相同但元素顺序不同,例如(1,2)和(2,1)为重复值)。

注意:r参数为必需参数,指定长度。

from itertools import *a = [1,2,3]
list(combinations(a,r=2))      # 结果:[(1, 2), (1, 3), (2, 3)]
list(combinations(a,2))        # 结果:[(1, 2), (1, 3), (2, 3)]

permutations_with_replacement(可迭代对象,r=num):类似combinations()。但有重复元素的组合(例如(1,1)和(2,2))。

from itertools import *a = [1,2,3]
list(combinations_with_replacement(a,r=2))      # 结果:[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]

12、pairwise  【依次生成连续的两个元素】

pairwise(可迭代对象):返回一个迭代器,依次生成连续两个元素的组合。若可迭代对象中的元素小于2个,则返回的迭代器为空。

from itertools import *a = [1,2,3,4,5,6]
list(pairwise(a))       # 结果:[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]b = "hello"
list(pairwise(b))       # 结果:[('h', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o')]c = "w"
list(pairwise(c))       # 结果:[]

13、takewhile【返回满足条件的,舍弃第一个False之后的所有元素】

takewhile(predicate, 可迭代对象):返回一个迭代器,若predicate返回True,则返回该元素,一旦碰到predicate返回False,则终止。

from itertools import *a = [3,6,7,8,9]
list(takewhile(lambda x: x%3==0, a))       # 结果:[3, 6]

14、dropwhile【丢弃满足条件的,返回第一个False之后的所有元素】

 dropwhile(predicate, 可迭代对象):返回一个迭代器,若predicate返回True,则丢弃该元素,一旦碰到predicate返回False,则终止,返回后面的全部元素。

from itertools import *a = [3,6,7,8,9]
list(dropwhile(lambda x: x%3==0, a))       # 结果:[7, 8, 9]

15、filterfalse 【只返回不满足条件的元素】

内置函数filter()。

filtler(predicate, 可迭代对象):返回一个迭代器,只返回满足条件的元素。

from itertools import *a = [3,6,7,8,9]
list(filter(lambda x: x%3==0, a))          # 结果:[3, 6, 9]

 filterfalse(predicate, 可迭代对象):返回一个迭代器,只返回不满足条件的元素。

from itertools import *a = [3,6,7,8,9]
list(filterfalse(lambda x: x%3==0, a))       # 结果:[7, 8]

16、compress  【通过选择器,返回需要的数据】

compress(数据, 选择器):以选择器作为筛选,来返回数据中符合的数据。

from itertools import *a = [3,6,7,8,9]
b = cycle([False,True])       # 即 False,True, False,True, False,True...
list(compress(a, b))          # 结果:[6, 8]

17、groupby  【分组】

groupby(可迭代对象, 分组内容):根据分组内容进行分组,返回一个迭代器,迭代器中的元素是元组,(分组内容, 以列表显示对应的值)。

注意:分组之前,注意排序。

from itertools import *a = [1,2,2,3,1,2]
b = islice(count(),8)
ab = list(zip(a,b))
ab                               # 结果:[(1, 0), (2, 1), (2, 2), (3, 3), (1, 4), (2, 5)]for k,v in groupby(ab,lambda x:x[0]):print(k,list(v))
# 结果:
1 [(1, 0)]
2 [(2, 1), (2, 2)]
3 [(3, 3)]
1 [(1, 4)]
2 [(2, 5)] ab.sort()
ab                               # 结果:[(1, 0), (1, 4), (2, 1), (2, 2), (2, 5), (3, 3)]for k,v in groupby(ab,lambda x:x[0]):print(k,list(v))
# 结果:
1 [(1, 0), (1, 4)]
2 [(2, 1), (2, 2), (2, 5)]
3 [(3, 3)]

18、tee 【一个输入分解成多个相同的输出流】

变量1, 变量2,... = tee(可迭代对象, n=num):返回元组形式,元组中元素是迭代器。将一个输入分解成num个相同的输出流。默认n=2。类似于UNIX tee工具。

注意:① 使用tee()生成新的迭代器,原来的可迭代对象不应再使用。

          ② tee()生成的迭代器,不是线程安全的,且需大量辅助存储。

from itertools import *a = [1,2,3,4,5]m,n = tee(a)                 # 相当于 m,n = tee(a,2) 
list(m)                      # 结果:[0, 1, 2, 3, 4, 5, 6, 7]
list(n)                      # 结果:[0, 1, 2, 3, 4, 5, 6, 7]
list(m) == list(n)           # 结果:True
m is n                       # 结果:False

补充:可迭代对象、迭代器

可迭代对象

满足__iter__( )方法的对象。即可用for循环遍历的对象。

例如:列表、字符串、文件等。

迭代器

同时满足__iter__( )方法和__next__( )方法的对象。即可用for循环遍历又可用next()获取下一个值的对象。

可迭代对象不一定是迭代器,迭代器一定是可迭代对象。

可迭代对象转为迭代器:iter(可迭代对象)

判断是否是可迭代对象:isinstance(对象, collections.abc.Iterable)

判断是否是迭代器:isinstance(对象, collections.abc.Iterator)

from collections.abc import Iterator, Iterableisinstance("hello",Iterable)            # 结果:True
isinstance("hello",Iterator)            # 结果:Falseisinstance(iter("hello"),Iterator)      # 结果:True

参考:Pydoc: built-in module itertools

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

Centos/Linux安装Apahce出现bug汇总

源码安装Apache软件 使用软件&#xff1a;Apahce2.4.58&#xff0c;apr1.5.2&#xff0c; apr-util1.5.4 1.下载apr、apr-util和Apache软件&#xff1b; 2.安装apr压缩包&#xff0c;步骤如下&#xff1a; 第一、解压缩 tar zxvf apr-1.5.2.tar.gz第二、安装 cd /usr/local/sr…

RAID的应用场景以及优缺点

RAID 0(条带化)&#xff1a; 工作原理&#xff1a; 数据被分成块&#xff0c;每个块写入不同的驱动器&#xff0c;以并行方式提高读写性能。 优势&#xff1a; 卓越的性能提升&#xff0c;特别是对于大型文件的读写操作。 劣势&#xff1a; 完全没有冗余&#xff0c;一个驱动器…

MFC 中创建并显示二维码

1.创建并显示 QRcode* pQR_Encode; pQR_Encode QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1); if (pQR_Encode) { int nBmpWidth pQR_Encode->width; //获取控件的边界大小 CRect rect; Ge…

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践

最近研究GPT&#xff0c;深入的从transfomer的原理和代码看来一下&#xff0c;现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂&#xff0c;把transformer的来龙去脉&#xff0c;还举例了很多不错的例子。 Transformer通俗笔记&#xff1a;从Word2Vec、Seq2S…

6 个有效且可用的顶级 Android 数据恢复工具

经过测试 42 种数据恢复软件产品&#xff0c;发现奇客数据恢复安卓版是 Android 设备的最佳选择。 过去几十年来&#xff0c;我一直在科技行业工作&#xff0c;经常帮助人们应对计算机灾难&#xff0c;包括丢失数据。 Android 数据恢复应用程序不在您的设备上运行&#xff0c…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&#xff0c;去掉行注释 若需要将多行进行单行注释&#xff0c;只需要选中要注释的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&a…

【PTA题目】L1-6 整除光棍 分数 20

L1-6 整除光棍 分数 20 全屏浏览题目 切换布局 作者 翁恺 单位 浙江大学 这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被…

leetcode中“复杂的二分”类题目

复杂的二分题目难点 第 410、1011、1482、1552、1760、2187、2226 题 1 根据题意确定二分的数据范围 2 避免死循环: 决定是int m (leftright1)/2还是int m (leftright)/2 3 返回结果的指针是left还是right 1 LC875. 爱吃香蕉的珂珂 class Solution {public int minEati…

聚焦数据要素跨域运营,构建数据要素统一大市场地方数据局局长闭门会正式召开

11月23日&#xff0c;在第二届全球数字贸易博览会期间&#xff0c;杭州市数据资源局、中国电子云、杭州数据交易所联合组织各地数据主管部门&#xff0c;召开构建数据要素统一大市场地方数据局局长闭门会&#xff0c;交流数据要素统一大市场构建思路&#xff0c;共探公共数据运…

写给女朋友的python软件开发教程——从入门到实践01——总体规划

文章目录 学习路径chatGPT文心一言 学习资源推荐理论学习——一些这些分别录制视频讲解&#xff08;后面会更&#xff09;实战——以自己想开发的一个软件为例进行教学 学习路径 问&#xff1a; 我已经有python基础了&#xff0c;想快速学会用python的pyqt开发单机软件&#x…

人人都会Blazor—— 3.2 组件

Blazor 应用是使用 Razor 组件(非正式地称为 Blazor 组件或组件)构建的。 组件是用户界面 (UI) 的自包含部分,具有用于启用动态行为的处理逻辑。 组件可以嵌套、重用、在项目间共享,并可在 MVC 和 Razor Pages 应用中使用。 组件呈现为浏览器文档对象模型 (DOM) 的内存中表…

通过一个例子理解pytest的fixture的使用

需求 希望编写登陆web后做一些操作的测试用例&#xff0c;使用pytest框架具体测试用例执行前&#xff0c;需要先拿到web的token&#xff0c;这个获取token的动作只执行一次 例一 先上测试用例代码 adminpc-1:~$ cat my_test.py import pytestclass TestWebLogin:pytest.fi…

基于springboot实现农机电招平台系统项目【项目源码+论文说明】

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

软件开发中对图片的加工处理的一些个人思考和总结

前言&#xff1a; 最近在公司做项目的时候&#xff0c;有一个业务场景就是同一张图片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其实理解起来也很简单&#xff0c;就以大家熟悉的微信头像而言&#xff0c;我们在正常使用的情况下&#xff0c;一个微信头像的大…

寻找多个项目的漏洞赏金实战,不同技术的详细实现

寻找多个项目的漏洞赏金实战,不同技术的详细实现。 破-解Slack App得到3500美金漏洞赏金 文章的核心要点如下: 漏洞发现:作者在Slack的安卓应用中发现了一个漏洞。这个漏洞是由于目录遍历,导致可以窃取密码。这个漏洞的重要性在于,它允许“跳跃”在账户之间,也就是说,你…

[kingbase锁等待问题分析]

参考文章:https://www.modb.pro/db/70021 概述 为了确保复杂的事务可以安全地同时运行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到…

关闭EntityFramework日志输出SQL

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; EntityFramework日志输出SQL 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; EntityFramework日志输出SQL&#xff0c;造成发布后&#xff0c;无效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…