zip函数输出结果错误

8

我正在使用Python编写一些密码算法,但我以前从未使用过Python。

首先,看看这段代码,然后我会解释问题:

x = bytearray(salt[16:])
y = bytearray(sha_512[32:48])
c = [  i ^ j for i, j in zip( x, y )  ]

x和y的值为,

bytearray(b'AB\xc8s\x0eYzr2n\xe7\x06\x93\x07\xe2;')
bytearray(b'+q\xd4oR\x94q\xf7\x81vN\xfcz/\xa5\x8b')

我不理解代码的第三行。为了理解第三行,我不得不查看zip()函数, 在这个问题中,我遇到了这个问题,

关于元组的zip函数求助

根据这个问题的回答,

zip((1,2,3),(10,20,30),(100,200,300))

将输出:

[(1, 10, 100), (2, 20, 200), (3, 30, 300)]

但是当我尝试打印它时,

print(zip((1,2,3),(10,20,30),(100,200,300)))

我看到的输出如下:

我正在获取此输出,

<zip object at 0x0000000001C86108>

为什么我的输出结果与原始输出结果不同?

1个回答

16

Python 3 中的 zip 返回一个迭代器,使用 list 可以看到其内容:

>>> list(zip((1,2,3),(10,20,30),(100,200,300)))
[(1, 10, 100), (2, 20, 200), (3, 30, 300)]

c = [ i ^ j for i, j in zip(x, y) ] 是一个列表推导式,其中你正在迭代从zip返回的项目,并对它们执行一些操作以创建新的列表。


1
@Xufyan 这是一个列表推导式。 - Ashwini Chaudhary
1
@Xufyan 阅读:Iterator。“<zip object at 0x0000000001C86108>”只是zip迭代器对象的repr表达式。 - Ashwini Chaudhary
我注意到在Python的新版本中,大多数内置函数返回迭代器而不是序列。是这样吗? - Grijesh Chauhan
@GrijeshChauhan 是的,map 现在也返回一个迭代器,xrange() 被重命名为 range(),而 py2.x 的 range() 不再可用。 - Ashwini Chaudhary
@hcwhsa 谢谢!你能推荐我一个资源,让我了解像iteratools、Collections等库吗?(或者Python文档是最好的资源)我看过《Learn Python》这本书。 - Grijesh Chauhan
1
@GrijeshChauhan 文档是学习库的最佳资源,我想没有一本书能够完全涵盖这些库。顺便说一句,为了学习一些新技巧,我建议阅读《Python Cookbook, 3rd Edition》(http://shop.oreilly.com/product/0636920027072.do),该书还有 Python2 版本可供选择。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接