做企业网站要哪些人员,佛山市建设网站,重庆知名设计公司有哪些,网络推广方案范文函数闭包 定义 延伸了作用域的函数(能访问定义体之外定义的非全局变量 作用 共享变量的时候避免使用了不安全的全局变量允许将函数与某些数据关联起来,类似于简化版面向对象编程相同代码每次生成的闭包,其延伸的作用域都彼此独立(计数器,注册表)函数的一部分行为在编写时无法预… 函数闭包 定义 延伸了作用域的函数(能访问定义体之外定义的非全局变量 作用 共享变量的时候避免使用了不安全的全局变量允许将函数与某些数据关联起来,类似于简化版面向对象编程相同代码每次生成的闭包,其延伸的作用域都彼此独立(计数器,注册表)函数的一部分行为在编写时无法预知,需要动态实现,同时又想保持接口一致性较低的内存开销:类的生命周期远大于闭包实现装饰器代码 print(Class方式)
class Averager:def __init__(self):self.series []def __call__(self,new_val):self.series.append(new_val)return sum(self.series)/len(self.series)
avg1 Averager()
print(avg1(3))
print(avg1(2))print(闭包方式)
def Avg_1():count 0total 0def Avg_2(val):nonlocal total,counttotalvalcount1return total/countreturn Avg_2
avg Avg_1()
print(avg(9))
print(avg(10))输出
Class方式
3.0
2.5
闭包方式
9.0
9.5理解 功能说明 这段代码需要解决的是定义一个average函数我们每次传进去一个值都可以得到这个值和之前传入值的平均值。比如第一次传入1均值就是1第二次传入2均值就是1.5以此类推。 类方式 第一种方式是通过构建一个类这也是我们通常容易想到的方式利用在类里面创建一个list每次调用都将新值append进去这是一种解决方法。 函数闭包方式 这里跟前面提到的作用域是有关的函数闭包延伸了作用域我们可以看到我们的外层函数只是为了存储两个变量而已没有其他作用了。其实这时候应该有个疑惑在调用Avg_1之后由于count和total是在Loval层函数调用结束了应该销毁了才是但实际上并没有我们在Avg_2中通过nolocal关键字延长了两个变量的生命周期使得我们在每次调用的时候都能访问都两个变量达到效果。 装饰器 为什么会出现装饰器这个东西 名称管理显示调用就近原则充分复用语法糖 用做函数的修饰符可以在模块或者类的定义层内对函数进行修饰出现在函数定义的前一行不允许和函数定义在同一行。 什么是装饰器 装饰器是一个可调用的对象以某种方式增强函数的功能装饰器是一个语法糖在源码中标记函数此源码指编译后的源码解释器解析源码的时候将被装饰的函数作为第一个位置参数传给装饰器装饰器可能会直接处理被装饰函数然后返回它一般仅修改属性不修改代码装饰器也可能用一个新的函数或可调用对象替换被装饰函数但核心功能一般不变装饰器仅仅看着像闭包其实功能的定位与闭包有重合也有很大区别装饰器模式的本质是元编程在运行时改变程序行为装饰器的一个不可忽视的特性在模块加载时立即执行装饰器是可以堆叠的自底向上逐个装饰装饰器是可以带参数的但此时至少要写两个装饰器装饰器的更加Pythonic的实现方式其实是在类中实现 call() 方法代码 def check_param(**kw):flag kw.get(flag)def check_p(func):def decorate(*args):if flag:if not all([isinstance(arg,int) for arg in args]):raise TypeError({} only accepts integers as argument.format(func.__name__))return func(*args)return decoratereturn check_pcheck_param(flagTrue)
def my_sum(a,b):return abif __name____main__:print(my_sum(1,2))print(my_sum(1,2.0))
输出
3
Traceback (most recent call last):File /home/xueaoru/文档/pydemo/blog.py, line 18, in moduleprint(my_sum(1,2.0))File /home/xueaoru/文档/pydemo/blog.py, line 7, in decorateraise TypeError({} only accepts integers as argument.format(func.__name__))
TypeError: my_sum only accepts integers as argument解释 上面的代码是为了完成一个检查my_sum函数的参数是否是整数的功能的装饰器同时增加了开关功能我们将flag设置为true就是开启检查功能如果不是整数则直接报错。 理解 装饰器是对函数在不改变原有函数内部实现的情况下对原有函数进行功能增强。而语法糖是对原函数进行修饰的修饰符当调用语法糖进行修饰的时候即使该函数并不调用也会执行修饰语句因为触发了运行装饰器。这时候该函数作为参数传给修饰函数的外部函数然后该函数作为引用赋值给内部函数的函数名也就是说我们真正的操作是在内部函数中进行的因此可以在内部函数中对原函数进行功能增强。其中有参数的时候呢内部函数也需要通过*和**拆包得到参数原函数有返回值的时候呢我们在调用完原函数的时候也应该给出返回值。而装饰器本身带参数的时候呢可以在装饰函数外再加一层接收参数的包装得到参数。 OOP In Python 概念 一切都是对象 从语言设计层面理解Python中的数据类型一切都是对象都是从Object继承过来的。Object由三部分组成identity、type、value。 identity 理解 当Objects创建之后呢identity也不会改变直到被销毁。我觉得跟c里的地址差不多吧当然也不能完全这么理解也有不同的方。 要点 变量存储的是创建的Object的identity创建出来的不同Object有不同的identity变量的id变了不是因为Object的identity变了而是对应的Object变了对于不可变对象而言计算结果如果已经存在可以直接返回相同的identitytype 要点 当Object创建后其type不会改变type决定了一个Object可以支持那些运算可能的值在哪些范围value 要点 有些Object的value可以改变可变对象有些Object的value不可以改变不可变对象每一个class在定义的时候如果没有继承的话那么他继承的就是Object这个超级class而每一个自定义的class在python中都是一个type object。 classmethod 理解 可以把类中的某个方法变成这个类的方法而不依赖于对象也就是说在对象没有创建的时候我们也可以调用这个类的方法执行一定的操作。这就有点像C中的静态成员函数。 代码 class Student:teacher_name Omgdef __init__(self,name):self._name nameclassmethoddef Teacher(cls):print(cls.teacher_name)def Me(self):print(self._name)
if __name__ __main__:aa Student(xue)aa.Teacher()aa.Me()Student.Teacher()Omg
xue
Omg解释 这段代码是通过调用Teacher方法得到老师的名字可以看出我们就算不通过对象直接调用也可以输出老师的名字。classmethod就起这个作用。 property 理解 本质上这是一个装饰器可以省去写get、set函数的对外绑定。 property 函数原型为 property(fgetNone, fsetNone, fdelNone, docNone) 代码 property与下面的代码效果是一样的 class Teacher:def __init__(self,name,subject):self._name nameself._subject subjectdef setName(self,name):self._name namedef getName(self):return self._namedef setSubject(self,subject):self._subject subjectdef getSubject(self):return self._subjectdef show(self):print(name is:{} and subject is:{}.format(self._name,self._subject))name property(getName,setName)subject property(getSubject,setSubject)
if __name__ __main__:t Teacher(A,math)t.show()t.name Bt.subject Englisht.show()name is:A and subject is:math
name is:B and subject is:English使用property之后的更加优美的版本 class Teacher:def __init__(self,name,subject):self._name nameself._subject subjectpropertydef name(self):return self._namename.setterdef name(self,name):self._name namepropertydef subject(self):return self._subjectsubject.setterdef subject(self,subject):self._subject subjectdef show(self):print(name is:{} and subject is:{}.format(self._name,self._subject))
if __name__ __main__:t Teacher(A,math)t.show()t.name Bt.subject Englisht.show() 注意 这里property必须在setter前面初始化这个应该很容易理解因为解释器读程序的时候是从上往下读的。 Special method 要点 之所有要实现special method是为了让自定义的class与python中的内置函数无缝衔接python中有大量的内置函数而这些函数中绝大部分是special methodpython中的special method https://rszalski.github.io/magicmethods/代码 class A:def __init__(self):passdef __str__(self):return I am strdef __len__(self):return 15def __bool__(self):return Falseif __name__ __main__:a A()print(a,len(a),aTrue)转载于:https://www.cnblogs.com/aoru45/p/9937751.html