python学习之名称空间和作用域

作业要求:下述所有代码画图以及分析代码执行流程
1、以定义阶段为准,先画出名称空间的嵌套关系图
2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好
的嵌套图,标明查找顺序,一层一层直到找到位置

===================题目一===================

input=333
def func():
    input=444
func()
print(input)   #333

程序代码执行过程中:

执行代码 func():

1)func()的局部名称空间中有一个名字input绑定了444的内存地址

执行代码 print(input):

2)在本层名称空间(全局名称空间)中找到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()

猜你喜欢

转载自www.cnblogs.com/leilijian/p/12526784.html