2016-10-19 3 views
1

ここでは、「Pythonの難しい方法を学ぶ」の中の何かについて、すべてのことを混乱させてしまいます。これがカバーされていれば謝罪します。私は検索し、コードから望ましい結果を得られないという記事しか見つけられませんでした。難解な方法でPythonを学ぶex25 - 私の理解を確認したい

私の質問はexercise 25における2つの関数の相互作用に関する:

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

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

ので、ゼッドあなたはターミナルでこれを実行している運動の終わり近く:

>>> 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'の引数に何が表示されていても、 'sort__words'から 'break_words'に 'sentence'を渡すことはできますか?

引数のラベルは問題ではないと仮定すると 'break_words'は 'sentence'を引数として実行し、 'stuff.split'関数の出力である 'words'を返すべきです。その中に含まれる。これは私がを実際にと混同したところです。 'break_words'から返された 'words'は 'sort_sentence'の一部として定義された変数 'words'と何が関係していますか?私はこれらの機能がどのように連動しているかを把握することはできません。ご協力いただきありがとうございます!

+1

指定する引数は、関数が使用する引数にマップされます。したがって、 'def break_words(stuff)'のようなものでは、それに渡す引数は、メソッド本体内に 'stuff 'として表示されます。あまりにも多くの専門用語があるかもしれませんが、Pythonのチュートリアルセグメント[定義関数_より詳しく説明](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'は 'break_words(sentence)'の呼び出しから_value_が_returnされたものを指しますが、 'break_words'の中で使われる変数名には依存しません。私はそれがあなたをこのように混乱させるように設計されていると思います。 – roganjosh

答えて

1

どのようにPythonの関数は、多かれ少なかれ作品は以下の通りである。パラメータは唯一の機能function_nameの範囲内であるか

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 

注意してください。その変数はその関数でのみ使用され、その関数では使用されません。私たちは、関数から変数を返すとき、私たちは関数を呼び出す別の変数に割り当てることができます。

my_variable = function_name("hello") 

my_variable我々は値"hello"に渡して、関数を呼び出したので、それが価値だと今"hello"を持っています。指定した変数名で関数を呼び出さなかったことに注意してください。パラメータ名が何であるかは気にしません。私たちが知っているのは、関数の入力が1つだけだということだけです。そのパラメータ名は関数内でのみ使用されます。関数を呼び出したときに、その変数の名前を知っているうちに、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を返します。

ここで、機能の連鎖について話しましょう。

私はシェフに何かを与えて私についての基本的なダウンを得て、彼は私に与えたものに基づいて私に戻って食べ物を与える。だから、料理をする前に処理しなければならないものを彼に渡せたらどうでしょうか?彼がコーヒー豆を粉砕する方法を知らない場合はどうしましょう。しかし、彼の共同シェフの職員は、どのようにも知っている。彼はその豆をその人に渡して、コーヒー豆を粉砕し、そして戻しプロセスで調理する。

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)と呼ばれ、の機能sort_sentence()の出力にsorted_wordsを設定しました。あなたは入力を受け入れましたsentence

sort_sentence(sentence) getが実行されました。文字列を渡すと、変数内にsentenceと呼ばれるようになりました。

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

そして機能sort_sentence()はまだその文字列sentenceを呼び出します:あなたはこのように関数を呼び出している可能性があり、それはまだ動作することに注意してください。関数は基本的に私の入力が何であるかを言っています、私はそれを文章と呼んでいます。文章という名前のオブジェクトを私に渡すことができます。このオブジェクトは、私がそれを使って作業している間に文章に名前を変更します。スタック上

次は、次のとおりです。今、機能sort_sentenceがそれを呼ばれることで、関数を呼び出しているbreak_words

words = break_words(sentence) 

sentenceとして入力です。あなたはそれが基本的にやっているトレース従うのであれば:

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

次へ]をスタック上にある:

words = stuff.split(' ') 
return words 

注関数はstuffとして入力だ呼び出すこと。だから、sort_sentenceの入力があったので、sentenceとなり、関数break_wordsstuffと呼ばれています。

それは、リスト内のその言葉や店舗へのアップ「文」を分割し、リストの「言葉」機能sort_sentenceは、変数wordsbreak_wordsの出力を格納する方法

お知らせを返します。関数break_wordswordsという名前の変数を返すことに注目してください。この場合は同じですが、別の方法で呼び出すかどうかは関係ありません。 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

これは非常に役に立ちます、 ありがとうございました!私はちょうど2つのフォローアップの質問があります: – empathyattack

0

を引数ラベルは、それはある意味で重要

問題ではないこと関数定義内で "ローカル"に使用されていることを示します。基本的には、それを関数定義で定義する別のローカル変数と考えるが、引数の値は関数に与えられる。言葉は '「break_wordsは」'の一部として定義され 変数「言葉」でなければならないから返さない何

:これを踏まえて

、あなたの次の質問に答えるのは簡単ですsort_sentence '?

何もありません。前述のように、wordsはローカル変数sort_sentenceです。したがって、関数を終了すると、基本的にはゴミ箱になります(「範囲外」とは、用語です)。もちろん、別の関数定義などの変数の名前としてwordsを使用することができます。これはここで起こっていることです。

関連する問題