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

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

新規登録して質問してみよう
ただいま回答率
85.47%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Q&A

解決済

3回答

864閲覧

argument of type 'type' is not iterable

julvan

総合スコア11

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

0グッド

0クリップ

投稿2019/07/14 06:46

編集2019/07/14 06:57

知識がとても乏しい初心者です。
Pythonで電話帳プログラムを作りたかったのですが、

from

1import pickle 2import re 3phone = dict 4def main(): 5 while True: 6 番号 = int(input(''' 7 番号を入力してください。 8 1:電話番号を検索 9 2:電話番号を登録 10 3:電話番号を削除 11 4:電話番号を一覧 12 0:プログラムの終了 13 -> ''')) 14 if 番号 not in range(5): 15 print('コマンド番号を入力してください') 16 continue 17 ☆☆else: 18 [終了,検索,登録,削除,一覧][番号](phone) 19def 終了(phone):…

と、続くのですが、☆☆マークのところのelse: [終了,検索…]のところでType Error: argument of type 'type' is not iterable とエラーが出ます。
また、途中の

def

1 name = input('検索する名前を入力してください:') 2 ☆☆if name in phone: 3 print('名前:{0} 電話番号:{1}'.format(name, phone[name])) 4 else: 5 print('{}は登録されていません'.format(name))……(中略) 6……if __name__ == '__main__': 7 ☆☆main()

の2つの☆☆のところでまた同じエラーが出ます。
どのように対処すれば正常に動作するでしょうか? 教えていただけたら幸いです。
また、他に誤ったところがあればご指摘お願いいたします。

全文はコチラです。

from

1import pickle 2import re 3phone = dict 4def main(): 5 while True: 6 番号 = int(input(''' 7 番号を入力してください。 8 1:電話番号を検索 9 2:電話番号を登録 10 3:電話番号を削除 11 4:電話番号を一覧 12 0:プログラムの終了 13 -> ''')) 14 if 番号 not in range(5): 15 print('コマンド番号を入力してください') 16 continue 17 else: 18 [終了,検索,登録,削除,一覧][番号](phone) 19def 終了(phone): 20 print('プログラムを終了します。') 21 exit() 22 # 電話帳をpickleへ書き出し 23 with open('phone.pkl', 'wb') as f: 24 pickle.dump(phone, f) 25 quit() 26def 検索(phone): 27 name = input('検索する名前を入力してください:') 28 if name in phone: 29 print('名前:{0} 電話番号:{1}'.format(name, phone[name])) 30 else: 31 print('{}は登録されていません'.format(name)) 32def 登録(phone): 33 name = input('登録する名前を入力してください:') 34 if name in phone: 35 print('名前:{0} は登録済みです'.format(name)) 36 return 37 num = input('登録する電話番号を入力してください:') 38 if not re.match(r'^[\d-]+$', num): 39 print('{0}は電話番号として不適切です'.format(num)) 40 return 41 phone[name] = num 42 print('名前:{0} 電話番号:{1}で登録しました'.format(name,num)) 43def 削除(phone): 44 name = input('削除する名前を入力してください:') 45 if name in phone: 46 del phone[name] 47 print('名前:{0}の電話番号は削除されました'.format(name)) 48 else: 49 print('名前:{0}は登録されていません'.format(name)) 50def 一覧(phone): 51 for k, v in phone.items(): 52 print('名前:{0} 電話番号:{1}'.format(k, v)) 53 54if __name__ == '__main__': 55 main()

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

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

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

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

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

guest

回答3

0

関数名を日本語にしない等 書き換えてみました。

python3

1import pickle 2import re 3 4PROMPT_MESSAGE = ''' 5番号を入力してください。 6 1: 電話番号を検索 7 2: 電話番号を登録 8 3: 電話番号を削除 9 4: 電話番号を一覧 10 0: プログラムの終了 11-> ''' 12 13def exit_task(phones): 14 print('プログラムを終了します。') 15 # save_phone(phones) 16 return False # exit while loop 17 18def save_phone(phones): 19 # TODO 20 return 21 22def load_phone(phones): 23 # TODO 24 return 25 26def search_phone(phones): 27 name = input('検索する名前を入力してください:').strip() 28 if phones.get(name): 29 print('名前:{0} 電話番号:{1}'.format(name, phones[name])) 30 else: 31 print(' ERR:"{}"は登録されていません'.format(name)) 32 33def add_phone(phones): 34 name = input('登録する名前を入力してください:') 35 if phones.get(name): 36 print(' ERR:"名前":{0}は登録済みです'.format(name)) 37 return 38 tel = input('登録する電話番号を入力してください:').strip() 39 if not re.match(r'^[\d-]+$', tel): 40 print(' ERR:"{0}"は電話番号として不適切です'.format(tel)) 41 return 42 43 phones[name] = tel 44 print('名前:{0} 電話番号:{1}で登録しました'.format(name, tel)) 45 46def del_phone(phones): 47 name = input('削除する名前を入力してください:').strip() 48 if phones.get(name): 49 del phones[name] 50 print('名前:{0}の電話番号は削除されました'.format(name)) 51 else: 52 print(' ERR:名前:{0}は登録されていません'.format(name)) 53 54def list_phone(phones): 55 for k, v in phones.items(): 56 print('名前:{0} 電話番号:{1}'.format(k, v)) 57 58TASKS = { 59 '0': exit_task, 60 '1': search_phone, 61 '2': add_phone, 62 '3': del_phone, 63 '4': list_phone 64} 65 66def main(): 67 phons = {} 68 # load_phone(phones) 69 while True: 70 task = TASKS.get(input(PROMPT_MESSAGE).strip()) 71 if task == None: 72 print(' ERR:コマンド番号を入力してください') 73 continue 74 if task(phons) == False: 75 break 76 77if __name__ == '__main__': 78 main()

投稿2019/07/14 23:04

katoy

総合スコア22324

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

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

0

ベストアンサー

phone = dictphone = dict() と修正すれば直りそうです。

エラーの再現

Python

1>>> d = dict 2>>> print(d) 3<class 'dict'> 4>>> 5>>> for k in d: 6... pass 7... 8Traceback (most recent call last): 9 File "<stdin>", line 1, in <module> 10TypeError: 'type' object is not iterable

Python

1>>> d = dict() 2>>> print(d) 3{} 4>>> 5>>> for k in d: 6... pass 7... 8>>>

投稿2019/07/14 07:01

LouiS0616

総合スコア35660

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

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

0

お疲れ様です。
前の方が回答されているように、()をつけると治る気がします。

蛇足ですが、
関数名とか変数名は、asciiが、無難な気がしました。

投稿2019/07/14 07:22

0kcal

総合スコア275

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問