我正在尝试一个问题:“定义一个名为myfunc的函数,它接受一个字符串,并返回一个匹配的字符串,其中每个偶数字母都是大写的,每个奇数字母都是小写的。假设传入的字符串只包含字母,并且不要不要担心数字,空格和标点符号。输出字符串可以以大写或小写字母开头,只要字母在整个字符串中交替。“所以,我尝试了以下代码块:
def myfunc(word):
i = 0
while i!=len(word):
if (i+1)%2 == 0:
word[i] = word[i].upper()
i+=1
return word
但python解释器抛出一个错误,其中说:
TypeError:'str'对象不支持项目分配
那么这个问题的解决方案应该是什么呢?
字符串不是列表,您不能将字符分配给索引。那是因为字符串是不可变的 - 一旦创建,你永远不能改变它们。您可能认为可以,但无论何时,您都可以创建一个新字符串并将其指定为相同的名称。
至于你的问题,一个解决方案是创建一个列表,在其中存储你想要新字符串组成的字符,然后在最后创建一个新的字符串:
def myfunc(word):
chars = [] # an empty list
for index, char in enumerate(word): # this makes the whole indexing thing easier
if index % 2 == 0:
chars.append(char.lower())
else:
chars.append(char.upper())
return "".join(chars)
请注意,我在两种情况下都更改了大小写,因为根据问题语句,传入的字符串可能已经是全部大写。
您也可以创建新的字符串而不是使用列表(即将chars
定义为空字符串并执行例如chars += char.lower()
),但是在最终返回完整字符串之前,这将创建许多不同大小的字符串 - 但它可以工作,但不是效率很高。如果效率是您所追求的,请尝试以下版本:
def myfunc(word):
return "".join(
char.upper() if index % 2 else char.lower()
for index, char in enumerate(word)
)
除了提供的答案之外,还有另一种选择:
from itertools import cycle
def myfunc(word):
funcs = cycle((str.lower, str.upper))
return ''.join(next(funcs)(char) for char in word)
例:
import string
print(myfunc(string.ascii_lowercase))
输出:
'aBcDeFgHiJkLmNoPqRsTuVwXyZ'
字符串是不可变的,不支持项目分配。尝试将str转换为list或bytearray或smth else mutable,应用操作并将其转换回str。
def myfunc(word):
array = [c for c in word] # inefficient, but wotks
while i!=len(word):
if (i+1)%2 == 0:
array[i] = array[i].upper()
i+=1
return "".join(array) # convert list into string
qazxsw poi是一个不可变类型,你不能指定它的索引。您可以重用已完成的大部分工作,但是将以下字符串转换为列表然后再加入:
str
或者你可以继续构建新的字符串:
def myfunc(word):
templist = list(word)
i = 0
while i!=len(templist):
if (i+1)%2 == 0:
templist[i] = templist[i].upper()
i+=1
return ''.join(templist)