"""
11-16 小谈函数式编程
"""

def factory(pos):
    def go(step):
        new_pos = pos + step
        # pos = new_pos  pos被认为是局部变量
        return new_pos
    return go


tourist = factory(origin)
# print(tourist(2))
# print(tourist(5))
# print(tourist(11))

# factory 是工厂模式, 可以利用函数式编程的方式做工厂模式.
# 工厂模式是设计模式中的一种.
# Python 对闭包的定义强调的是环境变量.
# JS 对于闭包的定义强调的是标包可以实现在函数的外部间接地调用函数内部的变量. 怎么理解?


def curve_pre():
    a = 25

    def curve(x):
        return a*x*x
    return curve


f = curve_pre()
print(f(2))


# 调用 f 的时候实际上调用的是闭包的curve.
# 闭包的 curve 实际上引用了环境变量 a.
# 相对于模块来说, a 是一个局部变量, 这就间接地实现了从模块中调用局部变量.
# 所以 Python 里也有间接实现从函数外部调用函数内部变量的机制.这也是闭包的特点.

# 闭包保存环境变量的问题:
# 因为环境变量一直常驻内存里,所以它极容易造成内存泄漏.所以在使用的时候一定要注意.
# 常驻内存的变量一定要小心使用.
# 内存泄漏在服务器里相对还好,但是在JS操作浏览器的时候,非常容易消耗内存,所以极容易造成浏览器的卡顿.

# 函数式编程
# 像这样一个保存变量状态的机制,我们不用全局变量,用面向对象的对象可以解决吗?
# 一样可以解决,类变量就是一个很好的例子.
# 这只是一个思维方式.
# 闭包在基础语法里是最难理解的。

# 建议
# 不习惯函数式编程的思维, 还是使用面向对象.
# 面向对象是我们现在主流的编程思想.

# 闭包是函数式编程的一个应用.




"""
11-16 小谈函数式编程
"""

def factory(pos):
    def go(step):
        new_pos = pos + step
        # pos = new_pos  pos被认为是局部变量
        return new_pos
    return go


tourist = factory(origin)
# print(tourist(2))
# print(tourist(5))
# print(tourist(11))

# factory 是工厂模式, 可以利用函数式编程的方式做工厂模式.
# 工厂模式是设计模式中的一种.
# Python 对闭包的定义强调的是环境变量.
# JS 对于闭包的定义强调的是标包可以实现在函数的外部间接地调用函数内部的变量. 怎么理解?


def curve_pre():
    a = 25

    def curve(x):
        return a*x*x
    return curve


f = curve_pre()
print(f(2))


# 调用 f 的时候实际上调用的是闭包的curve.
# 闭包的 curve 实际上引用了环境变量 a.
# 相对于模块来说, a 是一个局部变量, 这就间接地实现了从模块中调用局部变量.
# 所以 Python 里也有间接实现从函数外部调用函数内部变量的机制.这也是闭包的特点.

# 闭包保存环境变量的问题:
# 因为环境变量一直常驻内存里,所以它极容易造成内存泄漏.所以在使用的时候一定要注意.
# 常驻内存的变量一定要小心使用.
# 内存泄漏在服务器里相对还好,但是在JS操作浏览器的时候,非常容易消耗内存,所以极容易造成浏览器的卡顿.

# 函数式编程
# 像这样一个保存变量状态的机制,我们不用全局变量,用面向对象的对象可以解决吗?
# 一样可以解决,类变量就是一个很好的例子.
# 这只是一个思维方式.
# 闭包在基础语法里是最难理解的。

# 建议
# 不习惯函数式编程的思维, 还是使用面向对象.
# 面向对象是我们现在主流的编程思想.

# 闭包是函数式编程的一个应用.




11-16 小谈函数式编程 # pos = new_pos  pos被认为是局部变量 # print(tourist(2)) # print(tourist(5)) # print(tourist(11)) # factory 是工厂模式, 可以利用函数式编程的方式做工厂模式. # 工厂模式是设计模式中的一种. # Python 对闭包的定义强调的是环境变量. # JS 对于闭包的定义强调的是标包可以实现在函数的外部间接地调用函数内部的变量. 怎么理解? # 调用 f 的时候实际上调用的是闭包的curve. # 闭包的 curve 实际上引用了环境变量 a. # 相对于模块来说, a 是一个局部变量, 这就间接地实现了从模块中调用局部变量. # 所以 Python 里也有间接实现从函数外部调用函数内部变量的机制.这也是闭包的特点. # 闭包保存环境变量的问题: # 因为环境变量一直常驻内存里,所以它极容易造成内存泄漏.所以在使用的时候一定要注意. # 常驻内存的变量一定要小心使用. # 内存泄漏在服务器里相对还好,但是在JS操作浏览器的时候,非常容易消耗内存,所以极容易造成浏览器的卡顿. # 函数式编程 # 像这样一个保存变量状态的机制,我们不用全局变量,用面向对象的对象可以解决吗? # 一样可以解决,类变量就是一个很好的例子. # 这只是一个思维方式. # 闭包在基础语法里是最难理解的。 # 建议 # 不习惯函数式编程的思维, 还是使用面向对象. # 面向对象是我们现在主流的编程思想. # 闭包是函数式编程的一个应用.