python - While 循环语句 - 不同的答案

标签 python python-3.x while-loop

因此以这个函数为例。

def spaced_word(s):
    i= 0
    t = s[i] + ' '

    while i < len(s) - 2:
        t = t + s[i + 1] + ' '
        i = i + 1
    t= t + s[len(s) - 1]
    return t

该函数返回输入的字符串,每个字符之间有一个空格。 (例如 spaced_word('hello') --> 'h e l l o')

但是,为什么需要使用t = t + ...作为语句呢?

例如,为什么我不能使用:

s[i] + ' '
i = i + 1

另外,如果我替换该行,为什么不会出现相同的结果

t = t + s[i + 1] + ' '

s[i] + ' ' + s[i + 1] + ' '

因为t = s[i] + ' '

已解决。感谢所有提供帮助的人!

最佳答案

您的问题似乎是关于为什么需要维护一个单独的 t 变量来在循环中构建字符串时保存字符串,而不是直接更改其值。

原因是Python的字符串是不可变的。您无法在现有字符串的两个字母之间插入空格,因为您无法修改该字符串的内容。您想要进行的任何修改都必须通过创建包含原始字符串字符副本的新字符串来完成。

您询问的代码行t = t + ""+ s[i+1] 执行以下操作:

  1. 首先,它创建一个新字符串,其中包含 t 先前值的副本,并在末尾连接一个空格。这是一个临时值,未绑定(bind)到任何变量名称。
  2. 然后创建第二个新字符串,复制步骤 1 中的字符串并将 s 中的一个字符连接到末尾。 Python 可能足够聪明,可以重用第一步中的临时字符串,而不是复制它,但这通常不是您可以依赖的东西。
  3. 最后,上面第 2 步创建的字符串绑定(bind)到变量 t,替换原来存在的旧字符串(该字符串将被垃圾回收,因为没有其他引用)。

您建议的替代代码,s[i + 1] + "" 创建一个新字符串,但它不会对其执行任何操作。它没有分配给任何东西,因此它会立即被垃圾收集。重要的是要了解 s[i+1] + "" 不会更改字符串 s。即使尝试使用不同的语法,例如 s[i+1] += "" 它也不会工作,尽管在这种情况下你会得到一个异常。

这是代码的稍微Pythonic 版本,这可能使其功能更加清晰:

def spaced_words(s):
    result = s[0]           # start with the first letter of the string
    for c in s[1:]:         # iterate over the rest of the string
        result += " " + c   # add a space and the next character to the result
    return result           # when the loop is done, return the result string

for 循环取代了代码中的 while 循环和显式索引。这更容易遵循。我还使用 += 运算符,而不是 result = result + otherstuff,但这实际上并不是主要区别。由于 result 字符串是不可变的,因此每次将新值连接到末尾时通常都需要复制它。然而,CPython(从 python.org 获得的常规解释器)有一些特殊的逻辑用于以这种方式附加到字符串,并且实际上大多数时候会避免复制字符串。但这是一个实现细节,而不是您应该依赖的东西。

最后,我想建议使用内置的 str.join 方法来更轻松、更高效地完成当前函数的操作。它接受任何可迭代对象作为其参数,并且方便地,字符串是其字符的可迭代对象:

def spaced_word(s):
    return " ".join(s)

我意识到虽然这不是你真正的问题,但了解 Python 的内置功能是件好事,它们几乎总是比你自己编写的代码更好地满足你的需要。

关于python - While 循环语句 - 不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17129810/

相关文章:

syntax - 是否有比 `None` 更 Pythonic 的方式更改为 `[]`

python - 使用 PIL 裁剪图像时如何设置坐标?

python - “str”对象不可调用 Django Rest Framework

C++ 文件输入流循环问题

javascript - 在 while 循环中与前缀增量相乘

Python lambda 闭包作用域

python - 轻量级通知技术

python-3.x - 使用 python 3.6 在 LibreOffice 和 Microsoft Word 中打开 *.doc 文件

c - 为什么我的反向函数在 C 中不起作用?

python - 组内的 Pandas 排序导致重复索引