我正在尝试创建一个函数,该函数将接受一个字符串并将大写字母转换为小写字母,将小写字母转换为大写字母。
我尝试过制作函数,但问题是如何告诉函数只运行每个字符一次。该函数贯穿字符串,但在将大写/小写更改为大写/小写后,它会将其更改回原来的样子。
def uppertolower (string):
list1 = []
for p,l in enumerate(string):
if p == l.upper():
l = l.lower()
elif p == l.lower():
l = l.upper()
list1.append(l)
return ''.join(list1)
运行了以下内容:
uppertolower('AppLe')
切割结果:AppLe
预期成果: aPPlE
任何帮助将不胜感激。谢谢。
您的循环不需要将p
与enumerate
一起使用。enumerate
将索引可迭代对象的值,因此始终是一个数字。
你无法比较...
p == l.upper() # or l.lower()
。成功,因为您将数字与字符串进行比较。我假设根据您的描述,您要检查字母是大写还是小写。您应该将其与自身进行比较:
def uppertolower(string):
list1 = []
for l in string:
if l == l.upper():
l = l.lower()
elif l == l.lower():
l = l.upper()
list1.append(l)
return ''.join(list1)
正如其他答案所指出的那样,您可以通过将elif l == l.lower():
更改为简单else:
来保存比较,因为即使像数字这样的字符在调用str.upper
时也不会改变。
作为旁注,str.swapcase
方法的存在是为了字符串完成函数的功能。
另外,我建议您使用更具描述性的变量名称,例如char
或letter
,而不是模棱两可的l
(尽管很明显l
代表letter
,在某些字体中可能会被误认为是大写I
或数字1
)。
你做错了。无需使用enumerate
:
def uppertolower (string):
list1 = []
for l in string:
if l == l.upper():
l = l.lower()
else:
l = l.upper()
list1.append(l)
return ''.join(list1)
但是,有一种简单的方法可以做到这一点。使用列表推导式:
def uppertolower(string):
return "".join([l.lower() if l == l.upper() else l.upper() for l in string])
或者更简单地说,使用swapcase
:
>>> a = "AppLe"
>>> a.swapcase()
'aPPlE'
>>>
输出:
>>> uppertolower("AppLe")
'aPPlE'
>>>
p
存储当前元素的索引,即l
。因此,将string
和integer
进行比较是没有意义的。
即使在修复后,也可以通过使用isupper
和islower
函数显着缩短代码。
def uppertolower (x):
list1 = []
for l in x:
if l.isupper():
l = l.lower()
else:
l = l.upper()
list1.append(l)
return ''.join(list1)