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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1533閲覧

Python関数定義(変数の使い方)について質問です。初歩的な質問かもしれないのですが、宜しくお願いします。

python365

総合スコア31

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/02/13 15:19

前提・実現したいこと

Pythonのリストにある整数の合計値を計算する関数を定義する練習問題に関して2点質問があります。
①が模範解答なのですが、これを②のように書き換えても同じ戻り値を出すことが出来ました。

≪1≫
①の回答で()の中はhandなのに、return以下のコードではplayer_handと異なる名前になっています。これを②のようにaaaに変えても戻り値を出すことが出来ました。なぜ()と同じhandにしなくても正しい結果が出てくるのでしょうか?

≪2≫
①ではplayer_sum~という変数を1行多く書き加えられているのですが、②のように直接入れた方がシンプルで判りやすいのではないのかなと感じました。
①の模範解答のように書く理由(メリット)は何なのでしょうか?

どうぞよろしくお願いします。

発生した戻り値・エラーメッセージ

②②ともに
リストの合計は 36

該当のソースコード

Python

1def get_sum(hand): 2 result=0 3 for num in hand: 4 result+=num 5 return result 6 7player_hand=[1,5,20,10] 8player_sum=get_sum(player_hand) 9print('リストの合計は', player_sum)

Python

1def get_sum(hand): 2 result=0 3 for num in hand: 4 result+=num 5 return result 6 7aaa=[1,5,20,10] 8print('リストの合計は', get_sum(aaa))

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

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

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

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

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

guest

回答2

0

ベストアンサー

≪1≫

①の回答で()の中はhandなのに、return以下のコードではplayer_handと異なる名前になっています。これを②のようにaaaに変えても戻り値を出すことが出来ました。なぜ()と同じhandにしなくても正しい結果が出てくるのでしょうか?

関数の引数リストの引数を仮引数、実際に渡す引数を実引数と呼びます。
今回の場合、handが仮引数でplayer_hand, aaaが実引数です。
これらの名前は一致しても/しなくてもかまいません。

関数は汎用的に使えることがしばしば要求されます。
もし実引数名が仮引数と一致しなければならないのなら、非常に使いづらいと思いませんか。

Python

1player_hand = [1, 2, 3, 4, 5] 2enemy_hand = [2, 4, 6, 8, 0] 3 4hand = player_hand 5player_sum = get_sum(hand) 6 7hand = enemy_hand 8enemy_sum = get_sum(hand)

↑ 実引数と仮引数の名前が同じでないといけないと、こんなことになる
↓ 実際は汎用的に関数を使える

Python

1player_hand = [1, 2, 3, 4, 5] 2enemy_hand = [2, 4, 6, 8, 0] 3 4player_sum = get_sum(player_hand) 5enemy_sum = get_sum(enemy_hand)

≪2≫

①ではplayer_sum~という変数を1行多く書き加えられているのですが、②のように直接入れた方がシンプルで判りやすいのではないのかなと感じました。

その場で出力して終わりなら2番の方が分かりやすいでしょう。

①の模範解答のように書く理由(メリット)は何なのでしょうか?

その後再利用することを見越しているのかもしれません。

Python

1player_sum = get_sum(player_hand) 2print('リストの合計は', player_sum) 3 4if player_sum >= 20: 5 print('Great!')

あるいは、説明変数(意味を明確にする目的で設けられる変数)としての役割を期待しているのかも。
これくらいの小さなプログラムじゃ利益はあんまり感じられませんが。

投稿2018/02/13 15:30

編集2018/02/13 15:39
LouiS0616

総合スコア35660

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

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

python365

2018/02/14 12:40

詳細に解説して下さりありがとうございました。 とてもクリアに理解することが出来ました!
guest

0

(1)
[1,5,20,10]というリストにplayer_handという名前を付けているのですが、実はこの名前はなんでもいいんです。例えば、

player_hand=[1,5,20,10]
another_hand=player_hand

とすれば、another_handもplayer_handと同じ[1,5,20,10]を指すようになります。関数の引数の場合もこれと同じで、関数の中ではplayer_handをhandと便宜的に呼ぶことにする、と決めているわけですね。それが

def get_sum(hand):

の部分です。便宜的に呼ぶ名前なので、それがaaaでもbbbでもいいわけです。

(2)
②のように書くと、関数を呼び出して計算した結果を使い回せなくなってしまうかなと思います。もし、printで表示させるためだけに必要なら②でもいいですが、ソースコードの他の場所でも使いたければ①のように変数に代入しておくと、一度計算した結果を他の場所でも使いまわせるようになります。同じ計算をわざわざ何度もやらずに済みますね。

投稿2018/02/13 15:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

python365

2018/02/14 12:42

詳しく解説して下さりありがとうございます。 初心者にもわかるように丁寧に解説して下さり感謝します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問