zoukankan      html  css  js  c++  java
  • python学习之名称空间与作用域作业

    作业要求:下述所有代码画图以及分析代码执行流程
    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()
    
  • 相关阅读:
    互联网中的公钥与私钥
    Apache的order、allow、deny
    Linux进程中TIME_OUT解析
    no xxx find in java.library.path
    检测 USB 设备拨插的 C# 类库:USBClassLibrary
    C# 实现的异步 Socket 服务器
    javascript制作公式编辑器,函数编辑器和图形绘制
    浏览器内部工作原理
    10 款基于 jQuery 的切换效果插件推荐
    DIV焦点事件详解 --【focus和tabIndex】​
  • 原文地址:https://www.cnblogs.com/leilijian/p/12526784.html
Copyright © 2011-2022 走看看