python原生(基本)数据类型有哪些?
数字:整型/浮点 字符串、布尔、空值等
程序由哪三种结构构成?
顺序选择循环
说说常用的数据结构有哪些?各自的特点?
顺序索引结构:列表、元组顺序结构:栈和队列非线性:集合和字典
列表和元组:按索引访问访问速度快插入和删除不易
栈:后进先出多用于替换递归算法
队列:先进先出多用于环状结构处理
集合:元素不重复(需要hash和eq支持) 多用于去除重复
字典: 键值格式存储 查询效率高 适配查询性能要求高的环境
什么是面向对象?谈谈详细认知
封装、继承和多态即为面向对象
认知:封装增强了类的数据使用的安全性和使用的便捷性
继承增强了类的复用度
多态让类的对象的处理呈现出统一且可扩展及可维护性
什么是鸭子类型?
鸭子类型是类多态的一种强力补充,充分利用了python语言标识符的万用性,
增强了代码对同行为对象的统一处理能力
python是否支持多继承?多继承的搜索方式?
支持,搜索方式:广度优先
说一说你常用的魔法方法?
魔法方法:
当然其他魔法方法也很有用:
信息获取:
'__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__'
谈一谈你对python动态性的理解?是否知道猴子补丁?
动态性指的事在运行过程中给类或对象绑定添加属性
猴子补丁:在函数或对象已经定义之后再去改变它们的行为
谈一谈python的异常处理方式?
Try:可能存在异常的语句块
Except exception 异常处理语句块
Else 未发生异常语句块
Finally 结束后执行语句块
常用的字符串处理?
常见操作-查找
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,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。