一:复习巩固题
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)
过程
调用全局函数func(),输出函数func内的局部变量input,func调用结束后销毁
输出全局变量input的值333
题目二
def func():
print(x)
x=111
func()
过程
调用全局函数func,调用print(x),函数func内无变量x,就去全局空间找,找到x=111,
输出111
题目三
x=1
def func():
print(x)
def foo():
x=222
func()
foo()
过程
调用全局函数foo,运行到全局函数func,调用全局函数func,调用print(x)功能,
函数func中无x,就去全局空间找,找到全局变量x=1,输出1
题目四
input=111
def f1():
def f2():
# input=333
print(input)
input=222
f2()
f1()
过程
调用全局函数f1,在函数f1中调用局部函数f2,调用print(input)功能,局部函数f2
内无input,到局部函数的外部去寻找,找到函数f1内部的局部变量input=222,输出222
题目五
x=111
def func():
print(x) #
x=222
func()
过程
调用全局函数func,调用print(x)功能,此时x还未定义,找不到x,就去上一层找,
全局和内置都找到,所以报错
题目六
x=111
def foo():
print(x,)
def bar():
print(x)
foo()
bar()
过程
调用全局函数foo,调用print(x)功能,函数foo中尚未定义x,去全局找,找到x=111,
输出111,调用全局函数bar,函数bar中尚未定义x,去全局找,找到x=111,输出111
题目七
x=1
def func2():
func1()
x=2
def func1():
print(x)
x=3
func2()
过程
调用函数func2,运行到func1,调用func1,运行到print(x),函数f1中找不到x,
就去全局找,程序是自上往下运行,所以x=1,x=2被覆盖掉了,只剩x=3,
最终在全局找到x=3,输出3
题目八
1、如下全局变量记录了当前登录用户,编写登录功能,一旦用户登录成功,则将全局变量赋值为当前登录的用户名
login_user=None
login_user=None
def login():
while True:
name=input("请输入你的账号:").strip()
pwd=input("请输入你的密码:").strip()
if name == 'juanfu'and pwd == '666':
print('登录成功')
global login_user
login_user = name
break
else:
print('账号或密码错误')
login()
print('欢迎%s用户登录!'% login_user)
2、针对之前编写的查询余额的功能,添加额外的逻辑:如果用户没有登录,则先执行登录功能
login_user=None
def login():
while True:
name=input("请输入你的账号:").strip()
pwd=input("请输入你的密码:").strip()
if name == 'juanfu'and pwd == '666':
print('登录成功')
global login_user
login_user = name
break
else:
print('账号或密码错误')
login()
print('欢迎%s用户登录!'% login_user)
def check_money(user):
name = input('请输入账号: ').strip()
if name != user:
print('请先登录哦')
login()
else:
with open('user.txt', 'rt', encoding='utf-8')as f:
for line in f:
if user in line:
user, pwd, money = line.strip().split(':')
print('用户%s您的余额为%s' % (login_user,money))
check_money(login_user)