我正在阅读Eric Matthes的Python Crash Course并做一些问题集。其中一个给我一些困难,我希望有人可以帮助我。
8-9。魔术师:列出魔术师的名字。将列表传递给名为show_magicians()的函数,该函数在列表中打印每个魔术师的名称。
8-10。伟大的魔术师:从练习8-9开始,你的程序副本。编写一个函数make_great(),通过将 the great 添加到每个魔术师的名字来修改魔术师列表。调用show_magicians()以查看列表是否已实际修改过。
这就是我对8-9的看法:
puts 3
我真的不知道该为8-10做什么
答案 0 :(得分:2)
要执行此操作,您可以附加到字符串并重新分配以在每个元素的末尾添加单词:
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
这是如何工作的,我们使用'counter'for循环,类似于C语言中的那些(你也可以在这里使用enumerate
),它通过使用下标循环遍历每个元素。然后它将字符串“the great”附加到所有元素。
您不能只执行简单的for-in
循环并修改这些值的原因是因为for-in
在in
之前复制变量中的值:
for magician in list_magicians: # magician is a temporary variable, does not hold actual reference to real elements
如果它们没有实际引用,则无法修改引用,因此需要使用计数器循环来通过下标访问实际引用。
答案 1 :(得分:1)
好的,您已经知道如何遍历列表。你想做一个类似的功能,你修改我的magician
引用的字符串来说,"伟大的"。
所以,如果你有一个字符串" Smedley"你想把它改成一个字符串" Smedley the Great"你会怎么做?
<强>更新强>
所以现在无论如何已经给出了答案,还有其他几个选项更具功能性&#34;并且可以说更安全,因为你可以防止混叠等。
选项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(除非你使用{{1}无论如何只是制作副本。如果您想要非常挑剔,可以重新执行以下任一选项,以便在我的情况下将新列表分配给MutableString
,或者在您的mages
中分配。{/ p>
答案 2 :(得分:1)
问题要求您修改magician_names
。由于magician_names
中的每个条目都是magician_names
,而str
是不可修改的,因此您无法通过附加strs
来简单地修改str
中的每个magician_names
它。相反,您需要使用修改后的版本替换<{em> " the great"
中的每个str
。
所以这看似简单的方法:
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)
指向的str
个对象,因此会根据需要修改magician_names
。
<小时/> 对你的评论,
magician_names
只是Pythonic的写作方式:
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)
中的每个元素生成匹配的index, element
对。