python面经

python面经!!

一、python基础

1、常见数据类型,如何转换

Python的变量类型可以分为两类:可变和不可变数据类型

  1. 可变数据类型:
    当该数据类型对应变量的值发生了改变,如果它对应的内存地址不发生改变,就称为可变数据类型。包括:set(集合)、list(列表)、dict(字典)。

  2. 不可变数据类型:
    当该数据类型对应变量的值发生了改变,如果他对应的内存地址也发生改变,就称为不可变数据类型,包括:int(整型)、string(字符串)、tuple(元组)。

2、列表

请写出一段 Python 代码实现删除一个list 里面的重复元素

答:使用 set 函数,set(list)使用字典函数,

>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())

编程用 sort 进行排序,然后从最后一个元素开始判断

a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort() last=a[-1]
for i inrange(len(a)-2,-1,-1): if last==a:
del a else:last=a print(a)

、字典,高级用法列表推导式等必须掌握。

  • python中可作为字典key的类型
    一个对象能不能作为字典的key,就取决于其有没有hash方法。
    字典的键可以是任意不可变数据类型,需要注意的是tuple元组作为键时,tuple不能以任何方式包含可变对象。

  • Dictionary内部是如何实现的?
    Dictionary字典相当于一个HashMap,是通过散列表或说哈希表实现的。字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。

  • hash表怎么解决冲突?
    哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。
    哈希函数就是一个映射,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许的范围之内即可。本质上看哈希函数不可能做成一个一对一的映射关系,其本质是一个多对一的映射,这也就引出了一个概念:哈希冲突或者说哈希碰撞。哈希碰撞是不可避免的,但是一个好的哈希函数的设计需要尽量避免哈希碰撞。
    Python2中使用使用开放地址法解决冲突。
    CPython使用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键。字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为O(1)。

  • 可变数据类型为什么不能作为字典的键?
    Python中所有不可变的内置类型都是可哈希的。可变数据类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。

  • 常见的哈希碰撞解决方法
    开放寻址法
    开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。
    开放地址的意思是除了哈希函数得出的地址可用,当出现冲突的时候其他的地址也一样可用,常见的开放地址思想的方法有线性探测再散列,二次探测再散列等,这些方法都是在第一选择被占用的情况下的解决方法。
    再哈希法
    这个方法是按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。
    链地址法
    将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。
    公共溢出区
    其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。

、python可变对象,不可变对象

、python深浅拷贝的区别

  • 赋值(=)
    就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
  • 浅拷贝:
    创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如 list();3,copy 模块的 copy()函数}
  • 深拷贝:
    创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy 模块的 deep.deepcopy()函数}

、python内存管理(内存池,垃圾回收机制)

1、对象的引用计数

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。当对象被创建时,就创建了一个引用计数,当对象不再被需要时,这个对象的引用计数为0,会被垃圾回收。
引用计数增加的情况:

  • 对象被创建:
    a = 12
  • 另外的别名被创建
    b=a
  • 将其放入一个容器中(如列表、元组或字典)
    aList = [1, 2, a]
  • 作为参数传递给函数
    foobar(a)

引用计数减少的情况:

  • 用 del 语句对对象别名显示的销毁
    del b
  • 引用超出作用域(函数运行结束,所有局部变量被销毁)
  • 对象的一个别名赋值给其他对象
    b = 33
  • 对象被从一个窗口对象中移除
    aList.remove(a)
  • 窗口本身被销毁
    del aList

a=12,12这个对象并没有在内存中新建,Python启动解释器时会创建一个小整数池,-5~256之间的对象会被自动创建加载到内存中等待被调用,a=12是为12这个整数对象增加了一个引用。
sys.getrefcount( )函数可以获得对象的当前引用计数。
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

2、垃圾回收

  • 当一个对象的引用计数归零时,会被垃圾回收。
    当两个对象a,b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁,从而导致内存泄露。
    为解决这一问题,Python解释器会定期执行一个循环检测器,搜索不可访问的对象的循环,并删除他们。

3、内存池机制

