2018-08-14

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

一、一切皆对象

  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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,035评论 3 119
  • 离职一年多了,偶尔还是会想起以前公司里的一位员工。还记得当年和他聊天时特有感触,今天把这篇采访文章翻出来贴...
    大暖小佳阅读 2,972评论 3 1
  • 城市的叹息凝聚在喧嚣的声浪尖上摇摆繁华中孤独,死亡前的哀怨等待到沉默里是一份寂寞,活着的傲有悲凉陪伴在身边将忘却,...
    走在路上的沉默阅读 2,635评论 12 17
  • “夫君,你没事吧?”刚进门的女子慌忙拉住差点倒下的男人。“碧丝,我,我没事。”身体羸弱,容颜憔悴约莫二十七八岁的男...
    两朵隔墙花阅读 2,415评论 0 0