0

Pythonでプログラミングを始めたばかりで、xが定義されていませんが、定義されていると考えると、なぜxが定義されていると言っているのかわかりません。

def menu():
    x = 0
    while x != 1 or 2:
        print "menu"
        print "1)login"
        print "2)under dev"
        x = raw_input('select menu option')
        if x == 1 or 2:
            break
menu()
if x=='1':
    print "enter username:"
y = raw_input()
if y=="username":
    print "enter password:"
z = raw_input()
if z=="password":
    print "password accepted"
elif x=='2':
    print "under development"
elif y or z == False:
    print "username or password incorrect"
4

4 に答える 4

6

xは関数内のローカル変数であり、 のmenu()外には存在しませんmenu()

それを返してから、値をコードmenu()の new に保存できます。x

def menu():
    x = None
    while x not in ('1', '2'):
        print "menu"
        print "1)login"
        print "2)under dev"
        x = raw_input('select menu option')
    return x

x = menu()

コードのいくつかの問題も修正したことに注意してくださいmenu()

  • raw_input()文字列を返しますが、x代わりに整数 1 または 2 かどうかをテストします。代わりに文字列'1'をテストするようにコードを変更しました。'2'

  • を使用しないでください。それは、あなたが思っている意味x != 1 or 2ではありません。が True かどうかをテストx != 1し、そうでない場合2は True かどうかをテストします。ブール値のコンテキストでは、ゼロ以外のすべての数値が True と見なされるため2です True

    x not in ('1', '2')私はそれをテストに置き換えました。

  • xループ内で再度テストしてbreak;を実行する必要はありません。ループはそのテストなしで自然に終了しwhileます。

  • またはでない限り、の開始時に何xが設定されているかは問題ではありません。「空」であることを知らせるのに適しています。menu()'1''2'None

于 2013-03-17T14:38:30.270 に答える
0

変数xmenu関数で定義されています。これはローカル変数であり、関数の本体からのみアクセスできます。この回答には、Python スコープ ルールの適切な説明があります。

于 2013-03-17T14:37:55.440 に答える
0

グローバル変数とローカル変数の使用についてまだ混乱している場合は、この Web サイトを参照してください。

于 2013-03-17T15:27:25.927 に答える
0

あなたの問題は、ここ(および以下)
に記載されているPythonのスコープによるものです: LEGBルール。

  • ローカル
    関数内で何らかの方法で割り当てられ、その関数でグローバルに宣言されていない名前。
  • 関数ローカルを囲みます
    すべての囲んでいる関数 (defまたはlambda) のローカル スコープ内の名前 (内部から外部への形式)。
  • グローバル(モジュール)。
    モジュール ファイルの最上位で割り当てられた名前、またはファイル内の定義でグローバルに宣言された名前。
  • 組み込み(Python)。
    組み込みの名前モジュールで事前に割り当てられた名前:open, range, SyntaxErrorなど

したがって、x変数は にローカルな変数ですmain()。したがって、ローカル スコープから変数を取得するには、グローバル変数もローカルスコープに取得できます。

あなたのコードには、さまざまな論理エラー (およびいくつかNameErrorの s) があるようです。私は理解しようとし、あなたのコードを動作するものに変更/改良しました。

def menu():
    global x
    while x not in ('1','2'): # 1
        print "   Menu"
        print "1) Login"
        print "2) Under dev"
        x = raw_input('Select menu option: ') # 2
        if x in ('1','2'): # 1
            break
x = ''
menu()
# 3
if x == '1':
    y = raw_input("enter username: ") # 2
    z = raw_input("enter password: ") # 2
    if y != 'username' or z != 'password': # 4
        print "username or password incorrect"
    else: # 5
        print 'You will be logged in'
elif x == '2':
    print "Under development"

文法的な変更以外に、論理的な部分の変更を見てみましょう。

  1. raw_input文字列を返します。1したがって、 or 2(整数)になることはありません。
    また、Python ではと同等であり、常に値を持つため、x != 1 or 2に評価されます。True(x != 1) or (2)2True
  2. raw_input入力を取得する前に表示される引数としてプロンプトを受け取ります
  3. 簡単に言えば、if と elif の構造が正しくありません。
  4. y or z == False(y) or (z = False)は文字列であるため、 Andzは決して評価されませんFalse。ではない
    場合、これは True と評価されますが、それはあなたが望むものとは異なります (そう思われます)。y''
  5. のコードはelse、if (およびすべての elif) 条件が の場合に実行されますFalse
    ここでは、開発中のメッセージを示します。

もっと来る

于 2013-03-17T15:35:12.630 に答える