Python提供了对内存的垃圾回收机制,将不用的内存放到内存池而不是返回给操作系统。

  • Pymalloc 机制。为了加速 Python 的执行效率,Python 引入了一个内存池机制,用于管理对小块内存的申请和释放。
  • Python 中所有小于 256 个字节的对象都使用 pymalloc 实现的分配器,而大的对象则使用系统的 malloc。
  • 对于Python对象,如整数、浮点数和List,都有其独立的私有内存池,对象间不共享它们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

、python面向对象的常用方法

如_new_和_init_区别,_call_方法,以及如何调用父类(super),以及面向对象的特性,什么是面向对象,你如何理解的等等

  • 类:用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。
  • 数据成员:类变量或实例变量,用于处理类及实例的相关数据

、什么是 lambda 函数?它有什么好处?

答:lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda 函数:首要用途是指点短小的回调函数
lambda [arguments]:expression

>>> a=lambdax,y:x+y
>>> a(3,11)

、python类可以定义哪几种方法

、静态方法和类方法应用场景

、介绍一下 except 的用法和作用?

答:try…except…except…[else…][finally…]
执行 try 下的语句,如果引发异常,则执行过程会跳到 except 语句。对每个 except 分支顺序尝试执行,如果引发的异常与 except 中的异常组匹配,执行相应的语句。
如果所有的 except 都不匹配,则异常会传递到下一个调用本代码的最高层 try 代码中。
try 下的语句正常执行,则执行 else 块代码。如果发生异常,就不会执行如果存在 finally 语句,最后总是会执行。

、python有哪些数据结构

、python如何实现私有成员、方法

、python协程

、迭代器

、装饰器及作用

、Python 里面如何实现 tuple 和 list 的转换?

直接使用 tuple 和 list 函数就行了,type()可以判断对象的类型

、python中用的最多的包

、元组和列表的区别

、python2和3之间的区别

、python的优缺点

、提高python运行效率的方法

、python函数是值传递还是引用传递?

