動作要件:以下は、すべてのコードと解析コードの実行フロー描画
1、定義フェーズの対象、図ネームスペースに示す第1の入れ子関係
を2、及び関数呼び出しを見つけを、関数の実行は、コードを記述するために呼び出しますそれは良い1・イン・ピクチャーを参照して、名前を見つけるために来るとき
、あなたが場所を見つけるまで層によって、層検索順序を示し、ネストされたチャート
=================== ===================トピック
input=333
def func():
input=444
func()
print(input) #333
プログラムコード実行のプロセス:
)(コードfuncを実行します。
1)FUNC()は、ローカル名前空間である名前の入力結合されたメモリ・アドレス444を有しています
コード印刷(入力)を実行します。
印刷SO 2)333、現在の入力層の名前空間(グローバルネームスペース)= 333で見つかっ
===================タイトル2 ===================
def func():
print(x)
x=111
func() #111
)(コードfuncを実行します。
本関数funcのローカル変数空間層において①X最初の外観は全く認められなかっ。
②その後、一つのグローバルネームスペースまで、xを求めるのx = 111見つけ、111ので、印刷します
===================タイトル3 ===================
x=1
def func():
print(x)
def foo():
x=222
func()
foo() #1
最初の関数の定義フェーズの間、むしろ定義より、関数funcの関数fooでコールを除き、従ってローカル名前空間ローカル名前空間と関数foo FUNC関数が切断する互いに平行の完全に独立して、NO「ネストされた」が存在しません関係は、その上側の名前空間はグローバル名前空間です。
コード実行FOO:
1)実行コードX = 222、メモリアドレスxに222バインド。
2)実行コードFUNC()、
①FUNCでのローカル名前空間xの最初のルックスは、およびローカル名前空間内FUNCは、Xされていません。
X = 1見つけ、Xを見つけるために、一つのグローバルネームスペースを②、したがって1を印刷します。
===================タイトル4 ===================
input=111
def f1():
def f2():
# input=333
print(input)
input=222
f2()
f1() #222
)(コードF1を実行します。
①第行う入力= 222、メモリアドレス入力222に結合します。
②その後、F2()、Xを印刷する必要があり、ローカル・ネーム・スペース入力関数f2の最初の外観を行い、我々は何も見つかりませんでした。
③その後、入力のローカル名前空間の参照関数f1アップ層は、= 222、プリント222の入力を見つけます。
===================タイトル5 ===================
x=111
def func():
print(x) #
x=222
func() #UnboundLocalError: local variable 'x' referenced before assignment
)(コードfuncを実行します。
最初の実行コード(X)を印刷し、xは現在層のローカル名前空間FUNC機能でxを求めるために、印刷する必要があり、この層は、定義されたXを約束したが、Xへの印刷は、エラーが報告され、xは前に定義されています。ローカル変数xで参照として前に定義されています。
===================タイトル6 ===================
x=111
def foo():
print(x,)
def bar():
print(x)
foo() #111
bar() #111
1)実行コードのfoo()
この層の関数fooでXを見つけるために、実行コード①(X、)、ローカル名前空間を印刷し、見つかりませんでした。
トップグローバルネームスペースに向けて②、xを求めるのx = 111見つけ、111を印刷します。
コードバーの2)実行()
プロセスと同一の内容1)。
===================タイトル7 ===================
x=1
def func2():
func1()
x=2
def func1():
print(x)
x=3
func2() #3
実行コードの関数func2()
①()関数の関数func1を呼び出します
②実行コードPINT(x)は、印刷する必要がX; Xは、現在のレベルの関数func1の目線()は、ローカル名前空間のが見つかりません。
③X = 3を見つけ、グローバルネームスペース上部Xを見つけるために、出力3。
===================タイトル8 ===================
1、次のグローバル変数レコード電流がログオンしているユーザー、ログイン機能を書いて、ユーザーが正常にログインすると、現在のグローバル変数の割り当ては、ログオンしたユーザー名LOGIN_USER =なし
def log_in():
global login_user
while True:
inp_name = input('请输入你的账号:').strip()
user_info = {}
with open('db.txt','rt',encoding='utf-8') as f:
for line in f:
user_name,pwd = line.strip().split(':')
user_info[user_name] = pwd
if inp_name in user_info:
inp_pwd = input('请输入你的密码:').strip()
if inp_pwd == user_info[inp_name]:
print('登录成功。')
login_user = inp_name
break
else:
print('密码错误,登录失败。')
else:
print('你输入的账号不存在,请重新输入。')
2、関数の前に書かれたクエリのバランスのために、追加のロジックを追加します。ユーザーがログインしていない場合は、機能を実行するためにログインします
def check_balance():
while True:
inp_name = input('请输入你的账号:').strip()
user_balances = {}
with open('user_balance.txt','rt',encoding='utf8') as f:
for line in f:
user_name,balance = line.strip().split(':')
user_balances[user_name] = balance
if inp_name in user_balances:
if inp_name == login_user:
print('用户 {} 的余额为: {} 元。'.format(inp_name,user_balances[inp_name]))
break
else:
print('你还没有登录,请登录后再进行查询。')
log_in()
else:
print('你输入的账号不存在,请重新输入。')
login_user = None
check_balance()