【问题标题】:How does "for" define a variable in a function?“for”如何定义函数中的变量?
【发布时间】:2013-02-10 18:28:07
【问题描述】:

我正在尝试定义一个函数来查找句子中单词的平均长度。一切都很好,但我只是询问了我的功能的某些部分,即:

random_sentence = str(input('Enter a sentence:'))

def average():
    'Takes the average length of a word in a sentence inputed by user.'
    words = random_sentence.split()
    averageword = sum(len(word) for word in words)/len(words)
    return averageword

print(average())

averageword = sum(len(word) for word in words)/len(words)

我了解 sum 和 len 的作用,但是,Python 如何知道“for word in words”中的“单词”是什么。它是在某处预定义的吗?当我把这句话拿出来时,功能就起作用了,因为它会说单词没有定义。感谢您的澄清。

【问题讨论】:

    标签: python function variables sum


    【解决方案1】:

    foris a keyword in Python.

    当 Python 执行程序时,它会将文件转换为一系列带有lexical analysis令牌。之后,令牌获得parsed 以确定它们属于哪个构造。

    在您的情况下,for 之前的expression token 使构造成为generator expression

    【讨论】:

    • 该死的甜蜜答案! +1 糟糕!
    【解决方案2】:

    列表words 是一个可迭代的——它定义了一个__iter__ 方法,该方法返回列表的迭代器。 for 关键字在列表上调用__iter__(),然后在迭代器上调用next(),直到抛出StopIteration 异常:

    In [1]: words = ["a", "b"]
    
    In [2]: i = words.__iter__()
    
    In [3]: i
    Out[3]: <listiterator at 0x5cd82b0>
    
    In [4]: i.next()
    Out[4]: 'a'
    
    In [5]: i.next()
    Out[5]: 'b'
    
    In [6]: i.next()
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-6-e590fe0d22f8> in <module>()
    ----> 1 i.next()
    
    StopIteration:
    

    关于可迭代对象和迭代器的更多细节:

    http://docs.python.org/2/library/stdtypes.html#iterator-types http://getpython3.com/diveintopython3/iterators.html#a-fibonacci-iterator

    【讨论】:

      【解决方案3】:

      for x in y 要求 y 是可迭代的(即列表、字典、字符串等)

      然后python遍历y,每次迭代x定义为y[iteration#]

      基本上如果 y = [1,2,3]

      for x in y:
          print x
      

      会回来

      1

      2

      3

      【讨论】:

      • 那是for循环,示例程序中没有用到。
      • 是的,但是它是相同的东西,但形式略有不同——python 对 for 关键字的处理方式相同
      • for 循环和生成器表达式之间存在显着差异。 for 循环分配给局部变量,而生成器表达式分配给临时(内部)变量。另外,请注意from __future__ import print_function;for x in [1,2,3]: print(x);(print(x) for x in [1,2,3]):除非生成器表达式稍后被使用,否则不会对其进行评估。
      【解决方案4】:

      “word”在列表推导和生成器表达式以及 for 循环中本地定义。这就像一个临时变量。

      用 'x' 代替 'word' 来这样想:

      theSum = sum([len(x) for x in words]) 
      

      (我在它周围加上括号以表明它就像一个列表)。这意味着“让 x 成为列表 'words' 中的一个元素。对于每个 x,计算它的长度并根据结果制作一个列表。”

      你也可以这样想:

      list = []
      for x in words:
          list.append(len(x))
      
      theSum = sum(list)
      

      你可以在List Comprehensions获得一些关于语法的血腥细节

      【讨论】:

      • 该问题实际上不包含任何列表推导(注意没有括号)。其中for 的出现属于生成器表达式,它们是列表推导的近亲。
      • 注明。我把“发电机”这个词放在那里更准确。
      • 抱歉,这也不是generator
      • 问题:“Python 如何知道“单词中的单词”中的“单词”是什么。它是在某处预定义的吗?答:不,它不是预定义的,而是语法的,它被视为临时变量,并且在 for 循环、列表推导和生成器表达式中以这种方式完成。
      • @Jeremey 再次,很抱歉吹毛求疵,但这也不准确。在 Python 2 中,x 只是生成器表达式中的一个临时变量。列表推导和 for 循环分配给局部变量。在 Python 3 中,列表推导式也使用临时变量。
      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多