关于frozenset()和map()的问题

第一个问题,内置函数frozenset()接收的参数是一个可迭代对象,可为什么下面的写法没有报错呢,我对map()函数的理解是map()函数遍历第二个参数然后放到第一个参数函数里,最后返回一个列表,如果是这样的话应该会报错的啊。
第二个问题,把上面的结果传到list()函数中报错了,这又是什么原因呢。
clipboard.png

刚开始学python,谢谢各位大大~~
环境python3,windows7

阅读 7.3k
3 个回答

没报错是因为map的__init__定义如下,所以list是合法的参数,但是启动时自然frozenset就报错了:

def __init__(self, func, *iterables): # real signature unknown; restored from __doc__
    pass

Python 2 map 返回 list object, Python 3 map 返回 map object 且只能使用一次:

def foo(bar):
    return bar
A = map(foo, [1, 2])

for i in A:
    print(i)

for i in A:
    # 不会执行到这里
    print(i)

如果想和以前一样, Wraps map() in a list call. It also changes map(None, x) to list(x). Using from future_builtins import map disables this fixer.

def foo(bar):
    return bar
A = list(map(foo, [1, 2]))

for i in A:
    print(i)

for i in A:
    print(i)

你用的是 python 3 吧,以后提问问题最好把环境说清楚

python3 里面 map 不再是一个函数,而是一个类,返回的 map 对象是一个迭代器,所以你在执行第一句的时候并没有报错;而在你将其传给 list 的时候,迭代器执行了,就报错了

map高阶函数会返回一个map对象,也是一个迭代器,你启动迭代器之前,它不会报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