• ベストアンサー

python return 関数

pythonで以下のようなコードがありました。 returnでメソッド内のメソッドを返すのは、どういう意味があるのでしょうか? 仕組みが分かっていません。 よろしくおねがいします。 class OkWave(object): @classmethod def funcA(cls ,abc,def): def funcB(self, xyz): 何かの処理P return funcB

  • Python
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ここだと、スペースやタブが削除されてしまうので、Pythonの記述には致命的です。 全角スペース等でインデントが崩れないようにしましょう。 本題。 Pythonでは、関数もオブジェクトです。 f=Okwave.funcA(abc,def) # funcBの関数オブジェクトが返る data=f(xyz) # → funcBを呼びだす # return funcB(a)等と、関数funcBの戻り値を返すのが正解で、このプログラムは間違い、という可能性もありますが

関連するQ&A

  • Pythonのコードself多すぎ読み書きしにくい

    Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。 Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。 Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。 (例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん) class Sample: def __init__(self): self.L = [] # Lは数値のリスト def setList(self, L): self.L = L def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた # 値に、大きい方を小さい方で累乗した値を加える if self.L[i1] > 0 and self.L[i2]: if self.L[i1] > self.L[i2]: return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2] else: return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1] イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。 「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか? どうぞよろしくお願いします。

  • pythonの関数内での関数の定義について

    Python Cookbook 3rd の2章6節の内容でわからないことがあります。 コード import re #サンプルテキスト text = 'UPPER PYTHON, lower python, Mixed Python' #正規表現で文字のケースに合わせて置換する def matchcase(word) .....def replace(m): ..........text = m.group() ..........if text.isupper(): ...............return word.upper() ..........elif text.islower() ...............return word.lower() ..........elif text[0].isupper(): ...............return word.capitalize() ..........else: ..............return word .....return replace #実行分 re.sub('python', matches('snake'), text, flags=re.IGNORECASE) #実行結果 >>>'UPPER SNAKE, lower snake, Mixed Snake' このサンプルコードのmatchcase内のreplace関数に引数を渡していないと思うのですが、どのような仕組みでこのコードは動いているのでしょうか? m.group()とあるので実行分のre.sub(...)でのマッチしたという情報がreplace(m)のmに渡されているだろうとは思うのですが、なぜ引数を指定せずにそのようなことが起こるのかが理解できません。 何卒よろしくお願いします。

  • Pythonで属性とは?

    プログラミング初心者です、よろしくおねがいします 自分でも調べたのですが初心者すぎて用語が難しく解らないところが多くはっきりしないので教えてください。 Pythonでいうオブジェクト、メソッド、属性の違いはなんですか? 私の今の所の知識では オブジェクト=クラスやメソッドやクラス変数 メソッド=クラスの中に有る関数 属性=クラスの中にある関数や変数など じゃ、オブジェクトと属性の違いってなんなの?ということに 以下の例題でA objects are given a color attribute of "white"とあります attribute=属性ですよね? つまり属性とはインスタンス変数の中身のことなの? class A(object): ....def __init__(self): ........self.color = "white" word = A() print(word.color) 有識者の方々にはくだらなすぎる疑問かも知れませんがよろしくおねがいします

  • CからC++の関数呼び出し

    CからC++の関数を呼び出して値を取得したいのですが、コンパイルエラーになってしまいます。 呼び出す関数内でさらに同じクラスの関数を呼び出して値をreturnしたいだけなのですが、 ご教示願います。 ソースは下記のような感じです。 Cソース(AAA.c) main(){ ・・・・・ if ( funcA() ){ ・・・・ } } C++ソース(BBB.cpp) int clsB::funcB { return iflg; } extern "C" { int funcA() { return funcB(); } } ※上記externは特に何かの関数内に書いているわけではありません。 C++ヘッダ(BBB.hpp) class clsB : public XXX { private: int iflg; ・・・・ public: int funcB(); ・・・・ } 上記にコンパイルすると、 externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。 ラッパ関数を使って使用するなどと聞いたのですが、やり方がいまいちわかりません。 どうか教えていただけますでしょうか。 また、他にやり方があるかと思いますが、いいやり方があれば教えていただけると幸いです。 以上です、よろしくお願いいたします。 不足内容あれば指定願います。

  • Pythonに詳しい方助けてください!

    --------------------------------------------------- class Node: def __init__(self, x, bros = None, child = None): self.data = x self.bros = bros self.child = child def traverse(self, leaf): if self.data == leaf: yield [] else: child = self.child while child: for x in child.traverse(leaf): yield [self.data] + x child = child.bros --------------------------------------------------- Nodeクラスの一部を抜粋いたしました。 関数traverseが何をやっているのか知りたいのです。 Pythonの知識はほぼないですが、C++が多少分かるので、 C++に書き換えていただけると一番ありがたいです。 本当にすみません。 お分かりになる方いらっしゃいましたら教えて下さい。 ※インデントが重要と思われるPythonで投稿したらインデントが消えちゃいました。  画像を添付いたします。  本当にどうか助けてください. (;_;).

  • python

    pythonについての質問です。 def S_sa(k=1) for step in xrange(k) : if step == 0 : print 'a' else print 'b' というコードがあって、なぜかprint aが実行されるのはなぜでしょうか? xrangeのreturnは1ではないのでしょうか?

  • クラスから自分のオブジェクトを操作するには

    高橋麻奈著の「やさしいJava」を買って、Javaプログラミングをはじめたのですが、どうしても分からないことがあるので質問させてください。 次のようなコードがあります。 class Abc{  public static void main(String arg[]){   Def de = new Def();   de.object_null();   Def de2 = new Def();   de2.object_null();   Ghi gh = new Ghi();   gh.object_null();  } } class Def{  int d,e,f;  Abc abc;  Def(Abc a,int i1,int i2){   //略  }  public void object_null(Abc a){   abc = a;   abc.de = null;  } } class Ghi extends Def{  Ghi(Abc a,int i1,int i2){   super(a,i1,i2);  } } Defクラス側から自分自身のクラス変数deをnullにする場合、public void object_null()メソッドのような方法でクラス変数を指定してnullにしていました。 しかし、この場合、クラス変数de2のobject_null()メソッドではde2をnullできないし、 サブクラスGhiから、クラス変数ghをnullにする場合も、クラス変数deを指定してしまいます。 クラス側から自分自身のクラス変数を指定する良い方法を教えてください。 よろしくお願いします。 #ここは半角スペース無効なんですね(^^;

    • ベストアンサー
    • Java
  • python print文のエラーがでます

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import datetime class TZ(datetime.tzinfo): def __init__(self, name, offset): self.name = name self.offset = offset def utcoffset(self, dt): return datetime.timedelta(hours=self.offset) def tzname(self, dt): return self.name def dst(self, dt): return datetime.timedelta(0) def main(): path = '/sys/bus/w1/devices/28-000*********/w1_slave' with open(path) as f: data = f.read() temp = float(data[data.index('t=')+2:])/1000 FMT = '{},{:.1f}' JST = TZ('JST', 9) now = datetime.datetime.now(JST) print(FMT.format(now.strftime("%Y/%m/%d %H:%M:%S"), temp)) if __name__ == '__main__': main()
 とうってじっこうすると print(FMT.format(now.strftime("%Y/%m/%d %H:%M:%S"), temp)) の部分に SyntaxError: invalid syntax とエラーがでます。 どういうことなのか教えていただけるとうれしいです!

  • C言語での単体テストの作成について質問です。

    C言語での単体テストの作成方法がわからずに困っています。 以下のようなA.cの中のFuncA関数のテストを作成しています。 /*** A.c ********************/ #include "B.h" int FuncA (int n) { int temp; if (FuncB() == true) temp = n * 2; else temp = n / 2; return temp; } /****************************/ FuncA関数は中でB.c内のFuncB関数を読んでいますが、 これは、B.h、B.cに定義されている関数です。 このFuncB関数は本物のソースを使用せず、スタブを使用してテストを作成しています。 FuncB関数のスタブは以下のように考えています。 /*** BStub.h ********************/ extern bool retVal extern bool FuncB_Stub(void); /******************************/ /*** BStub.c ********************/ #include "BStub.h" bool retVal; bool FuncB_Stub(void) { return retVal; } /******************************/ できる限り、A.cに単体テスト用のコードを埋め込まずにテストを作成したいのですが、 FuncA関数がFuncB関数ではなく、BStubのFuncB_Stub関数を呼び出すようにするには どのようにしたらよろしいでしょうか?

  • VBAからPythonを動かしたいのですが…

    いつもお世話になっております。 icevainと申します。 python超初心者です。 【質問】 『VBAでPythonを動かす』という興味のあるサイトを見つけました。 https://qiita.com/O_LUPAN/items/1ceb5c950ff40f3558ab サイトのpythonコード #ここから import sys def sum(suji1, suji2): return suji1 + suji2 if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで サイトのpythonコードを無理やり変更して、 #ここから import sys def sum(suji1, suji2): rst="OK" return rst if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで OKがかえってくると思ったのですが、 0がかえってきてしまいます。 OKをかえすにはどうすればよいのかわかりません。 お分かりの方おりましたらご協力お願い致します。