質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

6回答

4901閲覧

python:関数の実行にprintが必要でない理由

dahachin

総合スコア17

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/09 00:08

前提・実現したいこと

Pythonの関数について、関数内にprintがある際は実行の際にprintが不要な理由を伺いたく思います。(該当のソースコード欄に疑問が浮かんだ関数の例を記載しています)

背景としてPythonでデータを出力する際にはprintを利用すると学んだことから、関数の実行時にも必ずprintが
必要ではないかと考えていたところ、関数内に同表記がある場合には関数名を書くだけで実行される例を見つけ、疑問を感じたことがあります。

該当のソースコード

python

1# printが必要な関数 2def add(a,b): 3 c = a + b 4 return c 5print(add(3,4)) 6 7# 不要な関数 8def add(a,b): 9 d = a+b 10 print(d) 11add(5,2) 12 13ソースコード

試したこと

printの使い方についてググりましたが、print内の値の書き方ばかりが見つかり知りたいことにあった答えを
見つけられませんでした。

補足情報(FW/ツールのバージョンなど)

実行環境: Jupyter Notebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

printは「指定した値を印字する」ことができるPythonの組み込み機構(Python3では関数)です。

質問者さんのコードにあるaddも関数ですが、一般に関数は「その本体でなんらかの計算や処理(印字も含む)を行い結果の値を呼び出し元に返す」ことができるものです。

値の印字が目的なら

・呼び出された関数内で興味のある値を計算してそれを印字(print)し、値として何も返さない(別に返してもよいが)
・呼び出された関数内で興味のある値を返し(returnし)、呼び出し元でその値を印字する

のどちらでも同じ結果(興味のある値を印字すること)ができます。

普通どちらが自然かといえば後者の方であることが多いでしょう。
「add」という関数名を考えてみてください。この関数の機能は「加算すること」だと考える人が多いでしょう。addが求めた値をそのままreturnするのが自然です。加算してそれを印字するところまでがこの関数の機能なら「add_and_print」というような名前の機能ということになりますが「加算はしてほしいけどいちいち印字してほしくない」場合も多いです。

python

1def add(a, b): 2 d = a + b 3 print(r)

こうなっていると「1と2を加算してさらに3を加算する」というような応用がまったくできません。そういう応用ができるように作るには「関数内で余計なこと(print)をせずに計算結果だけを返す」方がよいです。

python

1def add(a, b): 2 d = a + b 3 return d 4 5r = add(1, 2) # まず結果の値を求める 6print(r) # それを印字したいならそうすればいい 7r = add(add(1, 2), 3) # まず結果の値を求める 8print(r) # それを印字したいならそうすればいい

投稿2019/05/09 00:29

KSwordOfHaste

総合スコア18404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:13

ご回答いただき有り難う御座います。printが印字処理をすることについて理解させていただきました! 勉強不足で恐縮なのですが、1つ目の関数の例について”print(r)”とprint内にある”r”は 何を表しているのでしょうか?
KSwordOfHaste

2019/05/14 00:57

rは変数です。変数の中には何かの値が入っています。 r = 任意の式 と書けば「右辺の任意の式」を計算した結果の値がrの中身になります。つまり変数は値を書き換えることができます。 一方=の左側に書かずにrとだけ書くとそれは変数の中に入っている値を意味します。 print(r) と書くと変数rの中身の値をprint関数へ渡すという意味になります。print関数は引数に渡された値を「印字する」関数です。 r = add(1, 2) print(r) は「add(1, 2)の値を計算し、それを変数rの値にする。次に変数rの中身(要するに一つ前の行で計算したadd(1, 2)の結果)の値を印字する」という意味になります。
guest

0

「実行するかどうか」と「画面表示するか」は関係有りません。
例えば、

Python

1import os 2def delete_file(fn): 3 os.remove(fn) 4 5delete_file("foo.txt")

というコードであれば、printが一切ありません。

画面表示したければ、したいタイミングでprintするということです。
画面表示したい場合に、関数の中で画面出力するのか、関数を呼んだ側で画面出力するのかは、関数の機能を何であると設計するかに依ります。

・足し算をする関数
・足し算をして結果を画面出力する関数

投稿2019/05/09 01:53

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:02

ご回答ありがとうございます。 printの機能について「実行」と「画面表示」で混同していたことを理解しました。 有り難う御座います!
guest

0

呼び出し元に返り値を返してから表示するか、関数の中で表示してしまうかの違いだけですが、そんなに違和感あるでしょうか・・・?

