当前位置:首页 > 服务端 > 面试八股文-Python基础

面试八股文-Python基础

2022年11月05日 20:33:23服务端34

py的语言特性: 动态强类型

静/动态: 编绎/运行 时确定变量类型

弱/强类型: 会/不会发生隐式类型转换

py作为后端语言的优缺点

  • 语言简单灵活,开发效率高

  • 胶水语言,轮子多,拥有Django这种的成熟web框架

  • 执行效率低,性能不如其他语言

  • 动态语言,没有类型声明时就没有自动补全,而且很多问题要运行后才能发现

什么是duck type?

鸭子类型更关注对象的行为,只要实现了某种接口方法就行,而不在乎是什么类型

比如说定义了 __iter__魔法方法的类实例对象都可以用for来迭代

什么是monkey patch?

monkey patch就是运行时替换对象,本质上是对象的重新赋值

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…

函数传递中*args,**kwargs

用来处理可变参数,接收参数后,args会变成一个tuple,kwargs会变成一个dict

什么时候需要捕获异常?

  • Django的ORM框架操作数据库时,获取数据,更新数据等都有可能会异常
  • socket通信时,recv()方法可能会因为对方突然中断连接导致异常

什么是CPython GIL?

GIL,Global Interpreter Lock,即全局解释器锁

引入GIL是因为CPython的内存管理并不是线程安全的,

为了保护多线程下对python对象的访问,每个线程在执行过程中都需要先获取GIL,保证同一时刻只有一个线程在执行代码

GIL使得python的多线程不能充分发挥多核CPU的性能,对CPU密集型程序的影响较大

什么是生成器?

生成器是一种可迭代对象,可以挂起并保持当前的状态

生成器遇到yield处会停止执行,调用next()或send()才会继续执行

定义一个生成器有两种方式,一种是生成器推导式,一种是在普通函数中添加yield语句并实例化

浅拷贝和深拷贝

浅拷贝出来的是一个独立的对象,但它的子对象还是原对象中的子对象

深拷贝会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。

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

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

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

闭包

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

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

python垃圾回收机制

引用计数为主,标记清除 和 分代回收为辅

引用计数机制是这样的

当对象被创建,被引用,作为参数传递,存储到容器中,引用计数+1

当对象离开作用域,引用指向别的对象,del,从容器中移除,引用计数-1

当引用计数降为0,python就会自动回收该对象所在的内存空间,

但是引用计数无法解决循环引用的问题,所以引入了标记清除和分代回收机制

async和await的作用

async: 声明一个函数为异步函数,函数内只要有await就要声明为async

await: 搭配asyncio.sleep()时会切换协程,当切换回来后再继续执行下面的语句

内置的数据结构和算法

  • 内置数据结构: list,dict,tuple,set
  • 内置算法: sorted,max

collections模块

collections模块提供了一些好用的容器数据类型,其中常用的有: namedtuple,deque,Counter,OrderedDict,defaultdict

为什么dict查找的时间复杂度是O(1)?

dict底层是哈希表,哈希表类似于C语言的数组,可以实现按索引随机访问

但dict的key不一定是整数,需要先通过哈希函数,再经过取余操作转换为索引

list tuple的底层结构

list和tuple底层都是顺序表结构

list底层是可变数组,数组里存放的是元素对象的指针

set的底层结构

哈希表,key就是元素,value都是空

class方法 和 static方法的区别

class方法的第一个参数是cls,可以访问类属性,类方法

static方法和普通函数一样,只不过是放在类里,要通过类或实例来调用,但是它不能访问类和实例的属性和方法

什么是装饰器?

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

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

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转为小写

实现单例模式的三种方式

单例模式: 一个类只能创建一个实例化对象

class Foo():
    __instance = None

    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance
class MyType(type):
    def __init__(self):
        super().__init__()
        self.__instance = None

    def __call__(self,*args,**kwargs):
        if not self.__instance:
            self.__instance = super().__call__(*args,**kwargs)
        return self.__instance
    
class Foo(metaclass=MyType):
    ...
def outter(cls):
    dct = {
     }
    def inner(*args,**kwargs):
        if cls not in dct:
            dct[cls] = cls(*args,**kwargs)
        return dct[cls]
    return inner

@outter
class Foo():
    ...

工厂模式

根据不同条件创建不同的类实例化对象

class CarFactory():
    def produce(self,name):
        if name == 'BYD':
            return BYD()
        elif name == 'BMW':
            return BMW()
        
class BYD():
    pass
    
class BMW():
    pass

car = CarFactory().produce('BMW')

作者:wslynn
来源链接:https://blog.csdn.net/qq_38992249/article/details/119968248

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68032.html

分享给朋友:

“面试八股文-Python基础” 的相关文章

Python:实用的IPython(一种交互式开发环境)

Python:实用的IPython(一种交互式开发环境)

用习惯了CentOS突然又用Windows,写Python想在控制端写怎么办?别急,一招教你在Windows终端写出一手舒服的代码! 欢迎光临,我的主页。更多干货,等你来学: 不许代码码上红 警句:莫道君行早,更有早行人。...

Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始

Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始

1. 前言 本文将介绍希尔排序、归并排序、基数排序(桶排序)。 在所有的排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。 希尔、归并、快速排序算法也可归为同一类,它们的共同点都是建立在分治思想之上。...

并发编程|说完AQS,面试官为何不淡定了?

并发编程|说完AQS,面试官为何不淡定了?

你能说下什么是AQS AQS是队列同步器AbstractQueueSynchronizer的简写,它是用来构建锁和其他同步组件的基础框架,它定义了一个全局的int 型的state变量,通过内置的FIFO(先进先出)队列来完成资源竞...

Java集合---面试题

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中,甚至会要求你实现...

Python快速学习06:词典

Python快速学习06:词典

系列文章:[传送门]   上面讲的,特别是对象和类,大家好好体会。   Python对象是Python语言的核心部分。今天介绍一个新类:词典(dicrionary)   基本概念   字典是Python 中的映射数据类型,工作原...

python常用时间处理方法

常用时间处理方法 今天 today = datetime.date.today() 昨天 yesterday = today - datetime.timedelta(days=1) 上个月 last_month = today.month - 1...

Java探针-Java Agent技术-阿里面试题

Java探针-Java Agent技术-阿里面试题

 Java探针参考:Java探针技术在应用安全领域的新突破     最近面试阿里,面试官先是问我类加载的流程,然后问了个问题,能否在加载类的时候,对字节码进行修改 我懵逼了,答曰不知道,面试官说可以的,使用Java探针技术,能够实现...

IOS面试题详解(二)..

IOS面试题详解(二)..

上一篇文章列出了共32道IOS面试题: http://www.cnblogs.com/fkdd/archive/2012/03/13/2394724.html 下面从第一题开始解答: 题目:1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?...

widows下 python环境变量配置

widows下 python环境变量配置 便于cmd命令行操作,例如:直接进入Python解释器环境、使用pip安装模块等。 作者:hello-Jesson 来源链接:https://www.cnblogs.com/hello...

Python安装与环境变量配置

目录 Python下载与安装 配置环境变量 Pycharm安装: Python下载与安装 Python官网:https://www.python.org/ 配置环境变量 系统变量...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。