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

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

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

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

Q&A

解決済

3回答

768閲覧

while文のエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/07/10 05:02

編集2017/07/10 06:14

while文で配列の値の条件分岐ができなくてエラーが起きました。

def A(引数): ・ ・ return array def B(引数): ・ ・ return array def C(引数): ・ ・ return array def D(引数): ・ ・ return array def X(引数): aa =A(引数) bb =B(引数) cc =C(引数) dd =D(引数) del 配列を削除 while len(array) !=0: X() print(bb[0])

というコードを書いて実行したらwhile文が3回(3回がwhileが回るトータル)
回る途中時にXメソッドの中のBメソッドでlen(array) が0なのでエラーが起き、while文でもエラーが起きました。
Xメソッドで定義している通り、A~Dのメソッドはセットで実行したいです。しかし、3回目まで回った時にメソッドBを実行した後にwhile文を抜け一番下のprint文でメソッドBの結果の配列を出力する方法がわかりません。
cc =C(引数)からlen(array) ==0 の条件を満たしてしまうので。

count=0

とwhile文の外に置いておいてwhile文が何回回ったかを計測して3回目だけ処理を変えるという方法はあると思うのですが、このアルゴリズムをいろいろな配列に対応させたいのでその方法はないとします。
どのようにやりたいことを書けますか?

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

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

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

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

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

can110

2017/07/10 05:08

第三者が再現可能なコードを提示ください。
mattn

2017/07/10 05:12

過去に質問された内容から判断させて頂くと、この文法は理解できるはずと推測致します。何度も言いますがまず基本構文を学ばれた方が良いと思います。答えを貰ってご自分の知識として習得できていないのなら、質問者も回答者も無駄な時間を過ごす事になります。
can110

2017/07/10 06:18

NameError: name 'array' is not defined で実行できません。実行できるようコード修正ください。
guest

回答3

0

ベストアンサー

本当にコードは合っていますか?

python

1while len(array) != 0: 2 X() 3print(array[0])

arrayの長さがゼロにならないとwhileを抜けないのに、次の行でprint(array[0])って矛盾していませんか?
array(グローバル変数?)の長さを変えている場所も見当たりませんし。

X番目に処理を変えたいのであればwhileではなくfor i, x in enumerate(array)のようにenumrateを使った方が良いと思います。


コメントを受けてソースを変えました。
そもそもwhileで配列を削除(list.pop(-1)を使う?)していくコードはバグが入りやすく、理解もしにくいと思います。
このような処理ならforを使うのが順当かと思います。

python

1def X(引数): 2 aa =A(引数) 3 bb =B(引数) 4 if len(bb) != 0: 5 print(bb) 6 cc =C(引数) 7 dd =D(引数) 8 9for a in array: 10 X(a)

bbの長さがゼロならprintしたいという事ですが、こういう事でしょうか・・・?

投稿2017/07/10 05:14

編集2017/07/10 06:27
pashango2

総合スコア930

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

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

退会済みユーザー

退会済みユーザー

2017/07/10 06:20

ありがとうございます。情報を修正・追加しました。 bb =B(引数)で空の配列が取得できるので、bbのlenが0かどうか判定し該当するので print文を呼び出したいです。なのでenumrateを使ってX番目に処理を変えたいわけではないです。もし何かお分かりでしたらお願いします。
pashango2

2017/07/10 06:32

一応コメントは書きましたが、もっと大きなくくりでrrrrrrrrさんが大きな勘違いをしているような・・・ 客観的に見て、提示されたコードは何がしたいのか分かりません、おそらく一般的な解決方法はもっと別な形になるような気がします。
guest

0

A関数実行後に条件文書いてreturnすればいいのでは。

return を使うと、式リスト (または None) を戻り値として、現在の関数呼び出しから抜け出します。

7. 単純文 (simple statement) — Python 3.6.1 ドキュメント

質問が変更になったので追記

Bメソッドでlen(array) が0なのでエラー

↑これと↓には矛盾がありますよね。

メソッドBを実行した後にwhile文を抜け一番下のprint文でメソッドBの結果の配列を出力

そうしたいなら、len(array) が0の時にエラーになるB関数の仕様が間違っているかと思います。

投稿2017/07/10 06:00

編集2017/07/10 06:24
Lhankor_Mhy

総合スコア36074

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

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

0

今頭が回っていないので、わかりませんが、

私なら

C++とかなら bool にあたるもの ( C言語だと存在しないので int で代用とか ) を返して、

この戻り値が true ( true相当の値 ) のとき、次のメソッド実行っていう感じにしてはどうでしょうか?

私はC/C++でやっているので C++風に書くと

C++

1if( funcA() ){ 2 if( funcB() ){ 3 if( funcC() ){ 4 return true; 5 } 6 } 7}else{ 8 return false; 9}

みたいにするとか。

それか、

Pythonはやってないので適当ですが、

Python

1def func( 本来の引数, 直前のメソッドの値 ): 2 if 直前のメソッドの値 == true: 3 # 実行 4 return true 5 else: 6 return false

みたいに

直前のメソッドを受け取って その値が true とかみたいに "成功" を示すものであれば実行, そうじゃなければ falseを返すとか。

で、メソッドに渡す前に if文でチェック。
false状態なら 質問でいう Xメソッド が return する。

次に3回だけ行うとか、3回目のとき...とかなら、

私なら 別の変数 counter とかみたいなものを用意して、

ループするたびに インクリメント ( C++ とかだと counter++; で、VB系だと counter = counter + 1 ってやつ。 )して、

これが 3回目のときにbreak に相当するものでループを抜けるとか。

そうすれば 配列の型に関係なくできると思います。


他の方から「上記の方法はレガシーコードだ」と指摘を受けました。

その方からは「例外処理」を提示されました。
確かに例外処理もあります。

なので、

メソッドA の内部で処理するときに 指定の処理が失敗したら例外を投げる。
メソッドB でも同様。
メソッドC も...

という風にしておきます。

Pythonはよくわからないので調べてみると、
throw ではなく raise らしいですね。

なので、

Python

1def methodA(): 2 # なんらかの処理 3 # ここで処理失敗したとする 4 raise Exception( "methodA失敗" ) 5 6def methodB(): 7 # なんらかの処理 8 # ここで処理失敗したとする 9 raise Exception( "methodB失敗" ) 10 11def methodC(): 12 # なんらかの処理 13 # ここで処理失敗したとする 14 raise Exception( "methodC失敗" ) 15

としておけば、

Python

1def methodX(): 2 try: 3 methodA() 4 methodB() 5 methodC() 6 except Exception, e: 7 print e.value

みたいにできます。

で、もしmethodAで失敗すれば 例外が投げられるので methodB以降は処理しない状態です。

なので、用件にあっているかと。

例外を投げる

投稿2017/07/10 05:25

編集2017/07/10 06:33
BeatStar

総合スコア4958

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

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

LouiS0616

2017/07/10 06:12

これはバッドコードじゃないでしょうか? 関数の成功/失敗を返り値のboolで返すのはいわゆるレガシーコードかと思います。 C++にもPythonにも例外処理があります。 また、戻り値を順に判定するような処理を書くにしても、ネストではなく return funcA() && funcB() && funcC(); で充分なのでは?
BeatStar

2017/07/10 06:20

LouiS0616さん あー、そういえば例外処理がありましたね。 編集しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問