【问题标题】:Behaviour of Python when attempting to iterate over characters in a string尝试迭代字符串中的字符时 Python 的行为
【发布时间】:2017-09-04 14:58:20
【问题描述】:

我正在尝试使用 for 循环遍历以下字符串:

>>> for a,b,c in "cat"
        print(a,b,c)

现在我打算这样做是在一个物理行上单独打印字符串中的每个字符,而不是收到一个错误。我知道这很容易通过将字符串包含在列表运算符[]中来解决:

>>> for a,b,c in ["cat"]
        print(a,b,c)
c a t

但是有人可以解释为什么会这样吗?

【问题讨论】:

  • 为什么要使用三个变量来接收循环值?每次迭代你只有 一个 字符。
  • 这是一个实验,看看我是否可以在一个物理行上打印字符串,而无需使用end=" "@MartijnPieters 修改打印语句
  • 但是你没有循环,是吗?只需使用a, b, c = 'cat'。或者只是使用 print(*'cat') 将字符串作为单独的参数打印。
  • 澄清一下:我想使用 for 循环在一个物理行上打印/输出字符串。空闲的好奇心。

标签: python string python-3.x for-loop iteration


【解决方案1】:

您在两个代码块中迭代不同的对象。 在前一个中,您迭代字符串,这可能被认为是special list

在后一个中,您迭代了仅包含一个对象“猫”的list

您可以将第一个更改为以下:

for ch in 'cat':
    print(ch)

请随时询问有关此问题的更多信息。

【讨论】:

    【解决方案2】:

    for 循环遍历您提供的可迭代对象中的每个元素并尝试执行分配。

    在第一种情况下,由于您的可迭代对象是 'cat',因此您实际上是在拆包:

    a, b, c = 'c'
    

    第一次迭代期间并获得相应的错误消息:

    ValueError: not enough values to unpack (expected 3, got 1)
    

    因为你将迭代 3 次;一次字符串中的每个字符 'cat'

    在第二种情况下,您按预期解包"cat",因为列表有一个元素(即'cat'),它被检索并解包到a, b 和@987654329 @。

    【讨论】:

      【解决方案3】:

      您告诉for 扩展每个迭代值以分配给三个单独的变量:

      for a,b,c in "cat":
      #   ^^^^^ the target for the loop variable, 3 different names
      

      但是,对字符串的迭代会产生一个带有单个字符的字符串,您不能将单个字符分配给三个变量:

      >>> loopiterable = 'cat'
      >>> loopiterable[0]  # first element
      'c'
      >>> a, b, c = loopiterable[0]
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ValueError: not enough values to unpack (expected 3, got 1)
      

      错误消息告诉您为什么这不起作用;您不能从长度为 1 的字符串中取出三个值。

      当您将字符串放入列表时,您更改了循环内容。您现在有一个包含一个元素的列表,因此循环只迭代一次,单次迭代的值是字符串'cat'。该字符串只是碰巧有3个字符,因此可以分配给三个变量:

      >>> loopiterable = ['cat']
      >>> loopiterable[0]  # first element
      'cat'
      >>> a, b, c = loopiterable[0]
      >>> a
      'c'
      >>> b
      'a'
      >>> c
      't'
      

      如果包含的字符串有不同数量的字符,这仍然会失败:

      >>> for a, b, c in ['cat', 'hamster']:
      ...     print(a, b, c)
      ...
      c a t
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ValueError: too many values to unpack (expected 3)
      

      'hamster' 是 7 个字符,而不是 3 个; 4 太多了。

      正确的解决方案是只使用 one 变量作为循环目标,而不是 3:

      for character in 'cat':
          print(character)
      

      现在您将分别打印每个字符:

      >>> for character in 'cat':
      ...     print(character)
      ...
      c
      a
      t
      

      现在,如果您想将字符串的所有字符作为单独的参数传递给 print(),只需使用 * 扩展字符串以分隔调用的参数:

      >>> my_pet = 'cat'
      >>> print(*my_pet)
      c a t
      

      【讨论】:

        猜你喜欢
        • 2019-07-15
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 2020-07-23
        相关资源
        最近更新 更多