2013-10-09 3 views
7

Я пишу криптографический алгоритм с использованием Python, но я никогда раньше не работал с Python.zip-функция, дающая неверный вывод

Прежде всего, обратите внимание на этот код, то я бы объяснить вопрос,

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

Значение х и у,

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

Я не мог понять третью строчку кода. Для того, чтобы понять третью строчку, я должен был смотреть в функцию zip(), я наткнулся на этот вопрос,

zip function help with tuples

Согласно ответу на этот вопрос, код,

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> 

Почему мой выход отличается от оригинального производства?

ответ

14

В Python 3 zip возвращает iterator, используйте 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) ] является list comprehension, в этом вы итерацию по элементам вернулся из zip и делать некоторые операции над ними создайте новый список.

+1

@Xufyan Это список понимания. –

+1

@ Xufyan Читать: [Итератор] (http://docs.python.org/2/glossary.html#term-iterator). '<объект zip на 0x0000000001C86108>' является не чем иным, как представлением 'repr' объекта итератора zip. –

+0

Я замечаю, что в новой версии Python большинство встроенных функций возвращает итератор вместо последовательности. верный? –

Смежные вопросы