2016-10-19 26 views
1

總的noob在這裏混淆了所有地獄關於「學習Python的困難途徑。道歉,如果這已被涵蓋;我搜索,只能找到關於從代碼沒有得到想要的結果的帖子。學習python的難方式ex25 - 想檢查我的理解

我的問題涉及到的兩個功能在exercise 25互動:

def break_words(stuff): 
    words = stuff.split(' ') 
    return words 

def sort_sentence(sentence): 
    words = break_words(sentence) 
    return sort_words(words) 

因此,附近的運動Zed的具有結束時,您在終端運行以下命令:

>>> sorted_words = ex25.sort_sentence(sentence) 
>>> sorted_words 
['All', 'come', ’good’, ’things’, ’those’, ’to’, ’wait.’, ’who’] 

現在我假設'sort_sentence'中的參數來自以下,進入終端在練習的開始:

>>> sentence = "All good things come to those who wait." 

然而,儘管我們現在知道上面是「sort_sentence」,「sort_sentence break_words」不運行不能完成「參數」,與「句'再次作爲的說法。這裏是我感到困惑的地方:'break_words'的參數被標記爲'stuff'。這很重要嗎?無論'break_words'的參數是怎樣標記的,'sentence'是否可以從'sorted_words'傳入'break_words'?假設我所假設的 - 參數標籤並不重要 - 'break_words'應該以'sentence'作爲參數運行並返回'words',這是函數'stuff.split'的輸出,包含在其中。這是我得到真的混淆 - 'break_words'返回的'words'與'sort_sentence'的一部分定義的變量'words'有什麼關係?我根本無法弄清楚這些功能是如何協同工作的。預先感謝您的幫助!

+1

