![](/img/trans.png)
[英]Merge Two Sorted Lists. confused about working of "=" operator in python
[英]Confused about modifying lists using two functions in Python
我目前正在閱讀Eric Matthes撰寫的Python速成課程 ,並且很難理解第8章的內容,而這一切都是關於函數的。 我堅持練習8-10,要求我使用新功能來更改上一練習中使用的列表。
這是練習:
8-9. Magicians: Make a list of magician's names. Pass the list to a function called show_magicians(), which prints the name of each magician in the list.
8-10. Great Magicians: Start with a copy of your program from exercise 8-9. Write a function make_great() that modifies the list of magicians by adding the phrase the great to each magician's name. Call show_magicians() to see that the list has actually been modified.
這是我的8-9代碼:
def show_magicians(names):
"""Print each magician name"""
for name in names:
msg = name.title()
print(msg)
magician_names = ['sonic', 'tails', 'knuckles']
show_magicians(magician_names)
我在該網站上看到了一個非常相似的主題,因此我嘗試使用此頁面上第一個答案中的代碼來幫助我: Python崩潰課程8-10
但是,我的代碼似乎仍然不正確,因為編譯器會在每個名稱后打印3次“ the great”。
這是我用於8-10的當前代碼
def show_magicians(names):
"""Print each magician name"""
for name in names:
msg = name.title()
print(msg)
magician_names = ['sonic', 'tails', 'knuckles']
show_magicians(magician_names)
def make_great(list_magicians):
"""Add 'Great' to each name."""
for magician_name in magician_names:
for i in range(len(list_magicians)):
list_magicians[i] += " the great!"
make_great(magician_names)
show_magicians(magician_names)
我不知道為什么,但是似乎我在整個功能章節中都在苦苦掙扎。 是否有人有推薦的教程可以幫助我更好地理解功能? 感謝您的時間。
好的,這樣您就可以在外面增加一個循環,將其刪除。 最終代碼:
def show_magicians(names):
"""Print each magician name"""
for name in names:
msg = name.title()
print(msg)
magician_names = ['sonic', 'tails', 'knuckles']
show_magicians(magician_names)
def make_great(list_magicians):
"""Add 'Great' to each name."""
for index, item in enumerate(list_magicians):
list_magicians[index] += " the great!"
make_great(magician_names)
show_magicians(magician_names)
你在做一個for-in
連同for-in range
。 這使得代碼重復了字符串的追加。 讓我解釋一下您以前的程序做了什么:
說明:在每次迭代中,您都使用for-in
進行循環,從而使其循環內循環3次。 因此, 外循環的每一次迭代都將重復內循環3次,從而將the great
3次附加到每個名稱上。
另外,作為鏈接問題的range(len(list_magicians))
,我希望您使用range(len(list_magicians))
enumerate
。
將第二種方法更改為:
def make_great(list_magicians):
"""Add 'Great' to each name."""
i = 0
for magician_name in magician_names:
list_magicians[i] += " the great!"
i += 1
目前,您正在使用兩次for loops
循環進行兩次for loops
導致將其添加3次!
讓我們看一下您的make_great
函數:
def make_great(list_magicians):
"""Add 'Great' to each name."""
for magician_name in magician_names:
for i in range(len(list_magicians)):
list_magicians[i] += " the great!"
這是做什么的?
for magician_name in magician_names:
循環通過magician_names
。
for i in range(len(list_magicians)):
按索引循環遍歷list_magicians
。
list_magicians[i] += " the great!"
增添the great!
到list_magicians
第i
個元素
不需要哪一行代碼?
for magician_name in magician_names:
循環瀏覽沒有用。 由於其長度為3,這就是為什么您獲得3的原因the great!
已添加到每個元素。 刪除該行代碼,該功能應正常工作。
就像另一個回答者所說的,嵌套循環基本上在做同樣的事情,但是每次外部循環運行時,內部循環都會運行。 這兩個循環都試圖遍歷魔術師列表,一個循環使用列表名稱在函數外部( magician_names
),另一個使用列表名稱在函數內部( list_magicians
)。 兩種方法都可以,但是兩者都太多了。 從這個角度來看,您的誤解不是功能,而是循環。
但是,您在函數中完全提到了magician_names
的事實表明了一個誤解。 它可以工作,但是形式不好。 通常,函數的代碼應專門引用通過參數傳遞給函數的名稱。 因此,在這種情況下,您應該放棄magician_names
的循環,而保留list_magician
的循環。 規則有例外,但是在打破規則之前,您應該牢記明確的理由。 規則的理由是封裝:您可以通過閱讀函數的參數列表和代碼來完全理解該函數,而無需詢問函數外部任何事物的作用。
如果您接受函數只能在其參數上運行的想法,那么您必須問:函數如何影響外部世界? 一個答案是該函數return
s的東西,而外界自願對return
的東西做一些事情。 另一個答案是函數的參數恰好指向外部世界中的對象,因此在函數內部更改對象會自動在函數外部對其進行更改。 我更喜歡第一種方法,但是就您而言,使用第二種方法可能更容易。 因此,當您將magician_names
傳遞給函數時,Python將其重命名為list_magicians
; 您在list_magicians
內部對list_magicians
進行操作,因此magician_names
在函數外部也會更改; 從函數返回后, 名稱 list_magicians
消失了,但是對magician_names
的更改仍然存在。
這是最后的建議,它可以將您的知識擴展到“列表理解”,您可能還沒有學習過這個主題(但對於本應用程序來說是完美的):我建議編寫一個函數來對單個函數進行操作數據,然后重復調用該函數,而不是嘗試在同一函數中進行重復和單項數據修改。 像這樣:
def append_great(magician):
return magician + " the Great"
有了該功能,列表理解就顯得非常不錯。 它根據您的指示逐個處理列表。 像這樣:
>>> magicians = [ "Houdini", "Fubini" ]
>>> [ append_great(m) for m in magicians ]
['Houdini the Great', 'Fubini the Great']
請注意,列表理解返回了一個新列表。 magicians
保持不變,除非您自己更改。 事情應該是這樣。 功能不應觸及外部世界(除非有充分的理由); 相反,外界應該向函數提供一些數據,接收結果,並以外界最了解的方式使用結果。 那是我對影響外部世界的“價值回報”方式的提倡,但是正如我所說,在這種情況下,使用“通過引用”方式更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.