一、可迭代对象,迭代器对象和生成器

  像list,tuple等这些序列是可以使用for...in...语句进行遍历输出的。这是为什么呢?这就要需要知道可迭代对象(Iterable),迭代器对象(Iterator)和生成器对象(Genertor)。

1、什么是可迭代对象?

    把可以通过for...in...这类语句迭代读取一条数据提供我们使用的对象。

2、可迭代对象的本质?

    可迭代对象通过__ iter __方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获得该对象提供的一个迭代器,
然后通过这个迭代器来依次获取对象中的每一个数据。也就是说可迭代对象必须要有 __ iter __()方法。

3、iter()函数和next()函数的作用是什么?

    通过iter()函数获取可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。当我们已经迭代完最
后一个数据之后,再次调用next()函数会抛出Stoplteration异常,来告诉我们所有的数据都已经迭代完成,不用再执行mext()函数了。

4、什么是迭代对象?

    一个实现了 __ iter __ 方法和 __ next __ 方法的对象,就是迭代器。

5、什么是生成器?

    简单来说:只要在def中有yield关键字的,就是生成器。

6、yield的作用是什么?

    yield关键字有两点作用:
     (1)保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
     (2)将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return作用
    Python2x中的原生协成就是使用yield关键字,但在Python3x中使用的是yield from

7、如何启动生成器?

    send():除了能唤醒生成器外,还可以给生成器传值
    next():单纯的获取生成器的一个值


二、浅拷贝和深拷贝

  深拷贝:它是一种递归的方式拷贝某个对象,单独形成一个新对象。这种方式很浪费资源。

  浅拷贝:它只复制一层信息,占用的资源少!而且大部分的形式都是浅拷贝,会影响原数据。


三、面向对象总结

1、私有化

    (1)x:公有变量

    (2)_x:单个前置下划线,私有化方法或属性,from some_modue import * 是不能导入的,只有类和对象可以访问。

    (3)__ x:双前置下划线,避免与子类中的属性命名冲突,外部无法访问,但是可以通过特殊的方法访问到(obj._类名__xx)

    (4)__ x __:双前后下划线,用户命名空间的魔法方法后的属性。最好不要用

    (5)x_:单后置下划线,用于避免与Python关键字冲突。

2、封装

    一个功能一个函数,把相关函数封装成一个类对象。好处是代码可以复用。

3、继承:

    多个子类拥有相同的功能,然后把相同的函数放到父类中,通过子类的方式继承下来。

4、多态:

    (1)必须要有继承

    (2)不同对象调用同一个函数,会用不同的表现形式

    (3)Python中的多态并不是严谨的多态,因为没有做类型检查。

5、类与实例对象之间的关系:

图片说明

6、面向函数编程和面向对象编程

    面向函数编程:一个功能一个函数

    面向对象编程:把相关函数封装成一个类对象


四、进程线程协程

1.解释进程线程协程:

进程
-[1]进程:直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
-[2]进程间通信(IPC):管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。
线程
线程是进程的一个执行流,独立执行它自己的程序代码。有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。
协程
是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

2.区别及联系:
[1]:进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
[2]:线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
[3]:协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
[4]:进程和其他两个的区别还是很明显的。
[5]:协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。