一直试图从Java过渡到Python,但是我在编写迭代字符串的循环时遇到了困难 如您所见,我尝试访问每个索引以检查其大小写。如果那封信是大写的,那么我们将其小写,反之亦然 如果我已经对该特定索引进行了更改,我不确定为什么它会返回一个未更改的字符串
def swap_case(s):
for x in range(len(s)):
if s[x].isupper():
s[x].lower()
if s[x].islower():
s[x].upper()
return s
答案 0 :(得分:3)
如果s是字符串,您可以执行以下操作:
def swap_case(s):
return s.swapcase()
话虽如此,如果您正在做的事情,我认为您不需要创建一个函数。您只需在字符串上调用.swapcase(),而不是将其传递给函数。
答案 1 :(得分:1)
在Python中,字符串是不可变的。因此,您可以将列表理解与.join
:
def swap_case(s):
return ''.join([i.lower() if i.isupper() else i.upper() for i in s])
答案 2 :(得分:1)
对于递归解决方案:
def swap_case(s):
if not s: # empty string
return s
head, tail = s[0], s[1:]
if head.isupper():
return head.lower() + swap_case(tail)
else:
return head.upper() + swap_case(tail)
这在Python中并不理想(通常在引擎盖下实现递归),但对于合理大小的字符串来说并不是那么糟糕。
答案 3 :(得分:0)
正如评论所提到的,s[x].lower()
返回一个新字符串,由于字符串是不可变的,因此无法分配。所以你需要积累一个新的字符串。
def swap_case(s):
s0 = ""
for x in range(len(s)):
if s[x].isupper():
s0 += s[x].lower()
elif s[x].islower():
s0 += s[x].upper()
return s0
你也可以用lambda迭代它,这将更简洁。
def swap_case(s):
s0 = map(lambda x: x.lower() if x.isupper() else x.upper(), s)
return ''.join(s0)
答案 4 :(得分:0)
在python中,你不需要遍历像for x in range(len(s))
这样的字符串。相反,python可以更简洁for char in message
。此外,if
子句看起来应该跟elif
和else
(非字母字符)。下面的代码适用于短消息,因为+=
每次都会重新发送字符串,因为它是一个不可变类型。如果这会影响您的计划速度,请考虑使用str.join()
。
def swap_case(message):
swapped_message = ''
for char in message:
if char.isupper():
swapped_message += char.lower()
elif char.islower():
swapped_message += char.upper()
else:
swapped_message += char
return swapped_message
答案 5 :(得分:0)
请参阅代码中的以下两条陈述:
s[x].lower()
s[x].upper()
s[x]
NOT 这个(你可能认为):
+------+------+-----+------+-----+-------------+
| s[0] | s[1] | ... | s[x] | ... | s[len(s)-1] |
+------+------+-----+------+-----+-------------+
^^^^
但是 new 1个字符的字符串只包含原始字符串x
中的s
th 字符:
+------+------+-----+------+-----+-------------+
| s[0] | s[1] | ... | s[x] | ... | s[len(s)-1] |
+------+------+-----+------+-----+-------------+
copy of s[x]
(another place in the memory):
+------+
| |
+------+
^^^^
as 不允许更改字符串中的字符。
所以你改变了 1个字符的字符串的情况,保持原始字符串s
不变。
注意:
s = "apple"
s = "orange"
完全没问题 - 第二个语句没有将 "apple"
更改为"orange"
,但创建了新字符串 "orange"
在内存中的其他位置,然后用s
标记这个新位置(...最初是字符串“apple”的标签) 。