美文网首页
2018-08-14

2018-08-14

作者: 西瓜超人励志要变小细腿 | 来源:发表于2018-08-15 19:08 被阅读15次

    入门与进阶:掌握了之前学的(枚举之前)基础的语法,就可以完成一般的应用程序了。
    靠基础语法可以写出代码,带不能写出优质的、可维护的代码。
    这包括开发包或者类库,需要提供给别人用,才需要考虑封装性。
    开发包或者类库,也是基于开发了很多业务逻辑相同的程序之后,有实际需要才有的。

    一、一切皆对象

    1. 函数式编程:当自己认为写的代码别扭,繁琐时尝试使用函数式编程。
    2. 闭包:闭包和函数关系很大。
      函数:只是一段可执行的代码,并不是对象。
      python中一切皆对象,函数也是对象。
      python中的函数不仅可以赋值给变量,还可以作为另外一个函数的参数传递,也可以作为另外一个函数的返回结果。
    image.png

    二、闭包

    1. Python在函数内部还可以定义函数,但该函数的作用域只在外部函数的内部有效,除非作为外部函数的返回值被返回,在外部函数的外部用一个变量接收后就可以调用它了。
    2. 闭包定义:由函数及其在定义时外部的环境变量(不能是全局变量)构成的整体。

    闭包 = 函数 + 环境变量(函数定义时)

    1. 如图,可以通过函数的内置变量 __ closure __ 来访问函数的环境变量
    image.png

    闭包的意义在于保存了一个环境。
    尤其是函数调用函数时,如果没有闭包,很容易被外部变量所影响。

    闭包必须满足两个条件:

    • 函数嵌套函数
    • 内部函数需要引用父类函数的变量


    def f1():
        a = 10
        def f2():
            a = 20  # 这时的a被python认为是局部变量,局部变量是不可能影响外部的变量
            print(a)
        print(a)
        f2()
        print(a)
    
    f1()
    
    输出结果:此时的f1() 并不是闭包函数。因为内部函数有局部变量,并没有引用外部函数的变量。
    10
    20
    10
    

    三、旅行者行走的问题

    (一)非闭包的方式解决问题

    ps:
    一个容易犯的关于变量认识上的错误

    origin = 0
    def go(step):
          new_pos = origin + step
          origin = new_pos
          return origin
    
    此时会报错说origin在函数内未被定义
    而把origin = new_pos去掉之后则不会报错。
    关于两者的不同,在一般情况下,根据变量的作用域链,origin在函数内未被定义时会去找上一级的同名变量。
    但是一旦在函数内origin出现了赋值语句的左侧,则会被认为是函数内被定义,
    成为了一个局部变量,不会再去寻找上一级。结果执行语句时就报错了。
    

    ps: global

    (二)闭包的方式解决问题

    相关文章

      网友评论

          本文标题:2018-08-14

          本文链接:https://www.haomeiwen.com/subject/tnqvbftx.html