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

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

ただいまの
回答率

90.76%

  • Python

    6871questions

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

間違えたif文とフラグの使いかた

受付中

回答 8

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 381

terak31

score 6

お世話になります。
5つの分岐をして、結果的に条件に合わない場合は、成功と考えて

arbitrage_decision = 1  # 停止がない為、裁定取引判定処理を実施(一番下の行です)

を実行したいのですが、あまりに長くカッコ悪いので
別のみやすい書き方はないでしょうか?難しいすぎるようなコードは読めませんので適度に見やすい方が良いですが
これは、なんかとても長いイメージがあります。

    if net_profit_price < 0:
          stop_process_no1 = stop_process_no1 + 1
          arbitrage_decision = 0  
    if net_ask_price > risk_limit_price:  #
          stop_process_no2 = stop_process_no2 + 1
          arbitrage_decision = 0  
    if net_bid_price > risk_limit_price:  #
          stop_process_no3 = stop_process_no3 + 1
          arbitrage_decision = 0  
    if net_profit_price < minimum_profit_price:
          stop_process_no4 = stop_process_no4 + 1
          arbitrage_decision = 0  
    if net_profit_rate < minimum_profit_rate:
          stop_process_no5 = stop_process_no5 + 1
          arbitrage_decision = 0  
    if (net_profit_price < 0):
        pass
    else:
        if (net_ask_price > risk_limit_price):
            pass
        else:
            if (net_bid_price > risk_limit_price):
                pass
            else:
                if (net_profit_price < minimum_profit_price):
                    pass
                else:
                    if (net_profit_rate < minimum_profit_rate):
                        pass
                    else:
                        arbitrage_decision = 1
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

+3

bool_list = [net_profit_price < 0,
             net_bid_price > risk_limit_price,
             net_ask_price > risk_limit_price,
             net_profit_price < minimum_profit_price,
             net_profit_rate < minimum_profit_rate]

if not any(bool_list):
    arbitrage_decision = 1

anyを使えばリスト内のいずれかがtrueであればtrue
全てがfalseであればfalseを返してくれます。

not any とする事で全てがfalseならばtrueとする事が出来ます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:50

    素敵ですね。ただそれぞれの処理のカウントアップをしたいのですが、そういった時はどう書けばいいですか?stop_process_no1 = stop_process_no1 + 1

    キャンセル

  • 2018/05/30 18:02

    すいませんこれはelse後の無駄なpassを無くすためのコードです。

    キャンセル

  • 2018/05/30 18:52

    not anyにしないと駄目なのでは

    キャンセル

  • 2018/05/30 18:55

    確かにそうですね...失礼しました。修正させていただきます。

    キャンセル

  • 2018/05/30 19:03 編集

    全てがfalseならばtrueとするのであれば not all ではなく not anyでは?
    print( not all([False,True])) # True????
    print( not any([False,True])) # False
    print( not all([False,False]))# True
    あっと失礼。指摘かぶりました。
    print( not any([False,False]))# True

    キャンセル

  • 2018/05/30 19:05

    修正後の「全てがfalseならばfalseとする事が出来ます」の説明が間違っているのではないでしょうか

    キャンセル

  • 2018/05/30 19:08

    何度もすいません... 修正させていただきました

    キャンセル

  • 2018/05/30 19:09

    「いずれか1つ以上がtrueならfalse」、「すべてがfalseならtrue」なのでまだ間違ってますね・・・

    キャンセル

  • 2018/05/30 19:10

    すいません完全にこんがらがってました。今度こそ大丈夫だと思います。

    キャンセル

  • 2018/05/30 19:12

    一度に書かなかった私が悪いのですが、上の「anyを使えばリスト内のいずれかがtrueであればfalseを返してくれます。」の方も・・・

    キャンセル

  • 2018/05/30 19:20

    もっと落ち着かないといけないですねえ... 今度こそ大丈夫かと思います...

    キャンセル

  • 2018/06/01 11:14

    ありがとうございます。えっとこれでOKでしょうか?かっこいいコードですね!

    キャンセル

  • 2018/06/01 11:16

    みんなの指摘が交差しててかっこいいなー

    キャンセル

+2

条件を逆にしてandで繋げば一つのifで済むのでは?

if (net_profit_price >= 0 and 
    net_ask_price <= risk_limit_price and
    net_bid_price <= risk_limit_price and
    net_profit_price >= minimum_profit_price and
    net_profit_rate >= minimum_profit_rate):
    arbitrage_decision = 1

 追記

