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

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

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

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

Python

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

Q&A

解決済

3回答

1351閲覧

Python で () がいる関数といらない関数(?)の違い

Norway_H

総合スコア3

関数

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

Python

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

0グッド

1クリップ

投稿2020/08/26 14:22

###前提

python

1import pandas as pd 2df #データフレーム

###分からないこと
df.dtypedf.columnsは()を使わずに用います。

一方で例えば
df.isnull()df.sum()は()を使わないといけません。

この違いは一体どこにあるのでしょうか?前者は関数ではなく、モデュール?など想像していますが、いまいち答えがわかりません。何かヒントを教えて頂けませんでしょうか。

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

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

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

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

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

meg_

2020/08/26 15:14

私も正確には説明できないので「属性、関数(メソッド)」で調べてみてください。
guest

回答3

0

ベストアンサー

#プロパティ
df.dtypesdf.columnsが()を使わずに用いることができるのは、それらがプロパティとして実装されているからです。

プロパティとして実装されていることによって、コード上、あたかも属性を直接扱うかのように代入や読み取りができる一方、代入や読み取りの際に、関数と同様に、たとえば値のチェック等、付随する処理も行うことが可能です。

だとえばdf.columnsに、変なラベルを代入しようとすると例外が出ます。

プロパティとは、かんたんにいえば、pythonにおいては、下記のような、オブジェクトのデータの読み込みや書き込みを制御するためのスマートな仕組みです。(JavaやC#など他の主要なプログラミング言語でも大抵似たような仕組みはあります)

class Car: def __init__(self): self._gear = 1 @property def gear(self): return self._gear @gear.setter def gear(self, v): if not isinstance(v,int): raise ValueError if v > 6: self._gear = 6 elif v < 1: self._gear = 1 else: self._gear = v

これはCarというクラスに対して、gearというプロパティを設定しているごく単純な例です。

def関数の前に@propertyと、@属性名(gear).setterというデコレータをつけています。

使い方の例として

mycar = Car() print(mycar.gear) mycar.gear+=1 print(mycar.gear) mycar.gear+=9 print(mycar.gear) mycar.gear = "ギア1" print(mycar.gear)

とすると、1,2,6と表示され、最後はValueErrorが発生します。

初期状態ではギアが1,
次はギアを1段階上げるので2になります。

(ここまでは、単なるCarクラスのインスタンス属性としてgearを作った場合と変わりません)

次でさらに9段階上げようとしてますが、@setter内でギアの上限がチェックされているため、
(安全に)6までしかギアが上がりません。

また、文字列をギアに設定しようとすると、@setter内で例外を発生させています。

このようにプロパティを使うことで、あたかもの属性を直接操作するようにコードを書くことができる一方で、代入時のチェックを実現してます。

@getterや@ deleterを使うことで読み取り時や削除時の処理も記述できます。

関数

関数を呼び出すときは引数とともに()をつけます。
引数を省略することもできますが、()は省略できません。

df.isnull()df.sum()はそれぞれ、
・nullかどうかチェックして真偽値を返す、
・データフレーム内のデータの合計という処理を行って、合計値を返す
という純粋な処理なので、関数として定義されているものと思われます。

使い分けの基準

もちろん上記のdtypesやcolumnsも、
df.dtypes()
df.columns()
みたいに関数として定義することも可能なはずです。
しかし、pandasの偉い人たちはそういうアプローチはとっていません。

これは、
dtypes(型の一覧)やcolumns(列の一覧)は、処理というよりも、より「属性」に近いものであるから
ではないかと勝手に推測してます。

逆にdf.isnull()df.sum() は「処理」としての色合いが濃いので、関数として定義されているんじゃないでしょうか。

(もちろん「sumはデータフレーム内の集合に関するものだからデータフレームの属性っぽいものじゃないか」とか「dtypesは型を列挙して返すから処理ともいえるじゃないか」いう意見もあるかもしれませんが)

投稿2020/08/26 15:51

編集2020/08/27 05:03
sfdust

総合スコア1137

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

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

0

import pandas as pd dftype = pd.DataFrame([["あいうえお",123],["かきこくえこ",234]]) type(dftype.dtypes) type(dftype.columns) type(dftype.isnull)

typeを見れば分かりますが、methodなので()をつけて実行しているのです

投稿2020/08/26 15:20

hentaiman

総合スコア6426

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

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

0

関数ではないから()をつけないだけです
関数を実行させるには、関数名の後ろにカッコを付け、必要ならそこに引数を列挙します

投稿2020/08/26 14:26

編集2020/08/26 14:28
y_waiwai

総合スコア88042

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

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

Norway_H

2020/08/26 14:36

ご回答ありがとうございます。 関数ではないなら、いったい何に当たるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問