我目前正在阅读Eric的Python速成班,并做一些习题集。其中一个给了我一些困难,我希望有人能帮我解决这个问题。
8-9.魔术师:列出魔术师的名字。将列表传递给一个名为show_magicians()的函数,该函数将打印列表中每个魔术师的名称。 8-10。伟大的魔术师:从练习8-9开始你的程序副本。编写一个函数make_great(),通过在每个魔术师的名字中添加伟大的词组来修改魔术师的列表。调用show_magicians()以查看列表实际上已被修改。
这就是我8-9所拥有的:
magician_names=['Alice', 'Alex', 'Blake']
def show_magicians(n):
for magician in n:
print (magician)
show_magicians(magician_names)我只是不知道在8-10岁的时候该怎么办
发布于 2016-09-05 22:37:08
要做到这一点,您可以追加到一个字符串并重新分配,以便将单词添加到每个元素的末尾:
magician += " the great"在这里,+=操作符追加一个字符串,然后重新分配,这相当于以下内容:
magician = magician + " the great" 现在,您可以将其添加到如下函数中:
def make_great(list_magicians):
for i in range(len(list_magicians)):
list_magicians[i] += " the great"
make_great(magician_names)
show_magicians(magician_names)产出如下:
Alice the great
Alex the great
Blake the great它的工作原理是,我们使用一个“计数器”循环,类似于C语言中的循环(您也可以在这里使用enumerate ),它通过使用下标遍历每个元素。然后将字符串“伟大”附加到所有元素中。
您不能只执行一个简单的for-in循环并修改这些值的原因是for-in在in之前将值复制到变量中。
for magician in list_magicians: # magician is a temporary variable, does not hold actual reference to real elements如果它们不包含实际引用,则不能修改引用,因此需要使用计数器循环通过下标访问实际引用。
发布于 2016-09-05 22:38:29
好吧,你已经知道怎么迭代这个列表了。您希望创建一个类似的函数,修改引用到我的magician的字符串,以表示“伟大”。
所以,如果你有一个字符串"Smedley“,你想把它改成字符串"Smedley the Great”,你会怎么做?
更新
所以,既然答案已经给出了,还有其他几种选择,它们更“实用”,而且可以说更安全,因为你受到了保护,免受别名等的影响。
选项1:创建一个新列表,例如:(这些示例是用iPython完成的,这是一个非常方便的工具,值得安装以学习Python)
def make_great_1(lst):
rtn = []
for m in lst:
rtn.append(m+" the Great")
return rtn
In [7]: mages = [ 'Gandalf', 'Mickey' ]
In [8]: make_great_1(mages)
Out[8]: ['Gandalf the Great', 'Mickey the Great']备选案文2:使用列表理解:
In [9]: [ mg+" the Great" for mg in mages ]
Out[9]: ['Gandalf the Great', 'Mickey the Great']现在,问题是修改列表,这很容易想象,这意味着您应该修改字符串,但实际上,Python (除非您使用MutableString)只是复制。如果您想要非常挑剔,可以重新完成这些选项中的任何一个,以便在我的情况下将新的列表分配给mages,或者在您的情况下分配给magician_names。
发布于 2016-09-05 22:38:54
这个问题要求您修改magician_names。由于magician_names中的每个条目都是str,而且strs是不可修改的,所以不能简单地通过在magician_names中添加" the great"来修改magician_names中的每个str。相反,您需要用修改后的版本替换magician_names中的每个magician_names。
所以这个看似简单的方法:
def make_great(l):
for name in l:
name += " the great"
make_great(magician_names)不修改magician_names。它只需创建一个新的str对象,并将其分配给name变量,该变量位于for loop的局部变量中。magician_names的每个元素不变,即它仍然指向同一个str对象。
但这种方法:
def make_great(l):
for index, name in enumerate(l):
l[index] = name + " the great"
make_great(magician_names)更改magician_names指向的magician_names对象,从而根据需要修改magician_names。
对于你的评论,
for index, name in enumerate(l):
l[index] = name + " the great"是毕达克式的写作方式:
for index in range(len(l)):
name = l[index]
l[index] = name + " the great"enumerate(l)返回一个可迭代的(实际上是一个惰性生成器),为l中的每个元素生成一个匹配的index, element对。
https://stackoverflow.com/questions/39338405
复制相似问题