簡體   English   中英

對使用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_magiciansi個元素

不需要哪一行代碼?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM