一阶段面试题

  1. python原生(基本)数据类型有哪些?

数字:整型/浮点 字符串、布尔、空值等

  1. 程序由哪三种结构构成?

顺序选择循环

  1. 说说常用的数据结构有哪些?各自的特点?

顺序索引结构:列表、元组顺序结构:栈和队列非线性:集合和字典

列表和元组:按索引访问访问速度快插入和删除不易

栈:后进先出多用于替换递归算法

队列:先进先出多用于环状结构处理

集合:元素不重复(需要hash和eq支持) 多用于去除重复

字典: 键值格式存储 查询效率高 适配查询性能要求高的环境

  1. 什么是面向对象?谈谈详细认知

封装、继承和多态即为面向对象

认知:封装增强了类的数据使用的安全性和使用的便捷性

继承增强了类的复用度

多态让类的对象的处理呈现出统一且可扩展及可维护性

  1. 什么是鸭子类型?

鸭子类型是类多态的一种强力补充,充分利用了python语言标识符的万用性,

增强了代码对同行为对象的统一处理能力

  1. python是否支持多继承?多继承的搜索方式?

支持,搜索方式:广度优先

  1. 说一说你常用的魔法方法?

魔法方法:

当然其他魔法方法也很有用:

信息获取:

'__class__', 获取类型

'__dir__', 获取全描述

'__doc__', 获取类及类中方法的注释

'__sizeof__', 获取对象字节长度 默认返回引用长度32

属性相关:

删除对象对象属性时执行的方法

'__delattr__',

获取找不到的属性时执行的方法

'__getattribute__',

设置属性时执行的方法

'__setattr__',

运算符重载

'__eq__', ==

'__ge__', >=

'__gt__', >

'__le__', <=

'__lt__', <

'__ne__', !=

集合相关:

'__hash__',

构造:

'__new__',

初始化:

'__init__',

对象自动解析:

交互式时使用

'__repr__',

一般类中重写将对象解析为字符串

'__str__',

格式化对象时

'__format__',

归约相关

'__reduce__',

'__reduce_ex__',

生成子类对象时:

'__init_subclass__',

检测子类方法

'__subclasshook__'

  1. 谈一谈你对python动态性的理解?是否知道猴子补丁?

动态性指的事在运行过程中给类或对象绑定添加属性

猴子补丁:在函数或对象已经定义之后再去改变它们的行为

  1. 谈一谈python的异常处理方式?

Try:可能存在异常的语句块

Except exception 异常处理语句块

Else 未发生异常语句块

Finally 结束后执行语句块

  1. 常用的字符串处理?

常见操作-查找

string.find(str, beg=0, end=len(string))

检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

string.rfind(str, beg=0, end=len(string))

类似于 find()函数,不过是从右边开始查找.

string.index(str, beg=0, end=len(string))

类似于 find()函数,但是找不到报异常.

string.rindex(str, beg=0, end=len(string))

类似于 rfind()函数,但是找不到报异常.

常见操作-统计

string.count(str, beg=0, end=len(string))

检测 str 是否包含在 string 中出现的次数,如果 beg 和 end 指定范围,则检查是否包含在指定范围内

常见操作-分割

string.split(str="", num=string.count(str))

以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串

string.splitlines([keepends])

按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

string.partition(str)

有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.

string.rpartition(str)

类似于 partition()函数,不过是从右边开始.

常见操作-判断

string.startswith(obj, beg=0,end=len(string))

检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

string.endswith(obj, beg=0,end=len(string))

检查字符串是否是以 obj 结尾,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

string.isalnum() 所有字符都是字母或数字则返回 True,否则返回 False

string.isalpha() 所有字符都是字母则返回 True,否则返回 False

string.isdigit() 所有字符都是数字则返回 True,否则返回 False

string.isupper() 所有字符都是大写则返回 True,否则返回 False

string.islower() 所有字符都是小写则返回 True,否则返回 False

string.isspace() 只包含空格则返回 True,否则返回 False

常见操作-大小写

string.capitalize()

把字符串的第一个字符大写

string.upper()

转换 string 中的小写字母为大写

string.lower()

转换 string 中的大写字母为小写

常见操作-对齐

string.ljust(width)

返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

string.rjust(width)

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

string.center(width)

返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

常见操作-裁剪

string.strip([obj])

删除 string 字符串前后的的obj,如果不传参数,删除前后空格

string.lstrip([obj])

删除 string 字符串左面的obj,如果不传参数,删除左面空格

string.rstrip([obj])

删除 string 字符串右面的obj,如果不传参数,删除右面空格

常见操作-合并

string.join(seq)

以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

11.排序算法你了解哪些?哪些是稳定的?

答:

排序算法有冒泡、选择、插入、快速、希尔排序等(说出四五种即可冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序)

稳定排序的有基数排序, 插入排序 , 冒泡排序, 归并排序

12.简单说一下如何实现序列化?有什么不同?

一种用pickle进行二进制序列化

一种用json进行文本特定格式序列化

pickle依赖python环境可读性和跨环境性较差数据类型适配性强使用方便

json不依赖python环境可读性和跨环境性较强数据类型适配性差不直接支持对象

13.如何漫游一个文件目录?有哪两种方式?

自定义递归方法或者使用os.walk

14.谈谈深浅拷贝

浅拷贝拷贝引用自身及引用指向的第一级内容

深拷贝拷贝每一级数据原数据和拷贝数据完全各自独立

15.gc的回收时机及回收机制?

gc回收时机:1.程序退出2. 当gc模块的计数器达到阀值的时候 3.强制执行回收,即调用gc.collect()

回收机制: 引用计数、标记-清除和分代收集

16.谈谈对闭包的理解?

闭包是函数化编程的重要技术手段

主要依靠函数内部函数来保持外函数状态

python中多用于装饰器的实现

纯函数化语言也多用于模拟面向对象

17.可迭代、迭代器、生成器的区别?

可迭代是指对象可以被循环迭代

迭代器在可迭代的基础上追加了next功能支持按需迭代数据

生成器是利用惰性机制进行按需产生数据

18.谈谈对装饰器的理解。

装饰器本质上是一种特殊的闭包

作用:

1.不违背开闭原则情况下对函数进行前处理及后处理

2.逻辑功能函数进行切面式统一管控

19.正则模块中search和match的区别?

search匹配第一个

match从头匹配

20.谈谈正则的贪婪和非贪婪模式。

在数量级匹配符中使用

默认为贪婪模式用最多量的方式完成匹配

数量级匹配符后加?即为非贪婪用最少量的方式完成匹配

Python的内存管理

从三个方面来说,

一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:1,一个对象分配一个新名称 2,将其放入一个容器中(如列表、元组或字典) 引用计数减少的情况: 1,使用del语句对对象别名显示的销毁 2,引用超出作用域或被重新赋值 sys.getrefcount( )函数可以获得对象的当前引用计数 多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值