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

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

新規登録して質問してみよう
ただいま回答率
85.35%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

6016閲覧

PythonのTypeErrorについて

doigao

総合スコア2

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2020/07/15 04:09

編集2020/07/15 04:17

前提・実現したいこと

20*20の文字のなかから指定された文字を探すプログラムを作っています。
TypeErrorがでてうまくいきません。
まだ途中なのですが、f1はGridの中にその文字があるか、あればその特定の位置からその文字がどちらの方向に進むのか、8方向をチェックしてその方向を示す、x,yの値を返します。
そのため、次の関数f2でx、yの値を引き継ぎたいのですが、以下のエラーが発生しています。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users\test.py", line 47, in <module> f2('BARN',grid) File "C:\Users\test.py", line 36, in f2 x, y = f1(word,row,col,grid) TypeError: cannot unpack non-iterable bool object

該当のソースコード

Pythonここに言語名を入力

1grid = ['DWHISKEYBUNKHOUSETHA', 'NLDAVYCROCKETTEWROSA', 2 'AGUNSLINGERPCRYARWTS', 'HCSTLEPTSRIOONDSAAIK', 3 'DAADDRCHUOUTSIELSNRO', 'EMTLIEOINOSSNSTFTTRK', 4 'RINSATEEFLTGTUAKOEUC', 'INUPGMEWAFPOOLTLODPI', 5 'HEDUBRIREOOPOEESBPTH', 'RSNRSUETSLBYGHERLOAL', 6 'LHISENCTYABGADSLASRL', 'RACCESDKNJUMNSLCCTEI', 7 'IFOGEOSKBNAAUASOKEVB', 'GTWCCHRMDOHNHTCASRLD', 8 'NMPTHOOLAHASEBOLMWOL', 'OFORBAOUCKRRAPUOIAVI', 9 'ORKBOGPNSAERDITITGEW', 'LRELDDASMENRMGSLHORT', 10 'ARHEHRECIFFOTSOPENRD', 'SESUOHLOOHCSLLAHNWOT'] 11 12def f1(word,row,col,grid): 13 dir =[[-1, 0], [1, 0], [1, 1],[1, -1], [-1, -1], [-1, 1],[0, 1], [0, -1]] 14 if word[0] != grid[row][col]: 15 return False 16 for x, y in dir: 17 rd,cd = row +x, col +y 18 flag = True 19 for k in range(1,len(word)): 20 if (0<= rd < len(grid) and 21 0<= cd < len(grid[0]) and 22 word[k] == grid[rd][cd]): 23 rd += x 24 cd += y 25 #print(x,y) 26 else: 27 flag = False 28 break 29 if flag: 30 return x, y 31 return False 32 33def f2(word,grid): 34 row=0 35 col=0 36 x, y = f1(word,row,col,grid) 37 rowEnd = len(grid) 38 calEnd = len(grid[0]) 39 # Consider every point as starting point 40 # and search given word 41 for row in range(rowEnd): 42 for col in range(calEnd): 43 if f1(word,row,col,grid): 44 print("pattern found at " + str(row) + ', ' + str(col)) 45 print(x,y) 46 47f2('BARN',grid)

試したこと

f1の関数はためしたところきちんと作動して、

>>> f1('BARN',14,13,grid) (1, -1)

という形でx, yの値がTupleで返ってきました。
これをf2に引き継ぐためにはどこがいけないかよくわかりらず、このエラーをなくすためにはどこを修正すればよいのかがよくわかりません。どうぞよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Penpen7

2020/07/15 04:11

何行目にエラーが出てますか?
doigao

2020/07/15 04:18

失礼しました。エラーの詳細を添付しなおしました。36行目のx,y =f1をf2の中で指定しているところでエラーがでます。どうぞよろしくお願いいたします。
Penpen7

2020/07/15 04:27 編集

f1のreturn x, yが実行されたときはうまくいきますが、return Falseにしてるとそりゃエラー出ますね。 return Falseじゃなくてreturn None, Noneとかすればいいんじゃないでしょうか。 (意図した通りかわかりませんが)
Penpen7

2020/07/15 04:27 編集

試したことと、f2を実行したときのf1の引数は異なるので結果は違いますよね(rowとcolに0が入っているので)
doigao

2020/07/15 04:30

基本的なことですみません。もともとがReturn True or Falseのコードでしたため、そのままでした。 しかしながらNoneに修正しても同じエラーがでています。
doigao

2020/07/15 04:45

初心者のため、いろいろ整合性が取れていないコードだったようですみません。みなさんの指摘でいろいろ何がいけないのかわかってきたのでそれをもとに修正します。ありがとうございました。
Penpen7

2020/07/15 05:45 編集

解決済みでしょうか?そうでしたら回答者のためにベストアンサーをつけたほうがいいでしょう。
guest

回答2

0

f1はflagの条件によって戻り値の個数と型が変わる実装になっています。
flag: true -> return x, y ; intで二つ
flag: false -> return false ; boolで一つ

エラーの内容はflagがfalseのときf1が返す値はfalse一つだけど、f2の三行目で変数x,yという二つの変数に割り当てようとしてるよという意味です。

一般に、関数の戻り値の型が条件で変わるのはいい実装とは思いません。
flagでfalseの条件のときには(-1,-1)(※f1の内容は読んでないので適当な値です)とか特別な値を型をそろえて返して、受け取り側のf2に処理を任せるほうがいいと思います。

投稿2020/07/15 04:34

編集2020/07/15 04:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

doigao

2020/07/15 04:48

ご丁寧な説明ありがとうございました。 理由はそういうことだったのですね。 もともとはTrue かFalseを返すコードだったのですが、ここででてくるx、yの値を使いたいと思い、修正しようとしていました。 整合性がとれるよう、もういちど検討してみます。 理由がわかったのでよかったです。ありがとうございました。
guest

0

ベストアンサー

下記のように変えてはいかがでしょう。

python3

1def f2(word,grid): 2 row=0 3 col=0 4 #x, y = f1(word,row,col,grid) 不要 5 rowEnd = len(grid) 6 calEnd = len(grid[0]) 7 # Consider every point as starting point 8 # and search given word 9 for row in range(rowEnd): 10 for col in range(calEnd): 11 if f1(word,row,col,grid): 12 x,y = f1(word,row,col,grid) # False出ない場合のみx,yを拾う 13 print("pattern found at " + str(row) + ', ' + str(col)) 14 print(x,y)

投稿2020/07/15 04:27

jeanbiego

総合スコア3966

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

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

jeanbiego

2020/07/15 04:29

あ、すみません。 Penpen7さんが依頼欄の方で対応中だったみたいですね。
Penpen7

2020/07/15 04:32

いえいえ、お気になさらず
doigao

2020/07/15 04:46

ありがとうございました。 確かにTRUEのときだけこの処理をするようにすればうまくうごきました。 ただ、この使い方はあまりよくないのですね。みなさんのコメントをもとに修正してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問