我的编程空间,编程开发者的网络收藏夹
学习永远不晚

我们一起聊聊 Python 八股文

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

我们一起聊聊 Python 八股文

​同志们好,今天带着大家一起来复习python中的基础问题,我们都知道python属于解释性语言,效率也就相对其它语言来说较低一些,这个较低只是运行稍微低些,但是呢,在很多场景买这些都是微不足道的

凭借着语法的易于理解和学习,可以在短时间内完成更多工作,开发效率也会变得更高

同时,python自带了各种现成的库,供我们在开发程序中使用,python也比较容易维护

Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。

除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。

什么是 Python 生成器?

generator,有两种产生生成器对象的方式:一种是列表生成式加括号:

g1 = (x for x in range(10))

一种是在函数定义中包含yield关键字:

def fib(max):
n, a, b = 0, 0, 1
while n < max:yield b
a, b = b, a + b
n = n + 1
return 'done'g2 = fib(8)

对于generator对象g1和g2,可以通过next(g1)不断获得下一个元素的值,如果没有更多的元素,就会报错StopIteration

也可以通过for循环获得元素的值。

生成器的好处是不用占用很多内存,只需要在用的时候计算元素的值就行了。

什么是 Python 迭代器?

Python中可以用于for循环的,叫做可迭代Iterable,包括list/set/tuple/str/dict等数据结构以及生成器;可以用以下语句判断一个对象是否是可迭代的:

from collections import Iterableisinstance(x, Iterable)

迭代器Iterator,是指可以被next()函数调用并不断返回下一个值,直到StopIteration;生成器都是Iterator,而列表等数据结构不是;

可以通过以下语句将list变为Iterator:

iter([1,2,3,4,5])

生成器都是Iterator,但迭代器不一定是生成器。

list 和 tuple 有什么区别?

  • list 长度可变,tuple不可变;
  • list 中元素的值可以改变,tuple 不能改变;
  • list 支持append; insert; remove; pop等方法,tuple 都不支持

Python 中的 list 和 dict 是怎么实现的?

List: 本质是顺序表,只不过每次表的扩容都是指数级,所以动态增删数据时,表并不会频繁改变物理结构,同时受益于顺序表遍历的高效性(通过角标配合表头物理地址,计算目标元素的位置),使得python的list综合性能比较优秀

dict: 本质上是顺序表,不过每个元素存储位置的角标,不是又插入顺序决定的,而是由key经过hash算法和其他机制,动态生成的,即key通过hash散列,生成value应该存储的位置,然后再去存储这个value;所以dict的查询时间复杂度是o(1);

因此,dict的key只能为可hash的对象,即不可变类型;

Python 中使用多线程可以达到多核CPU一起使用吗?

Python中有一个被称为Global Interpreter Lock(GIL)的东西,它会确保任何时候你的多个线程中,只有一个被执行。

线程的执行速度非常之快,会让你误以为线程是并行执行的,但是实际上都是轮流执行。经过GIL这一道关卡处理,会增加执行的开销。

可以通过多进程实现多核任务。

py3和py2的区别

print在py3里是一个函数,在py2里只是一个关键字

py3文件的默认编码是utf8,py2文件的默认编码是ascii

py3的str是unicode字符串,而py2的str是bytes

py3的range()返回一个可迭代对象,py2的 range()返回一个列表,xrange()返回一个可迭代对象,py3的除法返回float,py2的除法返回int

可变对象与不可变对象

可变对象: list,dict,set

不可变对象: bool,int,float,tuple,str…

迭代器与可迭代对象的区别

可迭代对象类,必须自定义__iter__()魔法方法,range,list类的实例化对象都是可迭代对象

迭代器类,必须自定义__iter__()和__next__()魔法方法,用iter()函数可以创建可迭代对象的迭代器

闭包

闭包就是一个嵌套函数,它的内部函数 使用了 外部函数的变量或参数,它的外部函数 返回了 内部函数

可以保存外部函数内的变量,不会随着外部函数调用完而销毁

什么是装饰器?

装饰器是一个接收函数作为参数的闭包函数

它可以在不修改函数内部源代码的情况下,给函数添加额外的功能

import time
def calc_time(func):
def inner():
t1 = time.time()
func()
t2 = time.time()
print('cost time: {}s'.format(t2-t1))
return inner

什么是元类? 使用场景

元类是创建类的类,type还有继承自type的类都是元类

作用: 在类定义时(new, init)和 类实例化时(call) 可以添加自定义的功能

使用场景: ORM框架中创建一个类就代表数据库中的一个表,但是定义这个类时为了统一需要把里面的类属性全部改为小写,这个时候就要用元类重写new方法,把attrs字典里的key转为小写

GIL(Global Interpreter Lock)

全局解释器锁

全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。

即便在多核处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程,常见的使用 GIL 的解释器有CPython与Ruby MRI。可以看到GIL并不是Python独有的特性,是解释型语言处理多线程问题的一种机制而非语言特性。

GIL的设计初衷?

单核时代高效利用CPU, 针对解释器级别的数据安全(不是thread-safe 线程安全)。首先需要明确的是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。

当Python虚拟机的线程想要调用C的原生线程需要知道线程的上下文,因为没有办法控制C的原生线程的执行,所以只能把上下文关系传给原生线程,同理获取结果也是线 程在python虚拟机这边等待。那么要执行一次计算操作,就必须让执行程序的线程组串行执行。

为什么要加在解释器,而不是在其他层?

展开 GIL锁加在解释器一层,也就是说Python调用的Cython解释器上加了GIL锁,因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。

你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机 ,再往下就不受python控制了,就是C语言自己控制了。

加在Python虚拟机以下加不上去,只能加在Python解释器这一层。

GIL的实现是线程不安全?为什么?

python2.x和3.x都是在执行IO操作的时候,强制释放GIL,使其他线程有机会执行程序。

Python2.x Python使用计数器ticks计算字节码,当执行100个字节码的时候强制释放GIL,其他线程获取GIL继续执行。ticks可以看作是Python自己的计数器,专门作用于GIL,释放后归零,技术可以调整。

Python3.x Python使用计时器,执行时间达到阈值后,当前线程释放GIL。总体来说比Python3.x对CPU密集型任务更好,但是依然没有解决问题。

什么是 lambda 表达式?

简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。

lambda表达式一般的形式是:关键词lambda后面紧接一个或多个参数,紧接一个冒号“:”,紧接一个表达式

什么是深拷贝和浅拷贝?

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

浅拷贝 copy.copy:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变)

深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}​

以上就是我们一起聊聊 Python 八股文的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

我们一起聊聊 Python 八股文

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

我们一起聊聊持续优化运维告警体系

第一个可以用于消减告警数量的方法就是对已恢复的告警的处置策略上的优化。如果一个告警发生后,过了一会儿系统恢复了,或者说风险消失了,我们该如何处理呢?
我们一起聊聊持续优化运维告警体系
2024-04-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录