• Python学习


    1、三元运算符

      三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
      格式:[on_true] if [expression] else [on_false]
      res = 值1 if 条件 else 值2
    def my_max(x,y):
        m = x if x>y else y
        return m
    bigger = my_max(10,20)
    print(bigger)

    2、命名空间

      1)三种命名空间

        内置命名空间 —— Python解释器

          就是Python解释器,一启动就可以使用的名字存储在内置命名空间中

          内置的名字在启动解释器的时候被加载进内存里

        全局命名空间 —— 我们写的代码但不是函数中的代码
          是在程序从上到下被执行的过程中依次加载进内存的
          放置了我们设置的所有变量名和函数名
        局部命名空间 —— 函数
          就是函数内部定义的名字
          当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
      2)三种命名空间之间的加载与取值顺序:
        加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
        取值顺序:
          在局部调用:局部命名空间->全局命名空间->内置命名空间
    x = 1
    def f(x):
        print(x)
    print(10)

          在全局调用:全局命名空间->内置命名空间

    def max(l):
        print('in max func')
        return l
    print(max([1,2,3]))

          在内置调用:不能使用局部命名空间和全局命名空间

        3)相同命名空间的处理机制
          在正常情况下,直接使用内置命名空间
          当我们在全局定义了和内置名字空间中同名的名字时,会使用全局命名空间
          多个函数应该拥有多个独立的局部命名空间,不互相共享
          当命名空间在本级找不到,就到上一级找,上一级没有再找上一级,如果连内置命名空间都没有,就报错
    def func():
        input = 1
        print(input)
    func()

    3、作用域

      1)定义
        作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
        全局作用域:包含内置命名空间、全局命名空间,在整个文件的任意位置都能被引用、全局有效
        局部作用域:局部命名空间,只能在局部范围生效
      2)globals和locals方法
    print(globals())
    print(locals())
    #   打印出的内容相同
    def func():
        a = 12
        b = 20
        print(locals())
        print(globals())
    func()
    #   locals()打印出局部函数的参量
    #   globals()打印出全局函数的参量

      3)global关键字与nonlocal关键字

        global声明
          对于不可变数据类型,在局部可是查看全局作用域中的变量,但是不能直接修改
          如果想要修改,需要在程序的一开始添加global声明,如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
    a = 10
    def func():
        global a
        a = 20
    print(a)
    func()
    print(a)

        nonlocal声明

          只能用于局部变量 找上层中离当前函数最近一层的局部变量
          声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量
          对全局无效,对局部 也只是对 最近的 一层 有影响
    a = 0
    def outer():
        a = 1
        def inner():
            a = 2
            def inner2():
                nonlocal a
                a = 20
                print(a)
            inner2()
        inner()
        print(a)
    outer()
    print(a)

          注意:   1、外部必须有这个变量

              2、在内部函数声明nonlocal变量之前不能再出现同名变量

              3、内部修改这个变量如果想在外部有这个变量的一次层函数中生效

    4、函数的嵌套与作用域链
      1)函数的嵌套调用
    def max2(x,y):
        m  = x if x>y else y
        return m
    def max4(a,b,c,d):
        res1 = max2(a,b)
        res2 = max2(res1,c)
        res3 = max2(res2,d)
        return res3
    num = max4(23,-7,31,11)
    print(num)

      2)函数的嵌套定义

    def f1():
        print("in f1")
        def f2():
            print("in f2")
        f2()
    f1()
    def f1():
        def f2():
            def f3():
                print("in f3")
            print("in f2")
            f3()
        print("in f1")
        f2()
    f1()

      3)函数的作用域链

    def f1():
        a = 1
        def f2():
            print(a)
        f2()
    f1()
    def f1():
        a = 1
        def f2():
            def f3():
                print(a)
            f3()
        f2()
    f1()
    def f1():
        a = 1
        def f2():
            a = 2
        f2()
        print('a in f1 : ',a)
    f1()

    5、函数名的本质

      函数名本质上就是函数的内存地址

      1)函数名可以被引用

    def func():
        print('in func')
    f = func
    print(f)

      2)可以被当作容器类型的元素

    def f1():
        print('f1')
    def f2():
        print('f2')
    def f3():
        print('f3')
    l = [f1,f2,f3]
    d = {'f1':f1,'f2':f2,'f3':f3}
    #调用
    l[0]()
    d['f2']()

      3)可以当作函数的参数和返回值

        第一类对象(first-class object)指

        1、可在运行期创建

        2、可用作函数参数或返回值

        3、可存入变量的实体

    6、闭包

      1)闭包函数

        内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数(函数内部定义的函数称为内部函数)

    #   闭包模型函数
    def func():
        name = 'eva'
        def inner():
            print(name)
        return inner
    f = func()
    f()

      2)判断闭包函数的方法_closure_

    #   输出的__closure__有cell元素 :是闭包函数
    def func():
        name = 'eva'
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    f = func()
    f()
    #   输出的__closure__为None :不是闭包函数
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    f2 = func2()
    f2()

      3)闭包嵌套

    def wrapper():
        money = 1000
        def func():
            name = 'eva'
            def inner():
                print(name,money)
            return inner
        return func
    f = wrapper()
    i = f()
    i()

      4)闭包函数获取网页应用

    from urllib.request import urlopen
    def index():
        url = "http://www.xiaohua100.cn/index.html"
        def get():
            return urlopen(url).read()
        return get
    xiaohua = index()
    content = xiaohua()
    print(content)
  • 相关阅读:
    以太坊:深入理解Solidity-Solidity v0.5.0 重大更新
    以太坊:深入理解Solidity-合约
    以太坊:深入理解Solidity-表达式和控制结构
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/9367617.html
Copyright © 2020-2023  润新知