三周学完了pyhton,可喜可贺,可喜可贺。


基础

/除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数;

还有一种除法是//,称为地板除,两个整数的除法仍然是整数。

list和tuple是Python内置的有序集合,一个可变,一个不可变。

dict内部存放的顺序和key放入的顺序是没有关系的。

dict的key必须是不可变对象。

set和dict类似,也是一组key的集合,但不存储value。

函数

可以返回多个变量,实际上返回一个tuple。

定义默认参数要牢记一点:默认参数必须指向不变对象!

参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

高级特性

在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

高阶函数

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

返回函数

闭包:相关参数和变量都保存在返回的函数中。

返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

偏函数

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

模块

每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的

自己创建模块时要注意命名,不能和Python自带的模块名称冲突。

面向对象编程

类的方法除了第一个参数是self外,其他和普通函数一样,而调用时除了self不用传递,其他参数正常传入

实例属性属于各个实例所有,互不干扰;

类属性属于类所有,所有实例共享一个属性;

千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

面向对象高级编程

Python内置的@property装饰器就是负责把一个方法变成属性调用的。

Python允许使用多重继承,MixIn就是一种常见的设计。

Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。

metaclass是Python中非常具有魔术性的对象,它可以改变类创建时的行为。

错误、调试和测试

logging的一个好处是它允许你指定记录信息的级别,另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方。

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。

doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来

IO编程

只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

Python引入了with语句来自动帮我们调用close()方法。

变量从内存中变成可存储或传输的过程称之为序列化。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

进程和线程

线程是最小的执行单元,而进程由至少一个线程组成。

多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。

一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。

多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)

多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存

异步IO

单线程的异步编程模型称为协程。

在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力。