#作业要求:下述所有代码画图以及分析代码执行流程
#1、以定义阶段为准,先画出名称空间的嵌套关系图
#2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好的嵌套图,标明查找顺序,一层一层直到找到位置
#=题目一=
input=333
def func():
input=444
func()
print(input)
input = 333
def func():
input = 444 # 在函数调用时产生局部作用域的名字input
func()
print(input) # 在全局找input,结果为444
程序代码执行过程:
起始位置是全局作用域,所以先查找全局名称空间,找到input=333,故打印333
#=题目二=
def func():
print(x)
x=111
func()
def func():
print(x) #在局部找x
x = 111
func() # 111
程序代码执行过程:
起始位置是局部作用域,先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,找到x = 111,故打印111
#=题目三=
x=1
def func():
print(x)
def foo():
x=222
func()
foo()
x = 1
def func():
print(x)
def foo():
x = 222
func()
foo() # 1
程序代码执行过程:
调用全局函数foo,运行到全局函数func,调用全局函数func,查找局部名称空间,没有找到x,就去全局空间找,找到全局变量x=1,输出1
#=题目四=
input=111
def f1():
def f2():
# input=333
print(input)
input=222
f2()
f1()
def f1():
def f2():
# input=333
print(input)
input = 222
f2()
f1() # 222
程序代码执行过程:
调用全局函数f1,在函数f1中调用局部函数f2,调用print(input)功能,局部函数f2
内无input,到局部函数的外部去寻找,找到函数f1内部的局部变量input=222,输出222
#=题目五=
x=111
def func():
print(x) #
x=222
func()
x = 111
def func():
print(x) #
x = 222
func() # 报错
程序代码执行过程:
调用全局函数func,调用print(x)功能,在局部找不到x,往下运行x = 222,报错,犯逻辑错误,x = 222应在print上方。
全局和内置都找到,所以报错
#=题目六=
x=111
def foo():
print(x,)
def bar():
print(x)
foo()
bar()
x = 111
def foo():
print(x, )
def bar():
print(x)
foo() # 111
bar() # 111
程序代码执行过程:
调用全局函数foo,调用print(x)功能,函数foo中尚未定义x,去全局找,找到x=111,
输出111,调用全局函数bar,函数bar中尚未定义x,去全局找,找到x=111,输出111
#=题目七=
x=1
def func2():
func1()
x=2
def func1():
print(x)
x=3
func2()
x = 1
def func2():
func1()
x = 2
def func1():
print(x)
x = 3
func2() # 3
程序代码执行过程:
调用函数func2,运行到func1,调用func1,运行到print(x),函数func1中局部找不到x,就去全局找,程序是自上往下运行,所以x=1,x=2被覆盖掉了,只剩x=3,最终在全局找到x=3,输出3
#=题目八=
1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名
login_user=None
login_user = None
def login():
while True:
name = input('请输入您的账号:').strip()
pwd = input('请输入您的密码:').strip()
if name == 'alingna' and pwd == '111':
print('登入成功')
global login_user
login_user = name
break
else:
print('账号或密码错误')
login()
print('欢迎%s用户登入!'% login_user)
2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能
'''user.txt=
alingna:111:111111
egon:222:222222
tank:333:333333
login_user = None
'''
def login():
global login_user
dic = {}
while True:
user = input('请输入用户名: ').strip()
pwd = input('请输入密码: ').strip()
with open('user.txt', 'r', encoding='utf-8') as f:
for line in f:
name, password, money = line.strip().split(':')
dic[name] = [password, money]
if user in dic and pwd == dic[user][0]:
print('登录成功')
login_user = user
return True
else:
print('用户名或密码错误')
return False
def get_user_info(login_user):
dic = {}
with open('user.txt', 'r', encoding='utf-8')as f:
for line in f:
name, password, money = line.strip().split(':')
dic[name] = [password, money]
print(f'用户{login_user}的余额为{dic[login_user][1]}元')
def check_money():
global login_user
if login_user == None:
flag = login()
if flag == True:
get_user_info(login_user)
else:
login()
else:
get_user_info(login_user)
check_money()