Python编程面试题

384 阅读6分钟

1、Python中的多线程和多进程什么区别?

1.1 线程

1.1.1 什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

1.1.2 线程的工作方式

假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时恢复到当时读的具体进度。有一个方法就是记下页数、行数与字数这三个数值,这些数值就是execution context。如果你的室友在你休息的时候,使用相同的方法读这本书。你和她只需要这三个数字记下来就可以在交替的时间共同阅读这本书了。

线程的工作方式与此类似。CPU会给你一个在同一时间能够做多个运算的幻觉,实际上它在每个运算上只花了极少的时间,本质上CPU同一时刻只干了一件事。它能这样做就是因为它有每个运算的execution context。就像你能够和你朋友共享同一本书一样,多任务也能共享同一块CPU。

1.2 进程

一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间),还要有至少一个线程。

每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程。

与进程相关的资源包括:

内存页(同一个进程中的所有线程共享同一个内存空间)
文件描述符(e.g. open sockets)
安全凭证(e.g.启动该进程的用户ID)

1.3 进程与线程区别

  • 1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。
  • 2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。
  • 3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
  • 4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
  • 5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
  • 6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
  • 7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
  • 8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。

想要了解详细请参考网址: www.cnblogs.com/whatisfanta…www.cnblogs.com/yssjun/p/11…

2、Python中什么是可变数据类型?什么是不可变数据类型?

python3的基本数据类型有六种: Number(int, float, bool, complex),String, List, Tuple, Dictionary, Set

可变数据类型:list,dic,set

不可变数据类型:Number, String, Tuple

什么是可变数据类型和不可变数据类型?

1、Python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象。而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象。

2、Python中的可变数据类型,允许变量的值发生变化,如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化。不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于相同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

数字,字符串,列表,字典,布尔型

可变:列表,字典 不可变:数字,字符串,布尔

可变数据类型:在id不变的情况下,数据类型的内部可以改变

不可变数据类型:value值改变,id也跟着改变 3、Python中如何实现单例设计模式? image.png 上图链接:blog.csdn.net/weixin_4228…

什么是单例模式?

程序猿保证一个类只有一个实例,并且该类可以自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

单例模式如何实现?

其实单例模式是一种设计模式,是一种概念。了解了单例模式的原理和定义。使用任何开发语言都可以实现。下面小白就简单使用Python语言实现。

image.png

在Python语言中,Python模块就是一个比较典型的单例模式。Python模块在第一次执行时会生成一个.pyc 文件。当第二次调用执行模块时就会直接调用.pyc 文件而不执行代码。

Python语言实现单例模式途径一:使用Python模块。

image.png

Python语言实现单例模式途径二:使用Python的“new”。

image.png

来自百度经验

4、Python中,一行代码实现两数交换

#定义两个数并赋值

x = 1 y = 2

#第1种方式:引入第三方变量

z = 0 z = x x = y y = z

#第2种:不引入第三方变量

x = x+y y = x-y x = x-y

#第3种:推荐

x,y = y,x

print("x=%d,y=%d"%(x,y))

5、Python中的__new__和__init__两个方法什么区别

init 方法为初始化方法, __new__方法才是真正的构造函数。 1、__new__方法默认返回实例对象供__init__方法、实例方法使用。

转载于:blog.csdn.net/four_infini…

new()是新式类中才出现的方法,即只有从object继承的类才有该方法。注意,新式类是从python2.2开始加入的,在python2.x中同时存在新式类和旧式类(旧式类也称经典类,主要是为了兼容以前的代码),但是在python3.x中已经完全摒弃旧式类了,在python3.x中即使不显示的写明从object继承,系统也会默认从object继承。

在旧式类中,实例的构造只调用__init__()这一个函数(至少从外表来看是如此),因此很多场合称__init__()为构造函数,在旧式类中这完全没问题,但是在新式类中这么叫并不完全合适。

在新式类中,实例的构造先调用__new__()函数返回一个实例,然后调用__init__()对返回的实例进行初始化。因此可以看出__new__()才是真正的构造函数,init()只是起到了初始化的过程。