强盗';python错误中的s语言
我是Python的初学者 我有一个函数检查它是否是元音强盗';python错误中的s语言,python,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”) 当我试图通过将robber(“asdf”)传递到函数中来运行它时,会得到一个空行和“进程已完成,退出代码为
def vowel(x):
if(x=='a' or x=='e' or x=='i' or x=='o' or x=='u'):
return True;
else:
return False;
还有一个函数,它试图使用上面的元音函数将字符串转换为强盗语言。(转换的算法是将每个辅音加倍,并在两者之间放置一个“o”)
当我试图通过将robber(“asdf”)传递到函数中来运行它时,会得到一个空行和“进程已完成,退出代码为0”
我怀疑可能有多个错误,但程序在语法上是正确的。你能帮我一下吗?你应该把附加到
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
以及:
如果要避免所有附加/覆盖错误(并获得更好的性能/避免字符串串联),最好开始使用列表理解编写这些错误:
text = "asdf"
new_text = "".join([c if c in "aeiou" else "{0}o{0}".format(c) for c in text])
print(new_text)
结果:
asosdodfof
新文本是一个使用三元表达式构建的列表理解的连接列表(创建字符串):如果是元音,则不要使用字母,否则创建模式。首先,您的问题是
在s=s.join([c,'o',c])
行上,您实际上每次都在替换s
的内容。我想你想做的是将它附加到s
,所以我会使用s+=“”。join([c,'o',c])
另外,join
的使用是错误的-连接前的字符串位于给定列表中每两个元素之间,而不是第一个元素之前
因此,正如我所说,正确的做法应该是:
s += "".join([c, 'o', c])
免责声明:未测试
代码可读性
正如您所说的,您是一名初学者,让我给您一些关于您的编码风格的提示(Python的编码风格非常独特)
1.
您可以执行以下操作,而不是执行x=='a'或x=='e'或x=='i'或x=='o'或x=='u'
:
`if x in 'aeiou':`
更容易理解,阅读效果更好
2.
做:
如果…:
返回真值
其他的
返回错误
他很笨拙。尝试:
return ...
就你而言:
return x in 'aeiuo'
条件已经是布尔值(
True
或False
)-无需重新计算;) 这种行为是正确的。您似乎期望打印输出。为什么?下面是如何在Python中执行元音检查:def vowel(x):在“aouie”中返回x
可疑行:s=s.join([c,'o',c])
@DYZ如果您确实希望它作为函数,您也可以使用元音='aeiou'。.\u包含.\u@StefanPochmann我不建议任何人使用以双下划线开头和结尾的符号。@schwobaseggle:我想我们同时看到了错误。'o'。join([c,c]))
更短:-)c+'o'+c
更高效。更高效的是预先创建列表理解,而不是将生成器传递给join
不要忘记大写字母def元音(x):返回x.lower()(不是针对这种情况,而是因为作者是一个初学者——列表理解对于新手来说有点复杂)@也许是YotamSalmon,但当您习惯了它时,用listcomp重写一个不可靠的代码要比试图理解流控制为什么会被破坏更快。我也有过调试初学者代码的经验。现在我试着展示应该如何做。
`if x in 'aeiou':`
return ...
return x in 'aeiuo'