Python速成课程8-10

时间:2016-09-05 22:34:06

标签: python

我正在阅读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做什么

3 个答案:

答案 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-inin之前复制变量中的值:

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对。