作业

一:复习巩固题
1、以下格式自行推导至少10遍
def index(x,y):
print(x,y)

def wrapper(*args,**kwargs): # args=(1,2) kwargs={"a":1,"b":2}
    index(*args,**kwargs) # index(1,2,a=1,b=2)
    # index(*(1,2),**{"a":1,"b":2}) # index(1,2,a=1,b=2)

wrapper(1,2,a=1,b=2)

2、练习把参数包给函数10遍
步骤一:准备好一个函数,该函数体代码需要一个参数
def func():
print(x)

步骤二:包值
x = 2
def func():
print(x)

步骤三:闭到outter函数内
def outter():
x = 2
def func():
print(x)
步骤四:基于return将内部func返回到全局
def outter():
x = 2
def func():
print(x)
return func # 一定不要加括号

f=outer()

步骤五:最终格式,把outter写活
def outter(x):
# x = 2 # 注释掉
def func():
print(x)
return func

f1=outer(1) # 把x=1包给函数func
f2=outer(2) # 把x=2包给函数func
f3=outer(3) # 把x=3包给函数func

二:作业要求:下述所有代码画出名称空间嵌套图以及分析代码执行流程

1、以定义阶段为准,先画出名称空间的嵌套关系图

2、然后找到调用函数的位置,写出函数调用时代码的执行过程,涉及到名字的查找时,参照1中画好

的嵌套图,标明查找顺序,一层一层直到找到位置

=题目一=

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

func()
print(input)

image-20200617191316882

解释:

先从1的局部作用域,开始找,如果没有在2全找,没有去3置作用域找,没有找到报错,如果那一步找到就把变量给局部作用域

=题目二=

def func():
print(x)
x=111

func()

image-20200617192109753

func的作用域没有,就去全局作业域找,全局作用域有变量给func局部作用域

=题目三=

x=1
def func():
print(x)

def foo():
x=222
func()

foo()

image-20200617192903153

解释器执行代码,定义x=1放到全局空间,检查func定义是否正确,并不知里面代码是否正确,检查foo定义是否正确,并不会检查内部代码。foo执行时,会解释foo代码是否正确,并运行,还定义了一个局部x=222,调用func,func是定义在全局空间,解释器解释并执行代码,发现内部没有变量,就会去全局找,找到后运行,结束后,foo函数也结束了

=题目四=

input=111
def f1():
def f2():

​ # input=333

​ print(input)
​ input=222

​ f2()

f1()

image-20200617194050686

如果input = 333没有注释会报错,当解释器在运行代码时,函数体代码并不会执行,只会看这个函数定义是否正常,执行的时候就会解释并执行代码。内部想打印input,但是x是在print下方才被定义,还有一个原因解释器是由上到下解释并执行代码的。所以会报错
注释后:结果是222,原因是在解释器解释执行代码的时候input=111,被创建了,f3只是检查了定义是否正常,inpput=222覆盖了input=111,所以调用f2的时候,函数会在内部找变量,如果没有再在f1局部找,找到了x=222

=题目五=

x=111
def func():
print(x) #
x=222

func()

image-20200617194550047

print(x)注释了。在解释器解释运行时定义了一个变量x=111,检查func的定义是否正确,并不会检查内部代码是否错误,运行func时解释器回去本地找,如果没有注释。在解释器解释运行时定义了一个变量x=111,检查func的定义是否正确,并不会检查内部代码是否错误。运行func时函数会内部查找,但是解释器是由上到下执行解释并执行的时候,x并灭有定义,所以运行func会报错。

=题目六=

x=111

def foo():
print(x,)

def bar():
print(x)

foo()
bar()

image-20200617195559726

解释

解释器解释代码并执行,首先定了一个x=111全局,检查了两个函数定义是否正确,运行时才解释内部代码是否正确,并执行,调用foo,foo,会在内部找,内部没有去全局找,这就找到了,调用bar时也是去内部找,没有在全局找到了。

=题目七=

x=1
def func2():
func1()

x=2
def func1():
print(x)

x=3

func2()

image-20200617200522978

解释器在解释此代码,首先全局中定义了x=1,检查func2函数只会检查定义是否正确,但是里面是否有错误不知,接着定义全局变量x=2覆盖了x=1,接着又定义了func1,但是只会检查定义是否正确,里面是否有错误不知,接着有定义全局变量x=3,覆盖了x=2,调用func2后,又去调用了func1但是内部没有变量所以去全局找到了x=3,结束,func2结束。

=题目八=

1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名
login_user=None

login_user = None


def login():
    global login_user
    name = input('请输入你的姓名:')
    pwd = input('请输入你的姓名:')
    with open(r'db.txt', encoding='utf-8', mode='rt') as f:
        for line in f:
            r_name, r_pwd = line.strip().split(":")
            if r_name == name and r_pwd == pwd:
                print('登录成功!')
                login_user = name
                return
        else:
            print('密码或者用户错误')


if login_user is None:
    print("你不在线,请登录")
    login()
else:
    print('你已经在线,请你操作其他功能')

2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能

def login():
    global login_user
    name = input('请输入你的姓名:')
    pwd = input('请输入你的密码:')
    with open(r'db.txt', encoding='utf-8', mode='rt') as f:
        for line in f:
            r_name, r_pwd,_ = line.strip().split(":")
            if r_name == name and r_pwd == pwd:
                print('登录成功!')
                login_user = name
                return
        else:
            print('密码或者用户错误')

def query(name):
    with open(r'db.txt',encoding='utf-8',mode='r') as f:
        for line in f:
            r_name,_,money = line.strip().split(':')
            if name == r_name:
                print('你的现金为:{}'.format(money))

if login_user is None:
    print("你不在线,请登录")
    login()
    query(login_user)
else:
    print('你已经在线,请你操作其他功能')
    login_user

posted @ 2020-06-17 22:50  为了等  阅读(119)  评论(0编辑  收藏  举报