- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 迭代器工具包【推荐】由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
原文:https://git.io/pytips 。
0x01 介绍了迭代器的概念,即定义了 __iter__() 和 __next__() 方法的对象,或者通过 yield 简化定义的“可迭代对象”,而在一些函数式编程语言(见 0x02 Python 中的函数式编程)中,类似的迭代器常被用于产生特定格式的列表(或序列),这时的迭代器更像是一种数据结构而非函数(当然在一些函数式编程语言中,这两者并无本质差异)。Python 借鉴了 APL, Haskell, and SML 中的某些迭代器的构造方法,并在 itertools 中实现(该模块是通过 C 实现,源代码:/Modules/itertoolsmodule.c).
itertools 模块提供了如下三类迭代器构建工具:
无限迭代 。
整合两序列迭代 。
组合生成器 。
1. 无限迭代 。
所谓无限(infinite)是指如果你通过 for...in... 的语法对其进行迭代,将陷入无限循环,包括:
1
2
3
4
5
|
count(start, [step])
cycle(p)
repeat(elem [,n])
|
从名字大概可以猜出它们的用法,既然说是无限迭代,我们自然不会想要将其所有元素依次迭代取出,而通常是结合 map/zip 等方法,将其作为一个取之不尽的数据仓库,与有限长度的可迭代对象进行组合操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
from
itertools
import
cycle, count, repeat
print
(count.__doc__)
count(start
=
0
, step
=
1
)
-
-
> count
object
Return a count
object
whose .__next__() method returns consecutive values.
Equivalent to:
def
count(firstval
=
0
, step
=
1
):
x
=
firstval
while
1
:
yield
x
x
+
=
step
counter
=
count()
print
(
next
(counter))
print
(
next
(counter))
print
(
list
(
map
(
lambda
x, y: x
+
y,
range
(
10
), counter)))
odd_counter
=
map
(
lambda
x:
'Odd#{}'
.
format
(x), count(
1
,
2
))
print
(
next
(odd_counter))
print
(
next
(odd_counter))
0
1
[
2
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
20
]
Odd
#1
Odd
#3
print
(cycle.__doc__)
cycle(iterable)
-
-
> cycle
object
Return elements
from
the iterable until it
is
exhausted.
Then repeat the sequence indefinitely.
cyc
=
cycle(
range
(
5
))
print
(
list
(
zip
(
range
(
6
), cyc)))
print
(
next
(cyc))
print
(
next
(cyc))
[(
0
,
0
), (
1
,
1
), (
2
,
2
), (
3
,
3
), (
4
,
4
), (
5
,
0
)]
1
2
print
(repeat.__doc__)
repeat(
object
[,times])
-
> create an iterator which returns the
object
for
the specified number of times. If
not
specified, returns the
object
endlessly.
print
(
list
(repeat(
'Py'
,
3
)))
rep
=
repeat(
'p'
)
print
(
list
(
zip
(rep,
'y'
*
3
)))
[
'Py'
,
'Py'
,
'Py'
]
[(
'p'
,
'y'
), (
'p'
,
'y'
), (
'p'
,
'y'
)]
|
2. 整合两序列迭代 。
所谓整合两序列,是指以两个有限序列为输入,将其整合操作之后返回为一个迭代器,最为常见的 zip 函数就属于这一类别,只不过 zip 是内置函数。这一类别完整的方法包括:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
accumulate()
chain()
/
chain.from_iterable()
compress()
dropwhile()
/
filterfalse()
/
takewhile()
groupby()
islice()
starmap()
tee()
zip_longest()
|
这里就不对所有的方法一一举例说明了,如果想要知道某个方法的用法,基本通过 print(method.__doc__) 就可以了解,毕竟 itertools 模块只是提供了一种快捷方式,并没有隐含什么深奥的算法。这里只对下面几个我觉得比较有趣的方法进行举例说明.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
from
itertools
import
cycle, compress, islice, takewhile, count
# 这三个方法(如果使用恰当)可以限定无限迭代
# print(compress.__doc__)
print
(
list
(compress(cycle(
'PY'
), [
1
,
0
,
1
,
0
])))
# 像操作列表 l[start:stop:step] 一样操作其它序列
# print(islice.__doc__)
print
(
list
(islice(cycle(
'PY'
),
0
,
2
)))
# 限制版的 filter
# print(takewhile.__doc__)
print
(
list
(takewhile(
lambda
x: x <
5
, count())))
[
'P'
,
'P'
]
[
'P'
,
'Y'
]
[
0
,
1
,
2
,
3
,
4
]
from
itertools
import
groupby
from
operator
import
itemgetter
print
(groupby.__doc__)
for
k, g
in
groupby(
'AABBC'
):
print
(k,
list
(g))
db
=
[
dict
(name
=
'python'
, script
=
True
),
dict
(name
=
'c'
, script
=
False
),
dict
(name
=
'c++'
, script
=
False
),
dict
(name
=
'ruby'
, script
=
True
)]
keyfunc
=
itemgetter(
'script'
)
db2
=
sorted
(db, key
=
keyfunc)
# sorted by `script'
for
isScript, langs
in
groupby(db2, keyfunc):
print
(
', '
.join(
map
(itemgetter(
'name'
), langs)))
groupby(iterable[, keyfunc])
-
> create an iterator which returns
(key, sub
-
iterator) grouped by each value of key(value).
A [
'A'
,
'A'
]
B [
'B'
,
'B'
]
C [
'C'
]
c, c
+
+
python, ruby
from
itertools
import
zip_longest
# 内置函数 zip 以较短序列为基准进行合并,
# zip_longest 则以最长序列为基准,并提供补足参数 fillvalue
# Python 2.7 中名为 izip_longest
print
(
list
(zip_longest(
'ABCD'
,
'123'
, fillvalue
=
0
)))
[(
'A'
,
'1'
), (
'B'
,
'2'
), (
'C'
,
'3'
), (
'D'
,
0
)]
|
3. 组合生成器 。
关于生成器的排列组合: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
product(
*
iterables, repeat
=
1
):两输入序列的笛卡尔乘积
permutations(iterable, r
=
None
):对输入序列的完全排列组合
combinations(iterable, r):有序版的排列组合
combinations_with_replacement(iterable, r):有序版的笛卡尔乘积
from
itertools
import
product, permutations, combinations, combinations_with_replacement
print
(
list
(product(
range
(
2
),
range
(
2
))))
print
(
list
(product(
'AB'
, repeat
=
2
)))
[(
0
,
0
), (
0
,
1
), (
1
,
0
), (
1
,
1
)]
[(
'A'
,
'A'
), (
'A'
,
'B'
), (
'B'
,
'A'
), (
'B'
,
'B'
)]
print
(
list
(combinations_with_replacement(
'AB'
,
2
)))
[(
'A'
,
'A'
), (
'A'
,
'B'
), (
'B'
,
'B'
)]
# 赛马问题:4匹马前2名的排列组合(A^4_2)
print
(
list
(permutations(
'ABCDE'
,
2
)))
[(
'A'
,
'B'
), (
'A'
,
'C'
), (
'A'
,
'D'
),
(
'A'
,
'E'
), (
'B'
,
'A'
), (
'B'
,
'C'
),
(
'B'
,
'D'
), (
'B'
,
'E'
), (
'C'
,
'A'
),
(
'C'
,
'B'
), (
'C'
,
'D'
), (
'C'
,
'E'
),
(
'D'
,
'A'
), (
'D'
,
'B'
), (
'D'
,
'C'
),
(
'D'
,
'E'
), (
'E'
,
'A'
), (
'E'
,
'B'
), (
'E'
,
'C'
), (
'E'
,
'D'
)]
# 彩球问题:4种颜色的球任意抽出2个的颜色组合(C^4_2)
print
(
list
(combinations(
'ABCD'
,
2
)))
[(
'A'
,
'B'
), (
'A'
,
'C'
), (
'A'
,
'D'
), (
'B'
,
'C'
), (
'B'
,
'D'
), (
'C'
,
'D'
)]
|
最后此篇关于Python 迭代器工具包【推荐】的文章就讲到这里了,如果你想了解更多关于Python 迭代器工具包【推荐】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
鉴于此 export const slice = createSlice({ name: 'reducer', initialState: { }, reducers:
当创建新图表并添加系列(例如 ColumnSeries)和数据时,列将呈现为淡入动画类型,并在屏幕上绘制图表后瞬间出现。 有什么办法可以阻止这个动画的发生吗?或者,是否有办法强制图表在渲染之前完成动画
我正在尝试从 Java 的 JDK 导入 tools.jar,但每当我尝试创建 newInstance 时,都会收到 InstantiationException来自图书馆的类(class)。 到目前
我正在寻找 JavaScript RIA 工具包。我的要求是:漂亮的外观、免费的许可证和健全的 API。有什么想法吗? 这就是我到目前为止所发现的: ExtJS 专业人士 完美的外观 很多小部件 支持
jsPlumb工具包是否可以根据要绘制和连接的对象的数量和类型动态定位内容。我的意思是目前example他们给出的方法是,使用 css 来定位每个节点,当我们动态生成可视化时,这不是一个好的选择,因为
我正在 Linux 中创建磁盘分析器。我想知道哪个 Python 工具包可以帮助我使用 GUI。我目前正在尝试 Tkinter 有更好的东西吗? 最佳答案 “更好”是主观的。我很乐意提出我的意见,即没
我们正在构建一个调查网络应用程序,它允许用户在离线时向调查添加新记录,并在浏览器重新连接到服务器时上传。 我们已经确定这将需要离线存储,因此 google gears 似乎是一个显而易见的选择(我们知
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在寻找可以在 Linux 系统上使用 C++ 语言的 SOAP 工具包。我查看了 AXIS2C,但发现它的文档很少。不幸的是,gSoap 需要许可证,所以还有其他的吗? 最佳答案 我用于 C++
我只是想掌握我可以从中构建的 OpenGL,所以我正在寻找的只是构建 Windows 等的基本知识。我在阅读教程时注意到的一件事就是它似乎就像很多信息已经过时了 - 例如很多教程(其中许多是几年前写的
有谁知道如何在 Silverlight 工具包的 TreeView 中实现拖放? 我看到了 Silverlight 的拖放管理器,但据说您可以在要拖放的项目周围放置容器,但我想知道如何在另一个 Tre
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我有一个有 6 列的 DataGrid,每列都是一个 RadioButton,以便用户可以选择 1 in 6 选项。大约有100行。我用 6 个 bool 数据成员创建了一个自定义类,然后将数据网格与
从我发现的一个 Silverlight 论坛页面,我的印象是在后面的代码中创建的 ChildWindow 会选择页面其余部分的主题;只有当您从 ChildWindow 继承时,情况才不再如此。 出于某
我正在使用 WPF 工具包 AutoCompleteBox,它的 itemsSource 是一个包含数百万个对象的列表。 AutoCompleteBox 是否用于搜索后台线程,如果没有,我该如何实现。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
这个问题已经有答案了: What is the difference between a framework and a library? [closed] (22 个回答) 已关闭 7 年前。 框架
我的问题很简单,我想通过一个简单的例子得到清晰的答案。 API、工具包、框架和库之间的主要区别是什么? 最佳答案 我更喜欢以下内容: API 是如何使用应用程序的抽象描述。例如,API可以描述聊天服务
我有一个 C# 应用程序。目前所有模块都是用 .NET 2 编写的,并且它使用一些具有 Linux 端口的可执行文件。所以我想知道我应该在 Windows 和 MacOS 上使用什么工具包才能在两者上
这是我非常简单的 Accordion XAML :- 如果我非常快地点击 Accordion 项目几次,我会得到这个异常:- AccessViolation
我是一名优秀的程序员,十分优秀!