f = lambda x : 2*x
g = lambda x : x ** 2
h = lambda x : x ** x
funcTriple = ( f, g, h )
myZip = ( zip ( funcTriple, (1, 3, 5) ) )
k = lambda pair : pair[0](pair[1])
# Why do Output # 1 (2, 9, 3125) and Output # 2 ( [ ] ) differ?
print ("\n\nOutput # 1: for pair in myZip: k(pair) ...")
for pair in myZip :
print ( k(pair) )
print ("\n\nOutput # 2: [ k(pair) for pair in myZip ] ...")
print ( [ k(pair) for pair in myZip ] )
# script output is ...
# Output # 1: for pair in myZip: k(pair) ...
# 2
# 9
# 3125
#
# Output # 2: [ k(pair) for pair in myZip ] ...
# []
views:
173answers:
1
+12
A:
Works perfectly in Python 2.6 but fails in Python 3.0 because zip
returns a generator-style object and the first loop exhausts it. Make a list instead:
myZip = list( zip ( funcTriple, (1, 3, 5) ) )
and it works in Python 3.0
RichieHindle
2009-07-01 20:31:16
Works fine for me in IronPython too.
Jon Skeet
2009-07-01 20:32:23
Yes, I find that it works perfectly using Python 2.5: Output # 2 is [2, 9, 3125].However, When I use Python 3.0, it gives the "erroneous" output, and Output # 2 is [ ] .
2009-07-01 20:37:02
Thank you very much! I'll be reading up on "generator-style" objects and their "exhaustion."
2009-07-01 20:40:38