15----我是作业
# 作业要求:下述所有代码画图以及分析代码执行流程
# 1、以定义阶段为准,先画出名称空间的嵌套关系图
# 2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好
# 的嵌套图,标明查找顺序,一层一层直到找到位置
# ===================题目一===================
input = 333 def func(): # 2执行函数体内代码 input = 444 # 3局部变量名称input=444,将444的内存地址绑定给局部变量名称input func() # 1调用函数,回到函数定义函数阶段 print(input) # 4调用print函数,在全局名称空间查找input,通过input找到对应的内存地址
# ===================题目二===================
def func(): # 2执行函数体代码 print(x) # 3在定义函数阶段即局部名称空间中没有找到x,需要去全局名称中查找 # 5调用print函数,通过全局名称x找到对应的内存地址 x=111 # 4 在全局名称空间中找到了x func() # 调用函数,回到定义函数阶段


# ===================题目三===================
x=1 # 7在全局名称空间找到x def func(): # 5执行func函数体代码 print(x) # 6调用print函数,当前位置没有找到x,从当前位置一层一层查找x # 8 将x传值给print函数,通过全局变量名称x找到对应的内存地址 def foo(): # 2执行foo函数体代码 x=222 # 3 foo函数局部名称空间中x=222 func() # 4调用func函数,回到定义func函数阶段 foo() # 1调用foo函数,回到定义foo函数阶段


# ===================题目四===================
input=111 def f1(): # 2执行f1函数体内的代码 def f2(): # 5执行f2函数体内的代码 input=333 # f2局部名称空间中input=333 print(input) # 调用print函数,在当前位置查找x,找到f2局部名称空间中存在x,通过x找到对应的内存地址 input=222 # 3 f1局部名称空间中input=222 f2() # 4调用f2函数,回到定义f2函数的阶段 f1() # 1调用f1函数,回到定义f1函数的阶段
input=111 def f1(): # 2执行f1函数体内的代码 def f2(): # 5执行f2函数体内的代码 # input=333 print(input) # 6调用print函数,在当前位置查找x,没有找到,去f1局部名称空间查找 # 8 将x传给print函数,通过x找到对应的内存地址 input=222 # 3 f1局部名称空间中input=222 # 7 在f1局部名称空间中找到x f2() # 4调用f2函数,回到定义f2函数的阶段 f1() # 1调用f1函数,回到定义f1函数的阶段



# ===================题目五===================
x=111 def func(): print(x) # 以函数定义阶段为准, # 定义阶段已经产生了局部变量x,只是这个局部变量是在定义前被调用。名称空间嵌套是在检测语法时被确定的 x = 222 func()
# ===================题目六===================
x=111 #4在全局空间中找到x #9在全局空间中找到x def foo(): # 2执行foo函数体内的代码 print(x,) # 3调用print函数,从当前位置寻找x,未找到,去全局名称空间找x # 5将x传值给print函数,通过x找到对应的内存地址 def bar(): #7执行bar函数体内的代码 print(x)# 8调用print函数,从当前位置寻找x,未找到,去全局名称空间找x # 10将x传值给print函数,通过x找到对应的内存地址 foo() #1调用foo函数,回到foo函数定义阶段 bar() # 6调用bar函数,回到bar函数定义阶段
# ===================题目七===================
x=1 # 6 全局名称空间中x=1,x与1的内存地址绑定 def func2(): # 2执行func2函数体内的代码 func1() # 3调用func1函数,回到函数定义阶段 x=2 # 7 将x与1的内存地址之间的绑定关系解除,与2的内存地址绑定 def func1(): # 4执行func1体内的代码 print(x) # 5调用print函数,从当前位置开始找x,没找到需要去全局名称空间查找 # 9将在全局名称空间中找到的x传给print函数,通过x找到对应的内存地址 x=3 # 8 将x与2的内存地址之间的绑定关系解除,与3的内存地址绑定 func2() # 1调用函数func2,回到定义函数阶段
# ===================题目八===================
1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名
login_user=None
2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能
login_user = None log_dic = {'login':None} def login(user): dic = {} with open('info', 'r', encoding='utf-8') as f: for line in f: name, pwd = line.strip().split(':') dic[name] = pwd while True: # user = input('your name:') if user not in dic: # print('用户名不存在') return '用户名不存在' else: while True: password = input('请输入密码:') if password == dic[user]: global login_user login_user = user log_dic['login'] = user return f'{login_user}登录成功' else: print('请重新输入密码') continue # 2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能 def query(user): dic = {} with open('query','r',encoding='utf-8') as f: for line in f: name,money = line.strip().split(':') dic[name] = money # 判断用户是否已经登陆 if not log_dic.get(user): print('请先登录') login(user) return f'{user}同学,您的余额为{dic[user]}' username = input('your name:') res1 = query(username) print(res1)