首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python速成班8-10

Python速成班8-10
EN

Stack Overflow用户
提问于 2016-09-05 22:34:05
回答 3查看 2.2K关注 0票数 3

我目前正在阅读Eric的Python速成班,并做一些习题集。其中一个给了我一些困难,我希望有人能帮我解决这个问题。

8-9.魔术师:列出魔术师的名字。将列表传递给一个名为show_magicians()的函数,该函数将打印列表中每个魔术师的名称。 8-10。伟大的魔术师:从练习8-9开始你的程序副本。编写一个函数make_great(),通过在每个魔术师的名字中添加伟大的词组来修改魔术师的列表。调用show_magicians()以查看列表实际上已被修改。

这就是我8-9所拥有的:

代码语言:javascript
运行
复制
magician_names=['Alice', 'Alex', 'Blake']
def show_magicians(n):
    for magician in n:
        print (magician)

show_magicians(magician_names)

我只是不知道在8-10岁的时候该怎么办

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-05 22:37:08

要做到这一点,您可以追加到一个字符串并重新分配,以便将单词添加到每个元素的末尾:

代码语言:javascript
运行
复制
magician += " the great"

在这里,+=操作符追加一个字符串,然后重新分配,这相当于以下内容:

代码语言:javascript
运行
复制
magician = magician + " the great"    

现在,您可以将其添加到如下函数中:

代码语言:javascript
运行
复制
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)

产出如下:

代码语言:javascript
运行
复制
Alice the great
Alex the great
Blake the great

它的工作原理是,我们使用一个“计数器”循环,类似于C语言中的循环(您也可以在这里使用enumerate ),它通过使用下标遍历每个元素。然后将字符串“伟大”附加到所有元素中。

您不能只执行一个简单的for-in循环并修改这些值的原因是for-inin之前将值复制到变量中。

代码语言:javascript
运行
复制
for magician in list_magicians: # magician is a temporary variable, does not hold actual reference to real elements

如果它们不包含实际引用,则不能修改引用,因此需要使用计数器循环通过下标访问实际引用。

票数 2
EN

Stack Overflow用户

发布于 2016-09-05 22:38:29

好吧,你已经知道怎么迭代这个列表了。您希望创建一个类似的函数,修改引用到我的magician的字符串,以表示“伟大”。

所以,如果你有一个字符串"Smedley“,你想把它改成字符串"Smedley the Great”,你会怎么做?

更新

所以,既然答案已经给出了,还有其他几种选择,它们更“实用”,而且可以说更安全,因为你受到了保护,免受别名等的影响。

选项1:创建一个新列表,例如:(这些示例是用iPython完成的,这是一个非常方便的工具,值得安装以学习Python)

代码语言:javascript
运行
复制
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:使用列表理解:

代码语言:javascript
运行
复制
In [9]: [ mg+" the Great" for mg in mages ]
Out[9]: ['Gandalf the Great', 'Mickey the Great']

现在,问题是修改列表,这很容易想象,这意味着您应该修改字符串,但实际上,Python (除非您使用MutableString)只是复制。如果您想要非常挑剔,可以重新完成这些选项中的任何一个,以便在我的情况下将新的列表分配给mages,或者在您的情况下分配给magician_names

票数 1
EN

Stack Overflow用户

发布于 2016-09-05 22:38:54

这个问题要求您修改magician_names。由于magician_names中的每个条目都是str,而且strs是不可修改的,所以不能简单地通过在magician_names中添加" the great"来修改magician_names中的每个str。相反,您需要用修改后的版本替换magician_names中的每个magician_names

所以这个看似简单的方法:

代码语言:javascript
运行
复制
def make_great(l):
    for name in l:
        name += " the great"

make_great(magician_names)

不修改magician_names。它只需创建一个新的str对象,并将其分配给name变量,该变量位于for loop的局部变量中。magician_names的每个元素不变,即它仍然指向同一个str对象。

但这种方法:

代码语言:javascript
运行
复制
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

对于你的评论,

代码语言:javascript
运行
复制
for index, name in enumerate(l):
    l[index] = name + " the great"

是毕达克式的写作方式:

代码语言:javascript
运行
复制
for index in range(len(l)):
    name = l[index]
    l[index] = name + " the great"

enumerate(l)返回一个可迭代的(实际上是一个惰性生成器),为l中的每个元素生成一个匹配的index, element对。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39338405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档