zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    HDU 5585 Numbers
    HDU 3308 LCIS
    POJ 2991 Crane
    POJ 1436 Horizontally Visible Segments
    POJ 3667 Hotel
    HaiHongOJ 1003 God Wang
    【SDOI 2008】 递归数列
    5月19日省中提高组题解
    【HDU 1588】 Gauss Fibonacci
    【POJ 3233】Matrix Power Series
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/9367617.html
Copyright © 2011-2022 走看看