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

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

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

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

Q&A

8回答

2804閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2018/05/30 08:21

編集2018/05/30 08:41

お世話になります。
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

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

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

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

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

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

guest

回答8

0

python

1bool_list = [net_profit_price < 0, 2 net_bid_price > risk_limit_price, 3 net_ask_price > risk_limit_price, 4 net_profit_price < minimum_profit_price, 5 net_profit_rate < minimum_profit_rate] 6 7if not any(bool_list): 8 arbitrage_decision = 1

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

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

投稿2018/05/30 08:46

編集2018/05/30 10:29
puroko3

総合スコア185

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 08:50

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

2018/05/30 09:02

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

2018/05/30 09:52

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

2018/05/30 09:55

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

2018/05/30 10: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
hayataka2049

2018/05/30 10:05

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

2018/05/30 10:08

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

2018/05/30 10:09

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

2018/05/30 10:10

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

2018/05/30 10:12

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

2018/05/30 10:20

もっと落ち着かないといけないですねえ... 今度こそ大丈夫かと思います...
退会済みユーザー

退会済みユーザー

2018/06/01 02:14

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

退会済みユーザー

2018/06/01 02:16

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

0

複雑な条件の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 }

投稿2018/05/30 08:54

編集2018/05/31 01:41
tamina

総合スコア136

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

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

0

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

python

1 hoge=0 2 if(aaa): 3 hoge=1; 4 if(bbb): 5 hoge=2; 6 if(ccc): 7 hoge=3; 8 if(ddd): 9 hoge=4; 10 if(eee): 11 hoge=5; 12 13 if(hoge<=0): 14 その他の処理 15 if(hoge==1): 16 aaa の処理 17 以下略 18

投稿2018/05/30 08:47

編集2018/05/30 08:58
y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 08:51

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

2018/05/30 08:56

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

退会済みユーザー

2018/05/30 10:13

ありがとうございます!
guest

0

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

python

1if (net_profit_price >= 0 and 2 net_ask_price <= risk_limit_price and 3 net_bid_price <= risk_limit_price and 4 net_profit_price >= minimum_profit_price and 5 net_profit_rate >= minimum_profit_rate): 6 arbitrage_decision = 1

追記

python

1stop_process_dict = {0:0, 1:0 2:0, 3:0, 4:0} 2state_lst = [net_profit_price < 0, 3 net_ask_price > risk_limit_price, 4 net_bid_price > risk_limit_price, 5 net_profit_price < minimum_profit_price, 6 net_profit_rate < minimum_profit_rate] 7 8for i, state in enumerate(state_lst): 9 if state: 10 stop_process_dict[i] += 1 11 arbitrage_decision = 0 12 13if not any(state_lst): 14 arbitrage_decision = 1

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

投稿2018/05/30 08:37

編集2018/05/30 09:58
hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 08:39

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

退会済みユーザー

2018/05/30 08:51

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

2018/05/30 09:01

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

退会済みユーザー

2018/05/30 09:34

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

2018/05/30 09:46

記述をまとめてしまうことはできるでしょう。ちょっと追記してみます
退会済みユーザー

退会済みユーザー

2018/05/30 09:48

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

2018/05/30 10:00

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

2018/05/30 10:01

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

退会済みユーザー

2018/05/30 10:04

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

2018/05/30 10:11

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

退会済みユーザー

2018/05/30 10:13

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

0

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

python

1 import operator 2 def process(val, thr, pro, dec, comp=operator.lt): 3 if comp(val, thr): 4 return pro+1, 0 5 else: 6 return pro, dec 7 8 stop_process_no1, arbitrage_decision = process(net_profit_price, 9 0, 10 stop_process_no1, arbitrage_decision) 11 stop_process_no2, arbitrage_decision = process(net_ask_price, 12 risk_limit_price, 13 stop_process_no2, arbitrage_decision, 14 comp=operator.gt) 15 stop_process_no3, arbitrage_decision = process(net_bid_price, 16 risk_limit_price, 17 stop_process_no3, arbitrage_decision, 18 comp=operator.gt) 19 stop_process_no4, arbitrage_decision = process(net_profit_price, 20 minimum_profit_price, 21 stop_process_no4, arbitrage_decision) 22 stop_process_no5, arbitrage_decision = process(net_profit_rate, 23 minimum_profit_rate, 24 stop_process_no5, arbitrage_decision) 25 26 if (net_profit_price >= minimum_profit_price and 27 net_ask_price <= risk_limit_price and 28 net_bid_price <= risk_limit_price and 29 net_profit_rate >= minimum_profit_rate): 30 arbitrage_decision = 1

投稿2018/05/30 23:27

mkgrei

総合スコア8560

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

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

0

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

Python

1err_cnt = [0,0,0,0,0] # 各判定結果(エラー数) 2for (a,b) in [(1,2),(11,101),(101,1001)]: # テスト 3 4 err_list = [a > 10, a > 100, b > 10, b > 100, b > 1000] # True=エラー 5 print(a,b) 6 print(err_list) 7 8 # エラー数の積算 9 err_cnt = [ c + l for (c,l) in zip(err_cnt, err_list)] 10 print(err_cnt) 11 12 if not any(err_list): # いずれかTrue(エラー) の逆 = すべてFalse(正常) 13 print('pass!') 14 else: 15 print('ng!')

投稿2018/05/30 10:06

can110

総合スコア38256

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

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

0

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

投稿2018/05/30 08:50

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 09:29

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

0

Python

1if (net_profit_price < 0): #判定No1 2 return 0 3 4if (net_ask_price > risk_limit_price): # 判定No2 5 return 0 6 7if (net_bid_price > risk_limit_price): # 判定No3 8 return 0 9 10if (net_profit_price < minimum_profit_price): # 判定No4 11 return 0 12 13if (net_profit_rate < minimum_profit_rate): # 判定No5 14 return 0 15 16return 1 # 停止がない為、裁定取引判定処理を実施

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

投稿2018/05/30 08:42

rtr1950x

総合スコア298

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 08: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 08:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問