python参数传递采用的是“传对象引用”的方式,这种方式是值传递和引用传递的综合。
不可变参数类型是值传递:如果函数收到的是一个不可变数据类型(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象。
可变参数类型是引用传递:如果函数收到的是一个可变数据类型(比如字典或者列表)的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象。

、Python是否可重载

所谓重载,就是多个相同函数名的函数,根据传入的参数个数,参数类型而执行不同的功能。所以函数重载实质上是为了解决编程中参数可变不统一的问题。

在python中,具有重载的思想却没有重载的概念,因为python并不需要重载。python是一门动态语言,不需要声明变量类型,函数中可以接受任何类型的参数也就无法根据参数类型来支持重载,python没有必要去考虑参数的类型问题,这些都可以在函数内部判断处理,并无必要去再写一个函数。python有多种传参方式,默认参数/可变参数/可变关键字参数可以处理函数参数中参数可变的问题。

、构造函数

python的构造函数是 init ( self [,args…] )
java中构造函数主要用来完成对象的初始化工作,构造函数必须与类的名字相同,且不能有返回值,返回值也不能为void,构造函数可以有多个参数。一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

例题:

  • 对于派生类的构造函数,在定义对象时构造函数的执行顺序为? 213
    1:成员对象的构造函数
    2:基类的构造函数
    3:派生类本身的构造函数
  • 构造函数和析构函数不能被继承,只能调用
  • 可以通过参数个数或参数类型区分构造函数,不能通过返回值区分
  • 类的构造函数可以为内联函数、重载函数或带默认形参值的函数
  • 构造函数可以是私有的
  • 构造函数不能被覆盖
  • 静态成员不属于某个对象,而属于类本身。可以在构造函数中使用或修改静态成员的值,但不能初始化它

os模块:

os 模块提供了非常丰富的方法用来处理文件和目录。
os.chdir(path) 改变当前工作目录
os.chmod(path,mode) 更改权限
os.close(fd) 关闭文件描述符fd
os.link(src,dst) 创建硬链接,名为参数dst,指向参数src
os.open(file,flags[,mode]) 打开一个文件,设置需要的打开选项
os.pipe() 创建一个管道,返回一对文件描述符(r,w)
os.path 模块 获取文件的属性信息。

二、网络编程

1、tcp和udp的区别(多说)

2、三次握手,四次挥手

3、get和post区别

(会问的很深,比如get请求一定放在url中吗,放在请求体里不行吗)

4、tcp/ip协议族

5、http和https

三、数据库

1、基础和高级知识都需要掌握(MySQL索引是高频)

2、刷完黑马b站上的数据库高阶视频

3、MySQL锁机制

4、乐观悲观

5、常用类型

6、redis的话主从复制,常用类型

(如果想深入的话要说明一下底层存储,object encoding查看,比如跳表等)

四、项目

一定是自己做出来的,才能印象深刻,能说出原理和细节,以及难点,如何解决和复盘,项目占整个面试的60%。

五、算法与数据结构

1、常见排序算法

2、时间复杂度

3、链表

4、二叉树构成

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python面经八股文是指在面试过程中经常会被问到的一些关于Python语言的基础知识问题。这些问题常常是考察面试者对Python语法、数据类型、函数库等方面的理解和应用。 第一个问题通常是问到Python的特点,比如动态语言、解释型语言等。随后可能会问到Python的命名规范,如变量名、函数名等的命名规则。 接下来可能会被问到Python的数据类型,如字符串、列表、字典和元组的特点和用法。还会询问如何进行类型转换和切片操作。 然后可能会被问到Python的函数,包括如何定义函数、函数参数的类型和默认值,以及如何调用函数和返回值等。 接着可能会被问到Python的模块和库的使用,如time、datetime、random等常用模块的函数和方法。还可能问到如何处理文件、异常等知识点。 另外,面试者还可能会被问到Python的面向对象编程的相关知识,如类和对象的概念、实例化对象、继承和多态等。 最后,可能会被问到Python的常用框架和库,如Django、Flask和NumPy等。还可能会问到如何进行数据库操作、网络编程等相关知识点。 在面试中回答这些问题需要准备充分,对Python的基础知识和常用库要熟悉,并能够清晰地表达自己的观点和经验。同时也可以结合项目经验等实际经历进行回答,展示自己的实际应用能力。 ### 回答2: Python面经八股文主要包括以下几个方面: 一、Python基础知识: 1. 数据类型:了解Python中的常见数据类型,包括字符串、列表、元组、字典等,并能灵活运用。 2. 控制结构:熟悉Python的控制结构,如条件语句、循环语句和异常处理等,并能正确使用。 3. 函数和模块:了解函数和模块的概念,在项目中能够定义并调用函数,以及导入和使用模块。 4. 文件操作:了解Python中的文件操作方法,能够对文件进行读写操作。 5. 面向对象编程:理解面向对象编程的概念,能够定义类、创建对象,并掌握继承、多态等特性。 二、Python常用库和框架: 1. Numpy:了解Numpy库的基本用法,包括数组的创建和操作,矩阵运算等。 2. Pandas:熟悉Pandas库的数据处理功能,包括数据的读取、清洗、排序、合并等。 3. Matplotlib和Seaborn:掌握Matplotlib和Seaborn库用于数据可视化的操作,能够生成各种统计图表。 4. Scikit-learn:熟悉Scikit-learn库的机器学习算法,能够进行数据预处理、特征工程和模型训练等。 三、数据库操作: 1. SQL语言:了解SQL语言的基本语法,能够编写简单的SQL查询语句,实现数据的增删改查等操作。 2. MySQL或MongoDB:了解MySQL或MongoDB数据库的基本操作,包括连接数据库、创建表、插入数据等。 3. ORM框架:熟悉Django或SQLAlchemy等ORM框架的使用,能够进行数据库的ORM操作。 四、Web开发: 1. Flask或Django:了解Flask或Django框架的基本使用方法,能够搭建简单的Web应用。 2. RESTful API:熟悉RESTful API的设计原则,能够使用Flask或Django开发和部署API接口。 3. HTML和CSS:掌握基本的HTML和CSS知识,能够进行网页布局和样式设计。 总结起来,Python面经八股文主要包括Python基础知识、常用库和框架、数据库操作以及Web开发等内容。熟练掌握这些知识点,能够在面试中展现出扎实的编程基础和项目经验,提高自己的面试竞争力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值