• 作业


    一:复习巩固题
    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
    
    
  • 相关阅读:
    17.1.1.2 Setting the Replication Slave Configuration
    17.1.1 How to Set Up Replication
    ffmpeg结构体以及函数介绍(二) 分类: ffmpeg-SDL-VLC-Live555 2013-08-22 18:03 451人阅读 评论(0) 收藏
    ffmpeg结构体以及函数介绍(一) 分类: ffmpeg-SDL-VLC-Live555 2013-08-22 18:01 543人阅读 评论(0) 收藏
    ffmpeg入门之 Tutorial01 分类: ffmpeg-SDL-VLC-Live555 2013-08-22 17:54 495人阅读 评论(0) 收藏
    uclibc和glibc的差别 分类: arm-linux-Ubuntu 2013-08-21 17:42 499人阅读 评论(0) 收藏
    Cramfs、JFFS2、YAFFS2全面对比 分类: arm-linux-Ubuntu 2013-08-21 10:42 904人阅读 评论(0) 收藏
    Hi3531 SDK v2.0.8.0 安装 分类: HI3531 2013-08-21 10:25 2748人阅读 评论(1) 收藏
    arm-linux-gcc: Command not found 问题解析 . 分类: arm-linux-Ubuntu 2013-08-21 08:43 855人阅读 评论(0) 收藏
    Hi3531 SDK 安装以及升级使用说明 分类: HI3531 2013-08-20 17:26 2657人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/wait59/p/13155164.html
Copyright © 2020-2023  润新知