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

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

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

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

Q&A

解決済

4回答

4081閲覧

python 関数内にある関数の呼び出し方

blendegg

総合スコア81

Python

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

0グッド

2クリップ

投稿2019/05/01 12:18

###疑問
pythonで関数の中にある関数を呼び出すにはどうしたらいいのでしょうか?
以下のコードではエラーになりました
func_innnerという属性はないというエラーです

python

1def func(): 2 print("a") 3 def func_inner(): 4 print("b") 5 6func() 7func.func_inner()

python の selfについてよく理解できておらず、もしかするとselfが必要になるのかなと考えています。

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

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

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

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

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

iwamot

2019/05/01 12:34

事情がおありなのかもしれませんが、外から呼び出す必要があるのであれば、外に出して普通の関数にしたほうがよいと思います。
guest

回答4

0

func_innerという名前は、func関数内のローカルなので、外からは見えません。

関数自体はあるので、外に持ち出せば良いです。

Python

1def func(): 2 print("a") 3 def func_inner(): 4 print("b") 5 return func_inner 6 7x=func() 8x()

Python

1def func(): 2 global y 3 print("a") 4 def func_inner(): 5 print("b") 6 y = func_inner 7 8func() 9y()

投稿2019/05/01 12:46

otn

総合スコア84555

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

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

0

python

1def func(): 2 print("a") 3 global func_inner 4 def func_inner(): 5 print("b") 6 7func() 8func_inner()

にすると実行できます。

投稿2023/12/25 09:43

編集2023/12/25 09:50
ookatu

総合スコア2

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

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

0

ベストアンサー

詳しい話は他の方の回答にお任せするとして…

クラス、というかオブジェクト指向的な考え方を
まずは調べられた方がいいのかなあって気がします。
難しそうに思われるかもしれませんが、
順を追って勉強すればなんとかなりますよ。
がんばってください。

投稿2019/05/01 14:20

takasima20

総合スコア7458

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

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

0

pythonではその記述は、関数の中に関数を定義したとはみなされません。関数を定義する文のブロックの中に関数を定義する文を書いた、とみなされます。外側はそのまま評価されてグローバル名前空間にfuncが登録されますが、内側は呼び出しのときまで評価されません。

要するに、a = "hoge"と書いたのと同じで、実行時評価です。外側の関数の実行時まではfunc_innerは存在しませんし、複数回呼べば別々のオブジェクトが生成されます。

python

1def func(): 2 print("a") 3 def func_inner(): 4 print("b")

python

1lst = [] 2def func(): 3 print("a") 4 def func_inner(): 5 print("b") 6 lst.append(func_inner) 7 8func() 9func() 10func() 11print(lst) 12""" => 13a 14a 15a 16[<function func.<locals>.func_inner at 0x7fa5cdb1f840>, 17 <function func.<locals>.func_inner at 0x7fa5cda87158>, 18 <function func.<locals>.func_inner at 0x7fa5cda871e0>] 19# 存在するメモリ番地が違う=呼び出し毎に別オブジェクトが生成されている 20"""

インスタンスの属性などとはまったく違った性質を持つと理解するべきです。selfは使えません(そもそも構文上受け付ける仕組みがないのだが)。原理的に「外側の関数を呼び出さないでアクセスする」方法はありません。

グローバル変数に代入するとか、returnで内側の関数を返して呼び出し側で束縛するとかすれば、「ある呼び出しの時に生成された内側の関数」を捕まえることは可能です。これをうまく利用したクロージャというテクニックもあります。しかし、積極的にそうする理由がなければ、関数内関数を外から呼ぶのは避けたほうが良いです(もっと言えば、関数内関数自体そうめったに必要になるものではない)。

投稿2019/05/01 13:07

編集2019/05/01 13:08
hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問