web-dev-qa-db-ja.com

関数の出力を返すことは、印刷とどのように異なりますか?

私の以前の question で、Andrew Jaffeはこう書いています:

他のすべてのヒントやヒントに加えて、重要な何かを見逃していると思います。関数は実際に何かを返す必要があります。 autoparts()またはsplittext()を作成すると、これは呼び出し可能な関数になり、何かを返すことができる(そして返す必要がある)という考え方です。関数に必要な出力を把握したら、それをreturnステートメントに入れる必要があります。

def autoparts():
    parts_dict = {}
    list_of_parts = open('list_of_parts.txt', 'r')

    for line in list_of_parts:
        k, v = line.split()
        parts_dict[k] = v

    print(parts_dict)

>>> autoparts()
{'part A': 1, 'part B': 2, ...}

この関数は辞書を作成しますが、何かを返しません。ただし、printを追加したため、関数を実行すると関数の出力が表示されます。 returning何かとprintingの違いは何ですか?

32
Thanx

Printは、単純に構造を出力デバイス(通常はコンソール)に出力します。これ以上何もない。関数から返すには、次のようにします。

def autoparts():
  parts_dict = {}
  list_of_parts = open('list_of_parts.txt', 'r')
  for line in list_of_parts:
        k, v = line.split()
        parts_dict[k] = v
  return parts_dict

なぜ戻るのですか?そうしないと、その辞書は死に(ガベージコレクトされます)、この関数呼び出しが終了するとすぐにアクセスできなくなります。値を返す場合、他のことを行うことができます。といった:

my_auto_parts = autoparts() 
print my_auto_parts['engine']

何が起こったの? autoparts()が呼び出され、parts_dictが返され、my_auto_parts変数に格納されました。これで、この変数を使用してディクショナリオブジェクトにアクセスできるようになり、関数呼び出しが終了しても生き続けます。次に、キー「engine」を使用して、ディクショナリ内のオブジェクトを出力しました。

良いチュートリアルについては、 pythonに飛び込む をご覧ください。無料で、とても簡単にフォローできます。

62
ryeguy

Printステートメントは、ユーザーにオブジェクトを出力します。 returnステートメントにより、辞書を変数に割り当てることができます関数が終了すると

>>> def foo():
...     print "Hello, world!"
... 
>>> a = foo()
Hello, world!
>>> a
>>> def foo():
...     return "Hello, world!"
... 
>>> a = foo()
>>> a
'Hello, world!'

または、辞書を返すコンテキストで:

>>> def foo():
...     print {'a' : 1, 'b' : 2}
... 
>>> a = foo()
{'a': 1, 'b': 2}
>>> a
>>> def foo():
...     return {'a' : 1, 'b' : 2}
... 
>>> a = foo()
>>> a
{'a': 1, 'b': 2}

(行が実行された後に何も出力されないステートメントは、最後のステートメントがNoneを返したことを意味します)

8
Jason Baker

REPLから実行しているため混乱していると思います。REPLは、関数を呼び出したときに返される値を自動的に出力します。その場合、値を作成して印刷して破棄する関数がある場合でも、値を作成して返す関数があり、REPL printそれ。

ただし、autopartsが作成する値で何かを実行したい別の関数でautopartsを呼び出すとわかるように、これらはほとんど同じではありません。

4
RossFabricant

returnステートメントを追加するだけです...

def autoparts():
  parts_dict={}
  list_of_parts = open('list_of_parts.txt', 'r')
  for line in list_of_parts:
        k, v = line.split()
        parts_dict[k] = v
  return parts_dict

印刷すると、アプリケーションの標準出力(画面)にのみ印刷されます。コンマで区切ることにより、複数のものを返すこともできます。

return parts_dict, list_of_parts

それを使用するには:

test_dict = {}
test_dict = autoparts()
3
jle
def add(x, y):
    return x+y

そうすれば変数になります。

sum = add(3, 5)

print(sum)

ただし、 'add'関数が出力 'sum'を出力する場合、アクションは割り当てられた後に既に実行されているため、なしになります。

0
Wool

さらに、これも:

_def f():
    print("A")
a=f()
print(a.lower())
_

エラーをスローしますが、:

_def f():
    return "A"
a=f()
print(a.lower())
_

望ましい結果をもたらします。

説明する:

type(print())がOutputを返す場合、それはNoneなので、型はNoneTypeなので、属性ではないNoneType lower()、OTOH returnは文字列なので、エラーはありません、完璧に動作します

0
U10-Forward