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)

 






posted @ 2020-03-19 19:58  微信搜索-程序媛小庄  阅读(143)  评论(0)    收藏  举报