stop_process_dict = {0:0, 1:0 2:0, 3:0, 4:0}
state_lst = [net_profit_price < 0, 
             net_ask_price > risk_limit_price,
             net_bid_price > risk_limit_price, 
             net_profit_price < minimum_profit_price,
             net_profit_rate < minimum_profit_rate]

for i, state in enumerate(state_lst):
    if state:
        stop_process_dict[i] += 1
        arbitrage_decision = 0  

if not any(state_lst):
    arbitrage_decision = 1

変数を変えてしまうのが前提のコードです。なので他の部分にも修正が及びます(stop_process_no1stop_process_dict[0]等とします)。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:39

    ありがとうございます!こういうのがやりたかったです。今度からはこのようなコードをかけるようになりたいです。本当にありがとうございました。

    キャンセル

  • 2018/05/30 17:51

    それぞれの処理のカウントアップをしたいのですが、そういった時はどう書けばいいのでしょうか?stop_process_no1 = stop_process_no1 + 1

    キャンセル

  • 2018/05/30 18:01

    上半分の部分にはいろいろな問題があって、あまり手をつけたくないのですが
    ・そもそも似たような変数が5つもあるとわかりづらい
    ・下と同じ判定なのでコードがかぶってわかりづらい(そしてバグの温床になる)
    そうすると、他の方の回答に上がっているように、booleanの配列を先に作るのがよさそうです。stop_process_no*はすべてコレクション型で管理するようにし、
    ・booleanの配列をループで回す→コレクション型の該当する要素をインクリメントする
    ・all(booleanの配列)ですべてのandになるので、それでifの判定をしてarbitrage_decision=1の処理をする
    こんな方針でどうでしょうか

    キャンセル

  • 2018/05/30 18:34

    しかしカウントアップはそれぞれに必要ですよね。
    stop_process_no2 += 1

    キャンセル

  • 2018/05/30 18:46

    記述をまとめてしまうことはできるでしょう。ちょっと追記してみます

    キャンセル

  • 2018/05/30 18:48

    ありがとうございます。宜しくお願いいたします。とても素敵なコード個人的には一番好きだったのでぜひよろしくお願いします。

    キャンセル

  • 2018/05/30 19:00

    結局not anyにしました(逆転させておいていちいちnot入れるのもバカバカしかった)。コメントにも書いた通り変数をぜんぶstop_process_dictに押し込んでいるので、今までどおりstop_process_no1等と簡単にアクセスすることはできなくなりましたねー。でもこの方が余計な苦労がないと思います

    キャンセル

  • 2018/05/30 19:01

    キーを0,1,2,3,4にするならリストでも良いか・・・付けたい名前があれば付けてあげてください。ただしforループでアクセスするとき、そのキーのリストとstate_lstをzipで回す等の変更が必要になります

    キャンセル

  • 2018/05/30 19:04

    ありがとうございます。なるほどー。ちょと私には難しいです。

    キャンセル

  • 2018/05/30 19:11

    そのまま使う必要はないので、いろいろな人のコードを見て勉強の参考にすれば良いです

    キャンセル

  • 2018/05/30 19:13

    いつもありがとうございます!引き続きよろしくお願いします。

    キャンセル

+2

条件が5つなら、それぞれ番号つけて、後でまとめて処理するほうがわかりやすいとおもいますぜ
・・・って、switch あればなあ

  hoge=0
  if(aaa):
    hoge=1;
  if(bbb):
    hoge=2;
  if(ccc):
    hoge=3;
  if(ddd):
    hoge=4;
  if(eee):
    hoge=5;

  if(hoge<=0):
    その他の処理
  if(hoge==1):
    aaa の処理
  以下略

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:51

    素敵ですね。ただそれぞれの処理のカウントアップをしたいのですが、そういった時はどう書けばいいのでしょうか?stop_process_no1 = stop_process_no1 + 1

    キャンセル

  • 2018/05/30 17:56

    他の回答にありますが、カウントアップするなら
    stop_process_no1 += 1
    って記述でOKですねー

    キャンセル

  • 2018/05/30 19:13

    ありがとうございます!

    キャンセル

+2

複雑な条件のIF文を一つにまとめると、
デバック時に追いにくいので私なら以下のようにします。

