python错误中的强盗语言

时间:2017-02-05 21:00:50

标签: python

我是Python的开始。

我有一个检查它是否是元音的函数。

def vowel(x):
if(x=='a' or x=='e' or x=='i' or x=='o' or x=='u'):
    return True;
else:
    return False;

一个尝试使用上面的元音函数将字符串转换为强盗语言的函数。 (转换算法是将每个辅音加倍并在其间放置一个" o&#34 ;.

def robber(text):
    s=""
    for i,c in enumerate(text):
       if vowel(c)==False:
           s=s.join([c,'o',c])
    return s;

当我尝试通过将强盗(" asdf")传递给该函数来运行它时,我得到一个空白行"处理完成,退出代码为0"

我怀疑可能存在多个错误,但程序在语法上是正确的。你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

您应该追加s,而不是分配还附加 c,如果不是元音:

def robber(text):
    s=""
    for i,c in enumerate(text):
        if vowel(c)==False:
            s += ''.join([c,'o',c])
        else:
            s += c
    return s

此外还有一些补充意见:

  • 更多 Pythonic 使用not代替== False;
  • 您不需要使用enumerate(..),因为i从未使用过;
  • 如果测试成功/失败,您不需要return Truereturn False,只需返回条件;和
  • 您可以更优雅地重写vowel(..)robber(..)功能。

所以把它放在一起:

def vowel(x):
    return x.lower() in ('a','e','i','o','u')

def robber(text):
    return ''.join([c if vowel(c) else ''.join((c,'o',c)) for c in text])

答案 1 :(得分:2)

如果你想避免所有那些追加/覆盖错误(并获得更好的性能/避免字符串连接),最好开始使用列表理解来编写它们:

text = "asdf"

new_text = "".join([c if c in "aeiou" else "{0}o{0}".format(c) for c in text])

print(new_text)

结果:

asosdodfof

新文本是使用三元表达式构建的列表推导的连接列表(创建字符串):如果是元音则保留字母,否则创建模式。

答案 2 :(得分:1)

首先,你的问题

s=s.join([c,'o',c])行上,您实际上每次都替换 s的内容。我认为你想要做的是追加它到s,所以我会使用s += "".join([c, 'o', c])

同样使用join是错误的 - 连接之前的字符串位于给定列表中的每两个元素之间,而不是第一个元素之前。

所以,正如我所说,正确的形式应该是:

s += "".join([c, 'o', c])

免责声明:未经测试。

代码可读性

正如你所说,你是初学者,让我给你一些关于你的编码风格的提示(Python的编码风格非常独特)。

1

而不是x=='a' or x=='e' or x=='i' or x=='o' or x=='u',您可以:

`if x in 'aeiou':`

更容易理解,读得更好。

2

操作:     如果...:         返回True     其他         返回错误

非常笨拙。尝试:

return ...

在你的情况下:

return x in 'aeiuo'

条件已经是布尔值(TrueFalse) - 无需重新评估它;)