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

Python While循环语句-不同的答案,python,python-3.x,while-loop,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 另外,如果我替换该行,为什么不出现相同的结果 t = t + s[i + 1] + ' ' 与 因为t=s[i]+' 决心。谢谢你的帮助 我没有详细查

以这个函数为例

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
另外,如果我替换该行,为什么不出现相同的结果

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

因为
t=s[i]+'


决心。谢谢你的帮助

我没有详细查看您的代码,但是有一种更简单的方法来编写您所说的函数:

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

print spaced_word( 'abcde' )
印刷品:

a b c d e
编辑:好的,现在我看了你的代码,看看我是否能回答你的直接问题,答案是不,我不能。那代码太复杂了。(对不起!)这类代码的复杂性应该会让你退一步问:“难道没有更简单的方法来实现这一点吗?”

我这样说是不是不友善?如果是这样,我真诚地道歉。但有时您只需要扔掉代码,用一种更简单的方法重新开始。是的,我知道这是从谦卑的个人经验,扔掉了很多我自己的代码

一些危险信号:

  • 在两个不同的位置,空格被追加到输出字符串

  • 有三个不同的位置可以将字符附加到输出中。字符串的第一个字符得到特殊处理,最后一个字符也得到特殊处理

  • 运行到字符串长度减2的循环

在Python中,就像在Ruby和JavaScript中,可能还有很多其他语言中一样,当您需要在一些其他项目之间插入一些东西,而在最后没有额外的“东西”时,首先要查看的是
join()
函数或方法。在这些语言中的每种语言中,它都接受一个数组并在每个数组元素之间插入一个字符串。这是做这种手术的好方法

考虑到这一点,剩下的唯一事情就是将原始字符串转换为数组(Python中的列表)。你这样做的方式各不相同。在Python中,您可以使用
list(string)
——尽管您甚至不需要这样做,因为Python字符串是可编辑的,您可以像使用Python列表一样直接对它们执行
join
。(感谢@Blckknght指出这一点。)在Ruby或JavaScript中,它是
string.split(“”)
——有趣的是,这两种语言的语法是相同的

然后,您只需获取结果,并使用该语言的适当语法对其执行
连接(“”)
。这三种语言的代码非常相似

红宝石:

JavaScript:

function spacedWord( s ) {
    return s.split('').join(' ');
}
Python:

def spaced_word( s ):
    return ' '.join( s )
或者让它更类似于其他两种语言:

def spaced_word( s ):
    return ' '.join( list(s) )
这提出了一个(希望如此)有趣的观点。我使用Python代码的第一种方法是使用显式的
列表的第二个版本。我最近一直在用JavaScript、Python和Ruby编写代码,但最近一周左右的时间主要是JavaScript。因此,当我编写一些Python代码时,我自然而然地采用了一种更具JavaScript风格的方法:首先将字符串转换为数组(列表),然后对其调用
join
。在JavaScript中,不能直接对字符串调用
join
。但是在Python中你可以

也许在您的代码中发生了类似的事情?使用仔细的逐字符循环编写它的方式是如何使用C和其他一些语言。将编码模式从一种语言延续到另一种语言是一种自然趋势,就像我从JavaScript思维编写Python代码一样

就我自己而言,我知道我必须不断地与之抗争,并思考我目前使用的语言以及它提供的功能。Python与Ruby、JavaScript和其他类似语言一起,提供了丰富的字符串和数组/列表操作函数,因此在编写更详细的代码之前,您可以先查看这些函数。

内存变量s

有一个值类似于“hello”表示s='hello'

您正在内存中存储每个带空格的字母的大于值的变量“t”

s[i] + ' ' + s[i + 1] + ' '
s[1] = ' ' + s[1 + 1] + ' '
s[1] = ' ' + h        + ' '
s[1] = ' h '    // here you are getting space before & after  s[1 + 1]
所以你的结果就像“He l o”

while t = t + s[i + 1] + ' '
gives result 'h e l l o '

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

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

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

  • 首先,它生成一个新字符串,其中包含前一个值
    t
    的副本,并在末尾连接一个空格。这是一个临时值,不绑定到任何变量名
  • 然后创建第二个新字符串,复制步骤1中的字符串,并将
    s
    中的字符连接到末尾。Python可能足够聪明,可以重用第一步中的临时字符串,而不是复制它,但这通常不是您可以依赖的
  • 最后,由上面步骤2创建的字符串被绑定到变量
    t
    ,替换已经存在的旧字符串(该字符串将被垃圾收集,因为没有其他对它的引用)
  • 您建议的替代代码,
    s[i+1]+“”
    创建了一个新字符串,但它对它没有任何作用。它没有分配给任何对象,因此会立即进行垃圾收集。重要的是要理解
    s[i+1]+“
    不会更改字符串
    s
    。即使尝试使用不同的语法,比如
    s[i+1]+=”
    ,它也不会工作,不过在这种情况下,您会得到一个异常

    下面是代码的一个略为类似Python的版本,这可能会使其功能更加清晰:

    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循环和显式索引。这更容易理解。我还使用了
    +=
    操作符,而不是
    
    
    s[i] + ' ' + s[i + 1] + ' '
    s[1] = ' ' + s[1 + 1] + ' '
    s[1] = ' ' + h        + ' '
    s[1] = ' h '    // here you are getting space before & after  s[1 + 1]
    
    while t = t + s[i + 1] + ' '
    gives result 'h e l l o '
    
    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
    
    def spaced_word(s):
        return " ".join(s)