1、下述所有代码画图以及分析代码执行流程
# 1、以定义阶段为准,先画出名称空间的嵌套关系图 # 2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好 # 的嵌套图,标明查找顺序,一层一层直到找到位置
# ===================题目一=================== input=333 def func(): input=444 func() print(input)
因为有全局变量input=333,所以print(input)的结果为333
2
# ===================题目二=================== def func(): print(x) x=111 func()
局部命名空间没有x-->到全局命名空间x=111,所以print(x)--->111
3
# ===================题目三=================== x=1 def func(): print(x) def foo(): x=222 func() foo()
foo()函数调用-->将x=222放进foo()的局部命名空间,func()函数调用--> func()局部命名空间没有x-->全局命名空间x=1,所以打印结果为1
4
# ===================题目四=================== input=111 def f1(): def f2(): # input=333 print(input) input=222 f2() f1()
f1()函数调用-->x=222放入f1()局部命名空间-->f2()函数调用,f2()局部命名空间没有找到input,到f1()局部命名空间找,input=222-->打印结果为222
5
# ===================题目五=================== x=111 def func(): print(x) # x=222 func()
在func()调用阶段,执行到print(x),因为在func()内有x=222,所以解释器会认为print(x)打印的是局部名称空间中的x,但是因为x在print之后,所以会报错未定义,就引用
6
# ===================题目六=================== x=111 def foo(): print(x,) def bar(): print(x) foo() bar()
首先调用foo(),foo()函数里没有x的定义-->全局命名空间x=111,打印结果为111;
然后调用bar(),bar()函数里没有x 的定义-->全局命名空间x=111,打印结果为111。
7
# ===================题目七=================== x=1 def func2(): func1() x=2 def func1(): print(x) x=3 func2()
调用 func2()-->调用func1()-->func1()局部命名空间找不到x-->全局命名空间,到调用func1()处上层的全局命名空间找,打印结果为x=3
8
# ===================题目八=================== 1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名 login_user=None
user_name="egon" user_pwd="123" login_user=None def use_auth(inp_name,inp_pwd): if inp_name == user_name and inp_pwd == user_pwd: print("登录成功") global login_user login_user=inp_name use_auth("egon","123") print(login_user)
9
针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能
login_user=None def show_money(): """显示余额""" global login_user if not login_user: login() with open("db.txt", "r", encoding="utf-8") as f1: for line in f1: name, pwd, mon = line.strip(" ").split(":") if login_user in line: print("{}用户账户余额为{}".format(login_user, mon)) # return mon def login(): """用户登录验证""" userame=input("请输入用户名>>").strip() passwd=input("请输入密码>>").strip() with open("db.txt", "r", encoding="utf-8") as f1: for line in f1: name, pwd, money = line.strip(" ").split(":") if username == name and passwd == pwd: print("用户{}登录成功。".format(username)) global login_user login_user=username break else: print("用户名或密码错误。") show_money()