zoukankan      html  css  js  c++  java
  • Python课程回顾(day11)

    函数补充

    命名关键词参数:在定义函数时,在*args与**kwargs之间的参数就称为命名关键词参数,这种参数的特点就是必须要按照key=value的形式去传值,否则会报错。

    函数对象

    1.函数是第一类对象,指的就是函数的内存地址可以像一个变量值一样去引用

    def foo():
        print('from foo')
    f=foo                 将foo赋值给f
    print(f)              内存地址与foo是一样的
    f()                   可直接调用f
    

    2.变量值可以当做一个参数传给另外一个函数

    def bar(x):
        print(x)
    x=11111         
    bar(x)       此处将x的值传递给函数bar
    

    3.变量值可以当做函数的返回值

    def func(x):
        return x
    f=func(12345)  f后的变量值可以直接当做函数func的返回值
    print(f)
    

    4.变量值可以当做容器类型的元素

    即变量值可以是以元组、列表、字典类型的元素

    使用函数对象的特性,可以取代多分支的if判断

    def register():
        print('注册....')
    def login():
        print('登录....')
    def pay():                             (定义函数功能)
        print('支付....')
    def transfer():
        print('转账....')
    func_dic={
        '1':register,
        '2':login,                         将函数对象以字典形式存放   不能加括号,加括号代表直接调用函数的功能
        '3':pay,
        '4':transfer
    }
    while True:
        print("""
        0 退出
        1 注册
        2 登录
        3 支付
        4 转账
        """)
        choice=input('请输入你的操作: ').strip()
        if choice == '0':
    break if choice not in func_dic: print(‘输入的指令不存在') continue func_dic[choice]() 因为字典中的value就是一个个函数对象,所以此处取到value就是取到了函数体所以要加括号
    choice是用户要选择的数字,数字就是字典中的key

      

    函数的嵌套与调用

    函数的嵌套与调用:顾名思义就是在一个函数中又调用了其他的函数

    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    def max4(a,b,c,d):
        res1=max2(a,b)    调用函数中max2的返回值进行函数max4的操作
        res2=max2(res1,c)
        res3=max2(res2,d)
        return res3
    

    函数的嵌套定义:即在函数定义的过程中又在函数体内定义了另外一个函数

    def func():
        def foo():      在函数体类定义新的函数
            print('from foo')
        print(foo)
        foo()           要单纯调用foo函数只能在函数foo平级下调用
        x=1
        print(x)
    func()              要调用函数体内的函数先调用最外层函数
    

    名称空间与作用域(zzzz)

    在了解名称空间之前我们需要回顾之前的一个遗留问题,就是我们的变量。我们使用变量的时候都知道的是,在内存中开辟了一个空间将变量值放了进去,而这个值就与变量名形成了绑定关系,那么我们的变量名呢?究竟放在了哪里?

    一.名称空间相关

    1.名称空间(Namespaces):指的就是存放名字与值的内存地址绑定关系的地方   (x = 内存地址,再通过内存地址找到值本身)

    2.名称空间的分类:

    内置名称空间:存放的是python解释器自带的名字

           由python解释器的启动产生,也由python解释器的关闭而销毁

    全局名称空间:即在顶级(行首)定义的名字

                            执行python程序时产生,python程序执行完毕后自动销毁

    局部名称空间:在函数内定义的名字

           在函数调用时临时产生,在函数调用完毕后自动销毁

    三种名称空间产生的先后顺序是  内置名称空间----->全局名称空间----->局部名称空间

    x=0
    def f1():
        x=1
        def f2():
            x=2
            def f3():
                x=3
                print(x)    查找名字则会首先在当前所在的位置一层层的向上查找,即若上一层没有就再上一层,直至全局名称空间
            f3()
        f2()
    f1()
    

    二.作用域相关

    作用域指的就是作用范围,作用域也分为两大类

    全局作用域:包含内置与全局名称空间的名字,特点是:全局存活,全局有效

    局部作用域:包含局部名称空间的名字,特点是临时存活,局部有效

    强调!!!!:作用域关系是在函数定义阶段就固定死的,与调用位置无关

    def f1():
        print(xxx)
    xxx=111            函数f1的返回值就是xxx=111
    
    def f2():
        xxx=222        尽管在此处更改的xxx的值 但是在定义xxx的时候就已经固定死了
        f1()           在此处调用函数f1不会影响xxx的值
    f2()
    

    闭包函数

    闭包函数的定义:闭包函数指的就是定义在一个函数内部的函数,并且该内部函数包含对外层函数名字的引用

    def outter():
        x=1
        def inner(): 
            print('from inner',x)   x在此处就引用了外层的x=1的值
        return inner                返回的值就是x=1
    f=outter()                      若有其他函数需要调用inner的值不可以直接调用,只能调用outter,所以在此处给outter赋了一个变量名f
    def foo():
        x=111111111111111111111111111111111111
        f()                         在此处虽然调用了inner也更改了x的值,但是根据作用域关系x已经固定了所以不可改变
    foo()
    

    为函数体传值的两种方式

    1.直接以参数的形式传入

    def foo(name):
        print('hello %s' %name)     使用%s用于接收用户要传入的值
    
    foo('egon')
    foo('egon')                     用户输入的参数会传到函数foo里
    foo('egon')
    

    2.使用闭包函数形式传入

    def outter(name):
        name='egon'                定义name
        def foo():
            print('hello %s' %name)从上层name取值赋值给%s
        return foo
    
    f=outter('egon')               转换后直接调用新的变量名f
    f()
    f()
    f()
    

    扩展:爬虫

    pip3 install requests              
    问题   实现爬虫功能
    import requests                     导入系统
    def get():
        response=requests.get(url)
        if response.status_code == 200:   条件
            print(response.text)
    
    解决方案一:
    def get(url):
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)
    
    get('https://www.baidu.com')
    get('https://www.baidu.com')          需要重复输入网址
    get('https://www.baidu.com')
    
    解决方案二:
    
    def outter(url):
        url='https://www.baidu.com'          定义好网址
        def get():
            response=requests.get(url)
            if response.status_code == 200:
                print(response.text)
        return get
    
    baidu=outter('https://www.baidu.com')     给函数名传参
    cnblogs=outter('https://www.cnblogs.com')
    
    baidu()                                    简化调用
    cnblogs()
    

      

  • 相关阅读:
    jQuery的基本使用、实践、效果、API
    关于Nginx那些事儿
    Linux下安装Nginx(保姆教程)
    jQuery的那些事儿
    k8s的应用回滚--record
    MySQL之PXC
    MySQL之高可用MHA
    MySQL之主从半同步复制
    MySQL之MyCat
    MySQL之主从复制
  • 原文地址:https://www.cnblogs.com/lefy11-/p/9708820.html
Copyright © 2011-2022 走看看