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

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

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

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

Python

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

Q&A

解決済

3回答

2321閲覧

関数の実行に()を付けるときと付けない時の違いを教えてください。

wafflar

総合スコア18

関数

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

Python

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

1グッド

3クリップ

投稿2020/01/30 06:58

質問です。

・このコードのprint(sorted(abs_list, key = my_abs))のsorted()の中身がどんな仕組みで実行されてるのか分からないです。

・my_abs(num)のnumがどうやって入れられてるのか分からないです。abs_listのことだと思うんですけど、なんでそこに入れられるのか疑問です。

・関数を利用する時は関数の後ろに()を付けることで実行されるってあったんですけど、()が無くても実行されることってあるんですか?

・今回のコードの場合、関数が「my_abs」で、実行するなら「my_abs()」とせずにそのままするのは何故ですか?
このコードの実行の部分は、print(sorted(abs_list, key = my_abs))のmy_absの部分で合ってますよね?

・疑問に思って()をつけて実行するとエラーになりました。
実行する場合、どういう時に関数の後ろに()を付けたり外したりするのか分からなくなってしまいました。教えてください。
初歩的な質問ですみません。

該当のソースコード

python

1abs_list = [-4, 8, 3, -7, 0, 2] 2def my_abs(num): 3 if num < 0: 4 num *= -1 5 return num 6print(sorted(abs_list, key = my_abs))

ちなみに実行結果は
[0, 2, 3, -4, -7, 8]
です。

tyamzak_👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず前提としてPythonでは関数もオブジェクトして扱われます。
すなわちc = my_funcのようにに関数名にカッコをつけないと、cには関数がオブジェクトとして代入されます。
そのうえでc(123)のようにカッコをつけると、cに格納された関数が呼び出されます。

次にsorted(iterable, *, key=None, reverse=False)によると

key には 1 引数関数を指定します。これは iterable の各要素から比較キーを展開するのに使われます (例えば、 key=str.lower のように指定します)。

とありますが、1 引数関数を指定とは、一つの引数をとる関数(オブジェクト)を指定するということです。
sortedでは、内部でこの関数を各要素に対して呼び出すことによりソートを行っています。

以上を踏まえると

・my_abs(num)のnumがどうやって入れられてるのか分からないです。abs_listのことだと思うんですけど、なんでそこに入れられるのか疑問です。

sortedが内部で入れてくれています。

・関数を利用する時は関数の後ろに()を付けることで実行されるってあったんですけど、()が無くても実行されることってあるんですか?

「実行」されることはないです。しかし前述のような仕組みで間接的に実行することができます。

・今回のコードの場合、関数が「my_abs」で、実行するなら「my_abs()」とせずにそのままするのは何故ですか?

sorted内部で実行する関数を、key=my_absと記述することで関数オブジェクトとして指定(渡して)います。

このコードの実行の部分は、print(sorted(abs_list, key = my_abs))のmy_absの部分で合ってますよね?

はい。sorted内部で実行されます。

以下、以上の説明のまとめとしてsortedと同じ仕組みのcalcedという関数例を示します。

Python

1 2# リストの各要素に対して何らかの計算をする関数 3# calc_funcには「何らかの計算」を行う関数を指定する 4def calced( lst, calc_func): 5 ret = [] 6 for n in lst: 7 # この場合は実際にはmy_calcが呼ばれる 8 c = calc_func(n) 9 ret.append(c) 10 return ret 11 12 13def my_calc(n): 14 return n*n 15 16 17# 通常の関数呼び出し 18print( my_calc(2)) # 4 19 20# 関数もオブジェクトなので変数として代入できる 21c = my_calc 22print(c) # <function my_calc at 0x0000012C60E7F4C8> 23 24# cにカッコをつけると関数を実行することができる 25print(c(3)) # 9 26 27# calced内部で利用する関数としてmy_calcを指定する 28lst = [1,2,3] 29ret = calced( lst, my_calc) 30print(ret) # [1, 4, 9]

投稿2020/01/30 07:50

can110

総合スコア38262

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

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

wafflar

2020/01/30 14:53

こんなに色々と丁寧に答えてくださり、例までも書いてくださりありがとうございます! 理解力があまりなく、まだ100%分からないですが、何十回も読み返して自分なりに分かるように頑張ります! 本当にありがとうございます!!
guest

0

今回のコードの場合、関数が「my_abs」で、実行するなら「my_abs()」とせずにそのままするのは何故ですか?

関数そのものを引数として渡すからです。my_abs()とすると、関数を実行した結果を渡すことになります。

投稿2020/01/30 07:17

maisumakun

総合スコア145183

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

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

0

直接の回答ではないですが、Pythonインタープリタを起動して実験してみると、理解が早まったりしないでしょうか?

py

1$ python3 2Python 3.7.6+ (heads/3.7:5c08bfe, Jan 15 2020, 14:04:23) 3[GCC 7.4.0] on linux 4Type "help", "copyright", "credits" or "license" for more information. 5>>> def my_abs(): 6... return "Hello" 7... 8>>> my_abs 9<function my_abs at 0x7f02fd35fef0> 10>>> my_abs() 11'Hello' 12>>> f = my_abs 13>>> f 14<function my_abs at 0x7f02fd35fef0> 15>>> f() 16'Hello' 17>>> f = my_abs() 18>>> f 19'Hello'

投稿2020/01/30 08:40

shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問