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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

Q&A

解決済

4回答

8475閲覧

Pythonで最初の1度目だけTrueを返す関数

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

0グッド

0クリップ

投稿2019/04/18 10:42

編集2019/04/25 09:47

pythonを用いて、全ての呼び出しにおいて最初の1度目に呼び出された時だけflag=Trueを返す関数を作りたいです。(HTTPリクエストは関係なし)
ロジックが考えつかず、コードも冗長になってしまいます。
どなたかご教示ください。

ここまで足掻いたサンプルコード

def getFlag(): global flag flag = True res = getFlag2() return res def getFlag2(): global flag if (flag): flag = False return True return False

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

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

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

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

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

Lhankor_Mhy

2019/04/18 10:51

『最初の1度目』というのは何を基準に最初ですか? セッションとかでしょうか?
mather

2019/04/18 10:52

> 最初の1度目に呼び出された時だけ この部分は誤解がないようにきちんと説明してください。 一度のHTTPリクエストの中で複数回呼び出されたときに最初だけTrueを返すのか、 すべての呼び出しにおいて一度だけTrueを返すのか、 どちらですか?
退会済みユーザー

退会済みユーザー

2019/04/18 10:54

説明足らずすみません。「全ての呼び出しにおいて」です。
guest

回答4

0

関数に状態を持たせたい場合、一般的な方法は

  • クロージャ
  • 関数をやめてクラスで書く

のどちらかが良いと思います。どちらもほとんど同様に使えます。

クロージャの場合。

python

1def gen_f(): 2 flag = True 3 def f(): 4 nonlocal flag 5 if flag: 6 flag = False 7 return True 8 else: 9 return False 10 return f 11f = gen_f() 12print(f()) # => True 13print(f()) # => False 14print(f()) # => False 15

クラスの場合。

python

1class gen_f: 2 def __init__(self): 3 self.flag = True 4 5 def __call__(self): 6 if self.flag: 7 self.flag = False 8 return True 9 else: 10 return False 11 12f = gen_f() 13print(f()) # => True 14print(f()) # => False 15print(f()) # => False

他に、状態をグローバル変数に持たせる(簡単そうだけど何かとトラブルのもとにもなる)、関数オブジェクトの属性に持たせる(can110さんの方法)などがあります。

グローバル変数に持たせる場合。

python

1def f(): 2 global flag 3 if flag: 4 flag = False 5 return True 6 else: 7 return False 8flag = True 9

関数オブジェクトの属性に持たせる場合(少し改良して関数のブロック内で属性を作っています。初回呼び出し時には属性が存在しないことを使います)。

python

1def f(): 2 if not hasattr(f, "flag"): 3 f.flag = True 4 return True 5 return False

投稿2019/04/18 11:18

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2019/04/18 13:34

とてもわかりやすいです。ありがとうございます。
guest

0

ベストアンサー

関数オブジェクト自体を置き換えてしまうのはどうでしょうか。
これならば毎回フラグ変数を見に行く必要がありません。

Python

1def get_flag(): 2 global get_flag 3 def get_flag(): 4 return False 5 6 return True 7 8for _ in range(10): 9 print(get_flag())

実行結果 Wandbox

True False False False False False False False False False

Flaskは触ったことも無いので、頓珍漢な提案でしたらごめんなさい。

投稿2019/04/18 10:49

編集2019/04/18 10:51
LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2019/04/18 11:03

こちらで解決しました。ありがとうございます!
guest

0

python

1from functools import partial 2from threading import Semaphore 3 4fn = partial(Semaphore().acquire, False)

実行結果

>>> fn() True >>> fn() False >>> fn() False

投稿2019/04/18 13:26

YouheiSakurai

総合スコア6142

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

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

0

こんな手段もあるようです。関数オブジェクトもメンバ変数持てるんですね。
参考:What is the Python equivalent of static variables inside a function?

Python

1def getFlag(): 2 flag = getFlag.flag 3 getFlag.flag = False 4 return flag 5getFlag.flag = True 6 7print(getFlag()) # True 8print(getFlag()) # False 9print(getFlag()) # False

投稿2019/04/18 11:04

can110

総合スコア38233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問