day13:名称空间嵌套关系图,编写登录,查询余额功能,用全局变量记录当前登录用户

作业要求:下述所有代码画图以及分析代码执行流程

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()

猜你喜欢

转载自blog.csdn.net/yikenaoguazi/article/details/107470253