接着上次的知识散记,我们接着看。
闭包
在函数内部定义一个函数,并且这个函数用到了外面的变量。将这个函数以及用到的一些变量称之为闭包。
当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。
PS:这好像和C++不一样,C++是不允许函数嵌套定义的
global:
一般多用在函数内,声明变量的作用域为全局作用域。
nonlocal:
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量
lambda匿名函数:
不要看匿名函数蛮简单的,其实还是有点注意事项的。对默认参数的赋值只会在函数定义的时候绑定一次。x是一个自由变量。在运行的时候绑定,而不是在定义的时候绑定。执行时,x的值是多少就是多少。如果希望匿名函数可以在定义的时候绑定,并保持值不变,则采用下面方法。
assert:断言
用来直接让程序崩溃,在程序中置入检查点
条件后可以添加字符串,用来解释断言
format:
对*和**的解释:
星号(*)和(**)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。
星号(*)或(**)作为形参,表示调用可变参数函数:
通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。
从两个示例的输出可以看出:当参数形如 args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);当参数形如 *args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。
星号(**)和(*)作为实参时,表示通过解包参数调用函数:
常用内置函数补充:
复数可以通过complex(real,imag)来指定。conjugete提取共轭复数
hasattr:hasattr() 函数用于判断对象是否包含对应的属性。如果对象有该属性返回 True,否则返回 False。
上下文管理器(context manager):
任何实现了__enter__和__exit__方法的对象都可称为上下文管理器
__enter__():方法返回资源对象,这里就是你将要打开的那个文件对象,__exit__()处理一些清除工作。因为File类实现上下文管理器,现在就可以使用with语句了。
实现上下文管理器的其他方法:使用contextmanager装饰器
python的三种修饰符:
staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。staticmethod、classmethod具体看python的类和对象。
注意:
函数先定义,再修饰它;反之会编译器不认识;
修饰符“@”后面必须是之前定义的某一个函数;
每个函数只能有一个修饰符,大于等于两个则不可以。
property有两种用法:
方法当作属性来访问
第一种用法
注意:getnum和setter的顺序,一定getnum在第一个
第二种用法
1 | class DataSet(object): |
防止属性被修改
1 | class DataSet(object): |