且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Python数据科学指南》——1.19 使用zip和izip函数

更新时间:2022-09-15 10:21:38

本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.19节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.19 使用zip和izip函数

zip函数将两个相同长度的集合合并成对,它是Python的内置函数。

1.19.1 准备工作

我们通过一个简单示例来演示zip函数。

1.19.2 操作方法

我们传递两个序列给zip函数,并打印输出。

print zip(range(1,5),range(1,5))

1.19.3 工作原理

本例中zip函数的两个参数是两个列表,这两个列表都是由从1到5的数值组成。range函数有3个参数:起始数值、结束数值和步长,默认步长为1。本例中,我们分别把1和5作为列表的起始和结束值。记住,Python是右侧关闭的,所以range(1,5)将返回如下。

[1,2,3,4]

我们传递了两个序列给zip函数,输出结果如下。

[(1, 1), (2, 2), (3, 3), (4, 4)]

记住两个集合的大小必须一致,如果不满足,则输出结果会削减以匹配较小的集合大小。

1.19.4 更多内容

现在请看下面的代码。

x,y = zip(*out)
print x,y

你能猜到输出结果是什么样的吗?

我们来看看*操作符是做什么的,它用来将集合中的每个元素作为位置参数进行传递。

a =(2,3)
print pow(*a)

power函数需要两个参数,a是一个元组,你会发现,*操作符将元组分为了两个独立的参数。它把元组分成了2和3,两者被作为参数传递,即pow(2,3),得到的结果是8。

**操作符可以用来将字典中的元素进行分解,我们看如下的代码段。

a_dict = {"x":10,"y":10,"z":10,"x1":10,"y1":10,"z1":10}

**操作符将字典中的元素变成命名参数进行传递。本例中,我们使用**操作符对字典进行操作,会得到6个参数。请看如下的函数,它需要6个参数。

def dist(x,y,z,x1,y1,z1):
return abs((x-x1)+(y-y1)+(z-z1))

print dist(**a_dict)

print语句的输出结果是0。

使用这两种操作符,我们可以编写一些函数,可以接收的变量参数个数不再受限。

def any_sum(*args):
tot = 0
for arg in args:
tot+=arg
return tot
print any_sum(1,2)
print any_sum(1,2,3)

如你所见,上面代码中的any_sum函数可以使用任意数量的变量。严谨的读者可能会疑惑,为什么不使用列表作为any_sum函数的参数呢?确实本例可以使用列表来传递参数,但我们很快就会遇到一些情形,这些情形下,我们甚至不知道要传递什么类型的参数。

回到zip函数的应用上来,zip函数的一个缺点是它会立刻计算完一个列表,当我们使用两个超大的列表时,可能会出现一些问题。izip函数是用来解决此类状况的,它只在需要的时候计算相应的元素。izip是itertools模块的一个组成部分,请参阅1.24节“使用itertools”中的相关内容。

1.19.5 参考资料

第1章“Python在数据科学中的应用”中1.24节“使用itertools”的相关内容。