Why map(print, a_list) doesn't work?

后端 未结 6 1883
野趣味
野趣味 2020-12-18 19:55

For a normal function, map works well:

def increment(n):
    return n+1
l = [1, 2, 3, 4, 5]
l = map(increment, l)
print l
>>> [2, 3, 4,         


        
相关标签:
6条回答
  • 2020-12-18 19:57

    Because print is not a function.

    But you can make print-wrapper, of course:

    >>> def p(x):
    ...   print x
    ... 
    >>> l = [1, 2, 3, 4, 5]
    >>> l = map(p, l)
    1
    2
    3
    4
    5
    
    0 讨论(0)
  • 2020-12-18 20:02

    A better way to map print in 2.x would be to do

    from __future__ import print_function
    
    0 讨论(0)
  • 2020-12-18 20:03

    As others have said, in Python 2.x print is a statement. If you really want to do this in Python 2.x you can use pprint:

    from pprint import pprint
    l = [1, 2, 3, 4, 5]
    p = map(pprint, l)
    
    0 讨论(0)
  • 2020-12-18 20:10

    In Python 2.x, print is a statement, not a function. If you try this in Python 3.x it will work.

    In Python 2.x, you can say print(x) and it is not a syntax error, but it isn't actually a function call. Just as 1 + (3) is the same as 1 + 3, print(x) is the same as print x in Python 2.x.

    In Python 2.x you can do this:

    def prn(x):
        print x
    

    Then you can do:

    map(prn, lst)
    

    and it will work. Note that you probably don't want to do lst = map(prn, lst) because prn() returns None, so you will replace your list of values with a same-length list of just the value None.

    EDIT: Two other solutions for Python 2.x.

    If you want to completely change the behavior of print, you can do this:

    from __future__ import print_function
    
    map(print, lst)
    

    This makes print into a function just as it is in Python 3.x, so it works with map().

    Or, you can do this:

    from pprint import pprint
    
    map(pprint, lst)
    

    pprint() is a function that prints things and it is available as a built-in. I'm not exactly sure how it is different from the default print (it says it is a "pretty-print" function but I'm not sure how exactly that makes it different).

    Also, according to the PEP 8 standard, it is non-recommended to use l as a variable name, so I am using lst instead in my examples.

    http://www.python.org/dev/peps/pep-0008/

    0 讨论(0)
  • 2020-12-18 20:13

    From your line print l, I assume this is python2, where print is not a function, it's a statement.

    0 讨论(0)
  • 2020-12-18 20:20

    The above answers work for Python 2, but not in Python 3 with the changes to both map and the print function.

    The solution I've arrived at to achieve what I wanted map(print, lst) to do in Python 3 is to unpack the list inside of the print call.

    lst = [1, 2, 3]
    print(*lst, sep='\n')
    

    Output:

    1
    2
    3
    

    You can find more detail around this in my answer to Use print inside lambda.

    0 讨论(0)
提交回复
热议问题