入门与进阶:掌握了之前学的(枚举之前)基础的语法,就可以完成一般的应用程序了。
靠基础语法可以写出代码,带不能写出优质的、可维护的代码。
这包括开发包或者类库,需要提供给别人用,才需要考虑封装性。
开发包或者类库,也是基于开发了很多业务逻辑相同的程序之后,有实际需要才有的。
一、一切皆对象
- 函数式编程:当自己认为写的代码别扭,繁琐时尝试使用函数式编程。
- 闭包:闭包和函数关系很大。
函数:只是一段可执行的代码,并不是对象。
python中一切皆对象,函数也是对象。
python中的函数不仅可以赋值给变量,还可以作为另外一个函数的参数传递,也可以作为另外一个函数的返回结果。
二、闭包
- Python在函数内部还可以定义函数,但该函数的作用域只在外部函数的内部有效,除非作为外部函数的返回值被返回,在外部函数的外部用一个变量接收后就可以调用它了。
- 闭包定义:由函数及其在定义时外部的环境变量(不能是全局变量)构成的整体。
闭包 = 函数 + 环境变量(函数定义时)
- 如图,可以通过函数的内置变量 __ closure __ 来访问函数的环境变量
闭包的意义在于保存了一个环境。
尤其是函数调用函数时,如果没有闭包,很容易被外部变量所影响。
闭包必须满足两个条件:
- 函数嵌套函数
内部函数需要引用父类函数的变量
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