作业
一:复习巩固题
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)
解释:
先从1的局部作用域,开始找,如果没有在2全找,没有去3置作用域找,没有找到报错,如果那一步找到就把变量给局部作用域
=题目二=
def func():
print(x)
x=111
func()
func的作用域没有,就去全局作业域找,全局作用域有变量给func局部作用域
=题目三=
x=1
def func():
print(x)
def foo():
x=222
func()
foo()
解释器执行代码,定义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()
如果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()
print(x)注释了。在解释器解释运行时定义了一个变量x=111,检查func的定义是否正确,并不会检查内部代码是否错误,运行func时解释器回去本地找,如果没有注释。在解释器解释运行时定义了一个变量x=111,检查func的定义是否正确,并不会检查内部代码是否错误。运行func时函数会内部查找,但是解释器是由上到下执行解释并执行的时候,x并灭有定义,所以运行func会报错。
=题目六=
x=111
def foo():
print(x,)
def bar():
print(x)
foo()
bar()
解释
解释器解释代码并执行,首先定了一个x=111全局,检查了两个函数定义是否正确,运行时才解释内部代码是否正确,并执行,调用foo,foo,会在内部找,内部没有去全局找,这就找到了,调用bar时也是去内部找,没有在全局找到了。
=题目七=
x=1
def func2():
func1()
x=2
def func1():
print(x)
x=3
func2()
解释器在解释此代码,首先全局中定义了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