我是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"
我怀疑可能存在多个错误,但程序在语法上是正确的。你能帮我解决这个问题吗?
答案 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
此外还有一些补充意见:
not
代替== False
; enumerate(..)
,因为i
从未使用过; return True
和return 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的编码风格非常独特)。
而不是x=='a' or x=='e' or x=='i' or x=='o' or x=='u'
,您可以:
`if x in 'aeiou':`
更容易理解,读得更好。
操作: 如果...: 返回True 其他 返回错误
非常笨拙。尝试:
return ...
在你的情况下:
return x in 'aeiuo'
条件已经是布尔值(True
或False
) - 无需重新评估它;)