0

プロトコル名をキーとして含み、それらのプロトコルのテキスト記述を値として含む、DB と呼ばれる辞書を中心とするプログラムを作成します。グローバル変数はありません。

mainには、ユーザーに「プロトコル」を入力するように問い合わせるループがあります</p>

• TF を呼び出して、プロトコル (キー) が DB に存在するかどうかを確認します。TF は T または F を返します。

• T の場合、main は値を出力して続行する PT を呼び出します。

• F の場合、main は ADD を呼び出します。ADD は値の入力を求め、KV ペアを DB に追加します。

ユーザーが「end」を入力するまでループし、DB を出力します

これは私がこれまでに持っているものです:

#!/usr/bin/python3

#contains protocol names as keys, and text descriptions of protocols as values
DB= {'ICMP': 'internet control message protocol', 'RIP':'RIP Description',
     'ipv4':'Internet protocol v4', 'ipv6':'IP version 6'}

def TF(x):
    return x in DB

def PT(x):
    print("The protocol you entered is: " , x)
    return x

def ADD(x):
    usr_input = input("Please enter a value to be added to the DB: ")
    description = input("Please enter description for the key: ")
    DB[usr_input] = description


for i in DB:
    user_input = input("Please enter the protocol: ")
    if (user_input == "end"):
        break
    TF(user_input)
    if (TF(user_input) == True):
        PT(user_input)
    else:
        ADD(user_input)

ユーザー入力のプロンプトが表示されますが、プロンプトで「ICMP」と入力するなどの操作を行うと、同じ回答が出力され、Control + D を押すまで無限にループし続けます。ここで何が間違っていますか?辞書にないキーを入力しても同じです。助けてください。ありがとう。

編集: 無限ループの問題を修正し、PT(x) が呼び出されていることを示すように編集しました。また、DB にキー値が存在しない場合に ADD(x) が呼び出されるように問題が修正されました。

永続的な問題: たとえば、入力として「ICMP」を入力しても、キー自体のみが返され、キーに関連付けられた値は返されませんか? 値を表示するにはどうすればよいですか?

次に、ユーザー入力がまだ存在しない場合に ADD(x) が呼び出されるようになりましたが、DB 辞書に追加して出力することはありません。代わりに、次のようになります。

Please enter the protocol: ICMP
The protocol you entered is:  ICMP
Please enter the protocol: icmp
Please enter a value to be added to the DB: here here
Please enter description for the key: herererere
Traceback (most recent call last):
  File "D:/Sheridan/Part Time/Linux Architecture w. Network Scripting/Week 8 Code/practise_in_class.py", line 24, in <module>
    for i in DB:
RuntimeError: dictionary changed size during iteration
4

2 に答える 2

2

まず、 を使用してinputいます。これは基本的にユーザー入力を評価しています。それでは、例を示しましょう。

>>> input("?")
?>? 1 + 1
2

raw_input代わりに使用してください。ただし、Python3 を使用している場合は、そのまま使用してinputください。

あなたの問題は にありますTF。基本的に、空の文字列が空であるかどうかをチェックしているため、入力が次のようなものであってもifステートメントが評価されるため、任意の種類の入力 (空ではない) については、単に値が出力されます。 . より良いアプローチは、次のようなものです。Truehello world

if user_input in DB

user_inputこれにより、がデータベース ディクショナリのキーに含まれているかどうかがチェックされます。

第三に、これを書くとき、辞書のキーペアをループしていますfor i in DB:。そもそもなんでこんなことしてんの?in上記のように、キーワードを使用して辞書内のキーを検索するだけです。したがって、機能するプログラムは次のようになります。

DB = {'ICMP': 'internet control message protocol', 'RIP': 'RIP Description',
      'ipv4': 'Internet protocol v4', 'ipv6': 'IP version 6'}


if __name__ == '__main__':
    # Running loop
    while True:
        # Taking user input
        user_input = raw_input("Please enter a protocol, press Q to quit")

        # If the input is Q, then we break the loop
        if user_input == 'Q':
            break

        # If the value of user_input is inside DB, then we print it
        if user_input in DB:
            print DB[user_input]
        # Else, we ask the user to add a description, and add it to our dictionary
        else:
            user_value = raw_input("Please enter a value for your new protocol")
            # Adding to dictionary using the update method
            DB.update({user_input: user_value})
于 2013-11-01T11:08:17.413 に答える