2018最常见的Python面试题(技术题)---------------------第三波福利

版权声明:CSDN 博主刘康康 https://blog.csdn.net/liiukangkang/article/details/84594179

1.请说一下你对迭代器和生成器的区别?

(1)迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter
方法返回自己本身。对于 string、list、dict、tuple 等这类容器对象,使用 for 循环遍历
是很方便的。在后台 for 语句对容器对象调用 iter()函数,iter()是 python 的内置函数。
iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,
next()也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异

(2)生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规
的函数,只是在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返
回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)
区别:生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和 next()方
法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时
节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出
StopIteration 异常

2.什么是线程安全?

线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正确, 而且
要保证对于共享的数据可以由多个线程存取,但是同一时刻只能有一个线程进行存取。多线
程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性。

3.Python 中数组有哪些类型?字典可以是有序的吗??

List Tuple Dictionary
from collections import OrderedDict
dic=OrderedDict()#声明有序字典

4.python 中 yield 的用法?

yield 简单说来就是一个生成器,这样函数它记住上次返 简单说来就是一个生成
器,这样函数它记住上次返 简单说来就是一个生成器,这样函数它记住上次返 简单说来就
是一个生成器,这样函数它记住上次返 回时在函数体中的位置。对生成器第 二次(或 n 次)
调用跳转至该函 次)调用跳转至该函 数。

5.谈谈你对 GIL 锁对 python 多线程的影响?

GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 python 设计之初的考
虑,为了数据安全所做的决定。每个 CPU 在同一时间只能执行一个线程(在单核 CPU 下的多
线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。
但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多
个事件在同一时间间隔内发生。)
在 Python 多线程下,每个线程的执行方式:
1、获取 GIL
2、执行代码直到 sleep 或者是 python 虚拟机将其挂起。
3、释放 GIL
可见,某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且
在一个 python 进程中,GIL 只有一个。拿不到通行证的线程,就不允许进入 CPU 执行。
在Python2.x里, GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks
可以看作是 Python 自身的一个计数器,专门做用于 GIL,每次释放后归零,这个计数可以
通过 sys.setcheckinterval 来调整),进行释放。而每次释放 GIL 锁,线程进行锁竞争、
切换线程,会消耗资源。并且由于 GIL 锁存在,python 里一个进程永远只能同时执行一个
线程(拿到 GIL 的线程才能执行)。
IO 密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有 IO 操
作会进行 IO 等待,造成不必要的时间浪费,而开启多线程能在线程 A 等待时,自动切换到
线程 B,可以不浪费 CPU 的资源,从而能提升程序执行效率),所以多线程对 IO 密集型代码
比较友好。

6. Python 常用的设计模式有哪些? 1 创建型模式

前面讲过,社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和
对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独
对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有 6
个具体的创建型模式可供研究,它们分别是:
简单工厂模式(Simple Factory);
工厂方法模式(Factory Method);
抽象工厂模式(Abstract Factory);
创建者模式(Builder);
原型模式(Prototype);
单例模式(Singleton)。
说明:严格来说,简单工厂模式不是 GoF 总结出来的 23 种设计模式之一。
2 结构型模式
在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关
注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的
健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有 7 个具体的
结构型模式可供研究,它们分别是:
外观模式(Facade);
适配器模式(Adapter);
代理模式(Proxy);
装饰模式(Decorator);
桥模式(Bridge);
组合模式(Composite);
享元模式(Flyweight)
3 行为型模式
在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的
行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高,这里有 11 个
具体的行为型模式可供研究,它们分别是:
模板方法模式(Template Method);
观察者模式(Observer);
状态模式(State);
策略模式(Strategy);
职责链模式(Chain of Responsibility);
命令模式(Command);
访问者模式(Visitor);
调停者模式(Mediator);
备忘录模式(Memento);
迭代器模式(Iterator);
解释器模式(Interpreter)。

7.解释一下什么是闭包?

内部函数可以使用外部函数变量的行为,就叫闭包。

8.如何用 Python 来进行查询和替换一个文本字符串?

可以使用 re 模块中的 sub()函数或者 subn()函数来进行查询和替换,
格式: sub(replacement, string[,count=0])(replacement 是被替换成的文本, string
是需要被替换的文本,count 是一个可选参数,指最大被替换的数量)

9.递归函数停止的条件

递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断
的结果选择是继续调用自身,还是 return;返回终止递归。
终止的条件:1.判断递归的次数是否达到某一限定值
2. 判断运算的结果是否达到某个范围等,根据设计的目的来选择

猜你喜欢

转载自blog.csdn.net/liiukangkang/article/details/84594179