指定的參數將映射到該函數使用的參數。因此,在'def break_words(stuff)'這樣的東西中,任何傳遞給它的參數都會在方法體內顯示爲'stuff'。這裏可能有太多行話,但是Python教程片段[_Defining Functions_描述更好](https://docs.python.org/3/tutorial/controlflow.html#defining-functions)。 – birryree

+1

「從'break_words'返回的'words'與'sort_sentence'的一部分定義的變量'words'有什麼關係?」基本上什麼都沒有。 'sort_sentence'中的'words'獨立於'break_words'中的'words'。每個函數都有自己的作用域:在'sort_sentence'裏面,'words'指的是_value_從返回時調用'break_words(句子)',但不依賴於'break_words'中使用的任何變量名。我想這是爲了讓你迷惑你。 – roganjosh

回答

1

Python的功能更多或更少的工作如何如下:

def function_name(parameter_name_used_locally_within_function_name): 
    #do stuff with parameter_name_used_locally_within_function_name 

    some_new_value = parameter_name_used_locally_within_function_name 
    return some_new_value 

注意參數是如何僅在功能function_name的範圍。因爲該變量只能用於該功能而不在其外部。當我們從一個函數返回一個變量,我們可以把它分配給另一個變量調用函數:

my_variable = function_name("hello") 

my_variable現在有"hello",因爲它的價值,因爲我們調用的函數,傳遞價值"hello"。注意我沒有用指定的變量名稱調用函數?我們不在乎參數名稱是什麼,我們只知道該函數需要一個輸入。該參數名稱僅用於該功能。請注意,我們如何在調用函數時知道該變量的名稱而得到some_new_value的值?

讓我給你一個更廣泛的例子。函數可以被認爲是你給別人做的任務。可以說,功能或任務是爲了他們爲我們做點什麼。廚師或任務需要烹飪原料(這是我們的投入),我們希望獲得食物(我們的產量回報)。可以說,我想要一個煎蛋,我知道我必須讓主廚的蛋才能讓我變成一個人,我不在乎他是如何做到的,或者他做了什麼,只要我把我的產品/煎蛋餅帶回來。他可以把雞蛋叫做他想要的東西,他可以把雞蛋打碎成他想要的樣子,他可以在鍋裏炸他喜歡的東西,但只要我拿到煎蛋餅,我就會很開心。

回到我們的編程世界裏,函數是這樣的:

def cook_me_something(ingredients): 
    #I don't know how the chef makes things for us nor do I care 
    if ingredients == "eggs": 
     food = "omelette" 
    elif ingredients == "water": 
     food = "boiled water" 
    return food 

我們這樣稱呼它:

my_food_to_eat = cook_me_something("eggs") 

通知我給了他「雞蛋」,我得到了一些「煎蛋「 背部。我沒有說雞蛋是成分,也不知道他稱之爲他給我的食物。他只是返回food,其中包含omelettes

現在讓我們來討論鏈接功能。

因此,我們基本瞭解了我給主廚一些東西,他根據我給他的東西給我回來了食物。那麼,如果我們給他一些他需要加工的東西,然後再烹飪。讓我們說,如果他不知道如何磨咖啡豆。但他的聯合廚師也知道如何。他會把豆子傳給那個人,把咖啡豆碾碎,然後用返工過程做飯。

def cook_me_something(ingredients): 
    #I don't know how the chef makes things for us nor do I care 
    if ingredients == "eggs": 
     food = "omelette" 
    elif ingredients == "water": 
     food = "boiled water" 
    elif ingredients == "coffee beans" 
     co_worker_finished_product = help_me_co_worker(ingredients) 
     #makes coffee with the co_worker_finished_product which would be coffee grindings 
     food = "coffee" 
    return food 

#we have to define that function of the co worker helping: 

help_me_co_worker(chef_passed_ingredients): 
    if chef_passed_ingredients == "coffee beans" 
     ingredients = "coffee grinding" 
    return ingredients 

注意的共同工作者如何有一個局部變量ingredients?這與廚師有所不同,因爲廚師有自己的配料,同事也有自己的配料。請注意,廚師如何不在乎同事稱他的配料或他如何處理這些物品。廚師給了同事一些東西,並期待成品。

這或多或少是如何工作的。只要功能得到他們的輸入,他們就會工作,也許會產生輸出。我們不關心他們在他們的函數內調用他們的變量,因爲這是他們自己的項目。

因此,讓我們回到你的例子:

def break_words(stuff): 
    words = stuff.split(' ') 
    return words 

def sort_sentence(sentence): 
    words = break_words(sentence) 
    return sort_words(words) 

>>> sentence = "All good things come to those who wait." 
>>> sorted_words = ex25.sort_sentence(sentence) 
>>> sorted_words 
['All', 'come', ’good’, ’things’, ’those’, ’to’, ’wait.’, ’who’] 

讓我們看看我們是否能夠打破它讓你明白。

您調用sorted_words = ex25.sort_sentence(sentence)並將sorted_words設置爲函數sort_sentence()的輸出即['All', 'come', ’good’, ’things’, ’those’, ’to’, ’wait.’, ’who’]。你通過輸入sentence

sort_sentence(sentence) get的執行。你傳入的字符串現在叫做sentence裏面的變量。請注意,您可以調用這樣的功能,它仍然可以工作:

sorted_words = ex25.sort_sentence("All good things come to those who wait.") 

而且功能sort_sentence()仍然會調用該字符串sentence。這個函數基本上說了我的輸入是什麼,我稱之爲句子。您可以將您的對象命名爲句子,我將在我使用它時將它重命名爲句子。

接下來在棧上是:

words = break_words(sentence) 

現在與該函數sort_sentence稱之爲調用函數break_words的輸入爲sentence。所以,如果你按照它基本上做跟蹤:

words = break_words("All good things come to those who wait.") 

接下來在棧上是:

words = stuff.split(' ') 
return words 

注意函數調用它的輸入爲stuff。因此,sort_sentence的輸入是:sort_sentence叫做sentence,功能break_words現在叫它stuff

它拆分「句子」成單詞並將其存儲在一個列表並返回列表中的「話」

通知功能如何sort_sentence被存儲在變量wordsbreak_words輸出。注意函數break_words是如何返回一個名爲words的變量?在這種情況下它們是相同的,但是如果有人以不同的方式說出它並不重要。 sort_sentence可以將輸出存儲爲foo並且它仍然有效。我們正在談論不同範圍的變量。功能break_words之外的變量words可以是任何東西,並且break_words不會在意。但是break_words裏面的那個變量就是這個函數的輸出。

在我家我的規定?在我的房子外面,你可以做任何你想要的東西。

sort_sentence返回變量相同,我們如何存儲我們從中得到的回報。無論我們如何存儲它或我們稱之爲無關緊要。

如果你想,你可以將其命名爲:

def break_words(stuff): 
    break_words_words = stuff.split(' ') 
    return break_words_words 

def sort_sentence(sentence): 
    words = break_words(sentence) 
    return sort_words(words) #not sure where this function sort_words is coming from. 
          #return words would work normally. 

>>> sentence = "All good things come to those who wait." 
>>> sorted_words = ex25.sort_sentence(sentence) 
>>> sorted_words 
['All', 'come', ’good’, ’things’, ’those’, ’to’, ’wait.’, ’who’] 

你只需要考慮局部變量和參數,就像剛事物命名的工作。就像我們與廚師的例子一樣,廚師可能會調用雞蛋,配料,但我稱它爲我想要的,只是通過它「雞蛋」。這些都是關於事物的範圍,把功能看作是房子,當你在房子裏時,你可以在房子裏命名你想要的任何物體,而在房子外面,那些相同的名字可能是不同的東西,但在房子內部,他們就是你想讓他們成爲的人。當你拋出一些東西時,你將這個項目命名爲與外界無關,因爲外部世界會將其命名爲別的東西。可能將它命名爲同樣的東西...

如果我只是漫步太多,提出問題,我會盡力爲你清除它。

編輯

午飯再回到我以爲變量的容器,其所持有的價值觀,但你不關心別人的容器命名。你只關心你的,當有人給你一些東西時,你把它放在一個容器中,並將它命名爲你關心的東西,這會幫助你知道它裏面的東西。當你放棄一個項目,你不給的容器,因爲你需要它來存儲其他東西..

+1

另一個(可能更簡潔)的例子可能是廚師(函數)接受* order *(參數/參數)。 *命令*是否是雞蛋本尼迪克特或火腿三明治或凱撒沙拉,順序去廚師,並且廚師準備這道菜並不重要。當然,如果你通過一個不好的參數(例如,「廚師,表16命令艾菲爾鐵塔」),該功能可能會引發錯誤:) –

+0

我喜歡那個例子; 3希望他們也閱讀評論 – MooingRawr

+0

這是非常有用的, 謝謝!我只有兩個後續問題: – empathyattack

0

該參數標籤不要緊

要緊的意義它在函數定義中「本地」使用。基本上把它看作是你在函數定義中定義的另一個局部變量,但是參數的值是賦給函數的。

牢記這一點,你的下一個問題很容易回答:

什麼是「」從「break_words」有做返回的 變量「單詞」定義爲「部分sort_sentence「?

什麼都沒有。如前所述,words是一個局部變量sort_sentence,因此在您離開函數時基本上會被刪除(「超出範圍」是語言)。當然,您可以使用words作爲別處變量的名稱,例如在另一個函數定義中,這就是發生在這裏的情況。

相關問題