作业要求:下述所有代码画图以及分析代码执行流程
1、以定义阶段为准,先画出名称空间的嵌套关系图
2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好
的嵌套图,标明查找顺序,一层一层直到找到位置
=题目一=
input=333
def func():
input=444
func()
print(input) #333
程序代码执行过程中:
1)执行代码 func():
func()的局部名称空间中有一个名字input绑定了444的内存地址
2)执行代码 print(input):
在本层名称空间(全局名称空间)中找到input=333,因此打印333
=题目二=
def func():
print(x)
x=111
func() #111
执行代码 func():
①先在本层func函数的局部变量空间中查找x,发现没有;
②然后往上一层全局名称空间中查找x,找到x=111,因此打印111
=题目三=
x=1
def func():
print(x)
def foo():
x=222
func()
foo() #1
首先在函数的定义阶段,函数func只是在函数foo中进行了调用,而不是定义,因此函数func的局部名称空间和函数foo的局部名称空间是完全平行切互相独立的,不存在‘嵌套’关系,它们的上层名称空间都是全局名称空间。
执行代码foo:
1)执行代码 x=222,将222的内存地址绑定给x;
2)执行代码 func(),
①首先在func的局部名称空间中查找x,而func的局部名称空间中没有x;
②往上一层全局名称空间中查找x,找到x=1,因此打印1。
=题目四=
input=111
def f1():
def f2():
# input=333
print(input)
input=222
f2()
f1() #222
执行代码f1():
①先执行 input = 222,将222的内存地址绑定给input;
②再执行 f2(),需要打印x,首先在函数f2的局部名称空间中查找input,发现没有;
③然后往上一层函数f1的局部名称空间中查找 input,找到input=222,打印222。
=题目五=
x=111
def func():
print(x) #
x=222
func() #UnboundLocalError: local variable 'x' referenced before assignment
执行代码 func():
先执行代码 print(x),需要打印x,先在本层函数func的局部名称空间中寻找x,发现了本层中有为x进行定义,但是给x定义是在打印x之前,因此报错:在局部变量x定义之前进行了引用。
=题目六=
x=111
def foo():
print(x,)
def bar():
print(x)
foo() #111
bar() #111
1)执行代码 foo()
①执行代码 print(x,),在本层函数foo的局部名称空间中寻找x,发现没有;
②往上层全局名称空间中寻找x,找到x=111,打印111。
2)执行代码bar()
过程和1)的内容一样。
=题目七=
x=1
def func2():
func1()
x=2
def func1():
print(x)
x=3
func2() #3
执行代码func2()
①调用函数func1()
②执行代码 pint(x),需要打印x;在本层函数func1()的局部名称空间中寻找x,没有找到;
③往上层全局名称空间中寻找x,找到x=3,输出3。
=题目八=
1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名 login_user=None
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()