print(add(3,4))がなにをしているのか、という点の理解が曖昧なのかもしれません。これが実行される順序としては、大雑把には

  1. pythonインタプリタが「print関数があるのでこれを実行しよう」と認識する
  2. print関数の実行の前に引数を評価する必要がある。引数のadd(3,4)という式を評価する
  3. add関数が実行され、return文によって7という返り値が返る。ここで引数の評価が終わる
  4. 結果的にprint(7)に置き換えられ、7が表示される

という流れになります。

投稿2019/05/09 00:20

hayataka2049

総合スコア30939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:13

ご回答有り難う御座います。 printがどのようなプロセスで計算結果を表示させるかについて非常にわかりやすく説明いただき 理解が深まりました。 有り難う御座います!
guest

0

... 関数の実行時にも必ずprintが必要ではないか ...

このようなルールはありません。

プログラムは一行ずつ実行されていきます。一連の処理中で print があれば表示が実行させるだけです。print 文が関数の中だとか、外だとかは関係がありません。
print文が関数呼び出し時に行うのも、関数に中で orint を行うのも自由です。
両方で print するようにすることさえも。

初歩的なデバッグ手法として、プログラムの挙動を調べるために、print 文を入れて変数の値を表示させたり、処理が通ったことを orint 文で確認したりすることさえあります。

投稿2019/05/09 22:09

katoy

総合スコア22328

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:00

ご回答いただきありがとうございます。 printは表示(出力)のための処理であり、場所を問わないことを学ばせていただきました。 printを使った挙動の確認方法についても初耳でした、今後勉強を進めるにあたり活用していきたいと思います!
guest

0

ベストアンサー

Python

1#-------add関数開始--------- 2 3def add(a,b): 4 c = a + b 5 return c # 計算結果を呼び元にかえしているだけ 6 7#-------add関数終了--------- 8 9print(add(3,4)) # 計算結果として返された値を表示している 10 11 12 13#-------add関数開始--------- 14def add(a,b): 15 d = a+b 16 print(d) # 引数として渡された数字を足したものを関数内で表示 17 18#-------add関数終了--------- 19 20add(5,2) # 関数に計算してほしい数字を渡しているだけ(関数を呼んでいるだけ) 21

ちょーかんたんなお話で、
やっていることはまぁ一緒です。

関数の中でprint()するか、関数では計算結果を返すだけで別のところで計算結果を出力するか、
たったそれだけの違いです。

難しく考えすぎなのでは?

追記

関数の実行時にも必ずprintが

必要ではないか

↑に関して何か勘違いしているようですが、
必ず何かを出力する関数とかうざいだけじゃないですか?
ただ計算してほしいだけの関数でprint()はいらないですよね。

計算した結果を 出力したい時だけ print()がいるんですよ

計算してほしいだけ のものではprint()はもちろん不要です。計算してほしいだけなんですもん。


もしかして関数を実行するときは必ずprint()がいると勘違いしているのでしょうか。
質問文からそんな感じがしてきました。

実際に関数を実行(呼び出して処理)しているのは↓のコードですよ

Python

1add(5,2)

その実行結果を出力したい時は、 add() を print() で囲います。
print()って見方を変えれば出力 関数 みたいなものなので

Python

1print( add(5,2 ) ) 2 3# ↓書き換えるとこんな感じ 4 5print( 7 ) #add(5, 2)の計算結果(返り値)=7

といった感じに print関数に出力してほしいものを渡してるだけです。

投稿2019/05/09 00:19

編集2019/05/09 00:33
azuapricot

総合スコア2343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:16

ご回答いただき有り難う御座います。 非常に詳しいところまで丁寧に追記していただいたところに回答者様の優しさを感じBAに選ばせていただきました。 おっしゃる通りprintの処理機能について勘違いをしておりました。 あくまで出力時にのみ用いるということ、しっかり覚えておきます。
guest

0

Pythonでデータを出力する際にはprintを利用すると学んだことから、関数の実行時にも必ずprintが

必要ではないか

どうしてそう考えたのでしょうか。関数の中でも外でも、printがあればそこで出力が行われます。

投稿2019/05/09 00:19

maisumakun

総合スコア146564

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2019/05/14 00:17

ご回答いただきありがとうございます。 printは様々な計算結果を出力(画面表示)するときにのみ使うことを学ばせていただきました。 有り難う御座います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問