本节书摘来自异步社区《python数据科学指南》一书中的第1章,第1.19节,作者[印度] gopi subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
zip函数将两个相同长度的集合合并成对,它是python的内置函数。
我们通过一个简单示例来演示zip函数。
我们传递两个序列给zip函数,并打印输出。
<code>print zip(range(1,5),range(1,5))</code>
本例中zip函数的两个参数是两个列表,这两个列表都是由从1到5的数值组成。range函数有3个参数:起始数值、结束数值和步长,默认步长为1。本例中,我们分别把1和5作为列表的起始和结束值。记住,python是右侧关闭的,所以range(1,5)将返回如下。
<code>[1,2,3,4]</code>
我们传递了两个序列给zip函数,输出结果如下。
<code>[(1, 1), (2, 2), (3, 3), (4, 4)]</code>
记住两个集合的大小必须一致,如果不满足,则输出结果会削减以匹配较小的集合大小。
现在请看下面的代码。
你能猜到输出结果是什么样的吗?
我们来看看*操作符是做什么的,它用来将集合中的每个元素作为位置参数进行传递。
power函数需要两个参数,a是一个元组,你会发现,*操作符将元组分为了两个独立的参数。它把元组分成了2和3,两者被作为参数传递,即pow(2,3),得到的结果是8。
<code>**</code>操作符可以用来将字典中的元素进行分解,我们看如下的代码段。
<code>a_dict = {"x":10,"y":10,"z":10,"x1":10,"y1":10,"z1":10}</code>
<code>**</code>操作符将字典中的元素变成命名参数进行传递。本例中,我们使用<code>**</code>操作符对字典进行操作,会得到6个参数。请看如下的函数,它需要6个参数。
print语句的输出结果是0。
使用这两种操作符,我们可以编写一些函数,可以接收的变量参数个数不再受限。
如你所见,上面代码中的any_sum函数可以使用任意数量的变量。严谨的读者可能会疑惑,为什么不使用列表作为any_sum函数的参数呢?确实本例可以使用列表来传递参数,但我们很快就会遇到一些情形,这些情形下,我们甚至不知道要传递什么类型的参数。
回到zip函数的应用上来,zip函数的一个缺点是它会立刻计算完一个列表,当我们使用两个超大的列表时,可能会出现一些问题。izip函数是用来解决此类状况的,它只在需要的时候计算相应的元素。izip是itertools模块的一个组成部分,请参阅1.24节“使用itertools”中的相关内容。
第1章“python在数据科学中的应用”中1.24节“使用itertools”的相关内容。