我想回答一个关于堆叠溢出的相当简单的问题。原始代码(不是我的):
def to_alternating_case(string):
for char in string:
if ord(char) in range(97, 123):
string.replace(char, string.upper())
elif ord(char) in range (65,91):
string.replace(char, string.lower())
elif ord(char) in range (32, 48):
continue
else:
return '//Non-alphabetical characters are unaffected'
return string当然,由于字符串是不可变的,而且string.replace不能更改原始字符串,所以返回值仍然是原始字符串(小写和大写应该由原始程序员的意图交换)。因此,我想提出以下简单的解决办法:
def to_alternating_case(string):
for char in string:
if ord(char) in range(97, 123):
string = string.replace(char, string.upper())
elif ord(char) in range (65,91):
string = string.replace(char, string.lower())
elif ord(char) in range (32, 48):
continue
else:
return '//Non-alphabetical characters are unaffected'
return string
print(to_alternating_case("Guten Tag"))但是,我得到的不是新的辛苦赚来的名分和热情的“谢谢”,而是这个例外:
Traceback (most recent call last):
File "main.py", line 14, in <module>
print(to_alternating_case("Guten Tag"))
File "main.py", line 4, in to_alternating_case
string = string.replace(char, string.upper())
MemoryError此刻我真的很困惑。怎么一回事?我没有检查数字,所以目前我希望任何字符串-但不是一个MemoryError。
免责声明:是的,我知道原来的问题可以用单线to_alternating_case = lambda s: ''.join(c.lower() if c.isupper() else c.upper() for c in s)解决。
发布于 2020-04-06 23:51:48
你应该重新考虑这一点:
string = string.replace(char, string.upper())这将用整个字符串的大写版本替换字符,可能不是您想要的。它会变得非常大,非常快,而且可能会耗尽内存。如果发生这种情况,人们会希望Python会发出某种描述的信号:-)
而且,顺便说一下,你应该非常谨慎地考虑修改当前正在迭代的东西的可能性,这往往会导致项目的双重处理,或者丢失项目,典型的情况是:
for item in someList:
if item < 0:
someList.remove(item)实际上,在代码中并不是这样,因为您只是在开始迭代新对象之后将string重新绑定到一个新对象,但这仍然是一个很好的避免习惯,以防它给您带来了错误的安全感。
在这些情况下(在重要的情况下),最好创建一个新项,然后,在构建之后,以某种方式将其重新分配给原始项。
https://stackoverflow.com/questions/61070666
复制相似问题