作业要求:下述所有代码画图以及分析代码执行流程
1、以定义阶段为准,先画出名称空间的嵌套关系图
2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好的嵌套图,标明查找顺序,一层一层直到找到位置
#===================题目一===================
input=333
def func():
input=444
func()
print(input) # 333
执行过程:
1.调用全局函数func,运行函数内代码input=444
2.运行全局函数print(input),在全局空间找到input=333,输出333
# # ===================题目二===================
def func():
print(x) # 111
x=111
func()
执行过程:
1.调用全局函数func,执行函数内代码print(x)
2.先在函数func的局部空间找,没找到,去全局空间找,找到x = 111,输出111
# # ===================题目三===================
x=1
def func():
print(x) # 1
def foo():
x=222
func()
foo()
过程:
1.调用全局函数foo,运行函数体代码x=222,调用全局函数func
2.执行函数体代码print(x),在函数func局部名称空间中没有找到
3.在全局中找到x=1,输出1
# # ===================题目四===================
input=111
def f1():
def f2():
# input=333
print(input) # 222
input=222
f2()
f1()
过程:
1.调用全局函数f1,执行函数体代码,调用局部函数f2
2.执行函数体代码,print(input),在局部函数f2中没有找到,到上一层级找
3.在局部函数f1中找到input=222,输出222
# # ===================题目五===================
# x=111
# def func():
# print(x) # 报错
# x=222
#
# func()
过程:
1.调用全局函数func,执行函数体代码print(x),在函数func中找到x=222,因此不会去全局找
2.但是x = 222在调用x之后,应该先定义,再调用,顺序不对,因此报错
# # ===================题目六===================
# x=111
#
# def foo():
# print(x,) # 111
#
# def bar():
# print(x) # 111
#
# foo()
# bar()
过程:
1.调用全局函数foo,全局函数bar,执行函数体代码print(x)
2.在局部空间没有找到x,去全局找,找到x=111,输出111,111
# # ===================题目七===================
x=1
def func2():
func1()
x=2
def func1():
print(x) # 3
x=3
func2()
过程:
1.调用函数func2,执行函数体代码func1,调用函数func1,执行print(x)
2.在函数的定义阶段,全局变量x=1,x=2,x=3,依次检测,x被的值被修改覆盖,最后为x=3
3.print(x)在全局空间找到x=3,输出3
# ===================题目八===================
1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名
# login_user=None
login_user=None
def login():
global login_user
while True:
user=input('请输入用户名: ').strip()
pwd=input('请输入密码: ').strip()
with open('user.txt','r',encoding='utf-8')as f:
for line in f:
name,password=line.strip().split(':')
if user == name and pwd == password:
print('登录成功')
login_user=user
break
else:
print('用户名或密码错误')
login()
2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能
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()