check1=net_profit_price < 0
check2=net_ask_price > risk_limit_price 
check3=net_bid_price > risk_limit_price
check4=net_profit_price < minimum_profit_price
check5=net_profit_rate < minimum_profit_rate

    if check1:
          stop_process_no1 = stop_process_no1 + 1
          arbitrage_decision = 0  
    if check2:  #
          stop_process_no2 = stop_process_no2 + 1
          arbitrage_decision = 0  
    if check3:  #
          stop_process_no3 = stop_process_no3 + 1
          arbitrage_decision = 0  
    if check4:
          stop_process_no4 = stop_process_no4 + 1
          arbitrage_decision = 0  
    if check5:
          stop_process_no5 = stop_process_no5 + 1
          arbitrage_decision = 0

if(!check1 and !check2 and !check3 and !check4 and !check5)
{
  arbitrage_decision = 1
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

if (net_profit_price < 0): #判定No1
        return 0

if (net_ask_price > risk_limit_price): # 判定No2
        return 0

if (net_bid_price > risk_limit_price): # 判定No3
        return 0

if (net_profit_price < minimum_profit_price): # 判定No4
        return 0

if (net_profit_rate < minimum_profit_rate): # 判定No5
        return 0

return 1  # 停止がない為、裁定取引判定処理を実施

質問文のコードを1つの関数にし、上記のようにしてはどうでしょうか?
(メッセージ出力や各種変数への値の代入は端折りました。)
関数の呼び出し元からは、返り値を見て裁定取引判定処理を実施するかどうかを判断できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:46

    丁寧にありがとうございました。
    if (net_profit_price >= 0 and
    net_ask_price <= risk_limit_price and
    net_bid_price <= risk_limit_price and
    net_profit_price >= minimum_profit_price and
    net_profit_rate >= minimum_profit_rate):
    arbitrage_decision = 1
    こっちの方が良いのでこっちにします。これからもよろしくお願いします。

    キャンセル

  • 2018/05/30 17:51

    それぞれの処理のカウントアップをしたいのですが、そういった時はどう書けばいいのでしょうか?stop_process_no1 = stop_process_no1 + 1

    キャンセル

+1

質問からは少し外れますが、 stop_process_no1 = stop_process_no1 + 1 は、stop_process_no1 += 1 とした方がいいですね。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 18:29

    ありがとうございます。書き直します。

    キャンセル

+1

おそらく題意に沿わないので回答ではありませんが
各判定をリストで管理し、かつその結果を積算するコードを考えてみました。

err_cnt = [0,0,0,0,0] # 各判定結果(エラー数)
for (a,b) in [(1,2),(11,101),(101,1001)]: # テスト

    err_list = [a > 10, a > 100, b > 10, b > 100, b > 1000] # True=エラー
    print(a,b)
    print(err_list)

    # エラー数の積算
    err_cnt = [ c + l for (c,l) in zip(err_cnt, err_list)]
    print(err_cnt)

    if not any(err_list): # いずれかTrue(エラー) の逆 = すべてFalse(正常)
        print('pass!')
    else:
        print('ng!')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

変数保持の仕方に根本的な問題があると思いますが…

    import operator
    def process(val, thr, pro, dec, comp=operator.lt):
        if comp(val, thr):
            return pro+1, 0
        else:
            return pro, dec

    stop_process_no1, arbitrage_decision = process(net_profit_price,
                                                   0,
                                                   stop_process_no1, arbitrage_decision)
    stop_process_no2, arbitrage_decision = process(net_ask_price,
                                                   risk_limit_price,
                                                   stop_process_no2, arbitrage_decision,
                                                   comp=operator.gt)
    stop_process_no3, arbitrage_decision = process(net_bid_price,
                                                   risk_limit_price,
                                                   stop_process_no3, arbitrage_decision,
                                                   comp=operator.gt)
    stop_process_no4, arbitrage_decision = process(net_profit_price,
                                                   minimum_profit_price,
                                                   stop_process_no4, arbitrage_decision)
    stop_process_no5, arbitrage_decision = process(net_profit_rate,
                                                   minimum_profit_rate,
                                                   stop_process_no5, arbitrage_decision)
    
    if (net_profit_price >= minimum_profit_price and
        net_ask_price <= risk_limit_price and
        net_bid_price <= risk_limit_price and
        net_profit_rate >= minimum_profit_rate):
        arbitrage_decision = 1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6871questions

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