【问题标题】:Why can't I use string functions inside map()?为什么我不能在 map() 中使用字符串函数?
【发布时间】:2012-06-11 03:47:52
【问题描述】:

以下示例显示了我尝试在函数调用中使用字符串函数来映射时遇到的错误。我需要帮助了解为什么会发生这种情况。谢谢。

>>> s=["this is a string","python python python","split split split"]
>>> map(split,s)
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    map(split,s)
NameError: name 'split' is not defined

虽然split()是一个内置函数,但还是会抛出这个错误?

【问题讨论】:

    标签: python string map python-3.x


    【解决方案1】:

    如果您使用str.split(),它将正常工作

    即,

    s = ["this is a string","python python python","split split split"]
    map(str.split, s)
    

    给予:

    [['this', 'is', 'a', 'string'],
     ['python', 'python', 'python'],
     ['split', 'split', 'split']]
    

    错误消息指出:NameError: name 'split' is not defined,因此解释器无法识别split,因为split 不是built-in function。为了使其工作,您必须将 split 与内置的 str 对象相关联。

    更新:根据@Ivc 的有用 cmets/suggestions 改进了措辞。

    【讨论】:

    • 不是为了消除歧义,而是因为它是一个字符串方法——'blah'.split('a')等价于str.split('blah', 'a'),同样instanceofmyclass.mymethod(arg)等价于MyClass.mymethod(instanceofmyclass, arg)——字符串是@ 987654334@ 参数为str.split
    • 这有点丑。我宁愿将方法称为方法,例如map(lambda x: x.split(), s),或者更好,直接去[x.split() for x in s]
    • @AshwiniChaudhary 就是这样。由于我们经常将split 附加到字符串上,因此通常很清楚我们指的是哪个split
    • @isbadawi 你因为美学而投反对票??我没有选择这个代码结构。我的帖子是直接回应 OP 发布的内容,并准确回答了他的担忧。如果您不喜欢他的代码,但为什么要否决 my 答案来解释他提出的问题?他没有要求替代代码结构,而是解释为什么他的代码不起作用。我相信我正确地解释了这一点。您在上面对我的评论真的应该是对页面顶部的 OP 的评论。
    • @isbadawi 我的回答已经明确指出 split 不是内置的。我不对你认为的“hacky and unpythonic”负责..这些 cmets 应该针对 OP。您也可以发布自己的答案(为什么不呢?)。我不关心这两点,更多的是我上面解释的对我没有意义的推理,所以没有必要进一步讨论。
    【解决方案2】:

    split 不是内置函数,尽管str.split 是内置对象的方法。通常,您会将 split 作为str 对象的方法调用,这就是直接绑定它的原因。

    检查解释器的输出:

    >>> str
    <type 'str'>
    >>> str.split
    <method 'split' of 'str' objects>
    

    【讨论】:

    • 我不认为这是正确的(str.stplit 是一个内置函数)。此处未列出:docs.python.org/library/functions.html,并与str关联cleary,所以是一个方法。
    • @Jeff 我为你改成了那个。
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2020-11-17
    • 2023-03-16
    • 1970-01-01
    • 2023-03-30
    • 2015-10-13
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多