【面试题目来着微信公众号:GitChat】
其他内容
-
解释一下 python 中 pass 语句的作用?
写代码的时候用作占位。在搭建代码框架时,功能模块可以先用注释和pass占位,之后再补充完善代码。 -
简述你对 input()函数的理解
用户输入字符串,返回一个字符串。 -
python 中的 is 和==
【is】比较地址是否相同
【==】比较值是否相等 -
Python 中的作用域
【概念】在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。
【分类】LEGB
L(local)局部作用域:函数
E(enclosing)嵌套作用域:父函数
G(global)全局作用域:模块
B(built-in)内置作用域:系统内固定模块里定义的变量 -
三元运算写法和应用场景?
【写法】为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)
【应用】return返回时我会用到。return True if XXX else False
-
了解 enumerate 么?
【enumerate(sequence, [start=0])】用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
【应用】遍历列表时,获取索引。for i, v in enumerate(l): print("索引:% s" % i) print("元素:% s" % v)
-
列举 5 个 Python 中的标准模块
math,os,sys,time,datetime,logging,threading,multiprocessing等
python 标准库 -
如何在函数中设置一个全局变量
global xxx
-
pathlib 的用法举例
pathlib是 python3.x中加入的处理路径的模块,类似os.path.常用操作
p = Path(r'd:\test\tt.txt.bk') p.name # 获取文件名 # tt.txt.bk p.stem # 获取文件名除后缀的部分 # tt.txt p.suffix # 文件后缀 # .bk p.suffixs # 文件的后缀们... # ['.txt', '.bk'] p.parent # 相当于dirnanme # WindowsPath('d:/test') p.parents # 返回一个iterable, 包含所有父目录 # <WindowsPath.parents> for i in p.parents: print(i) # d:\test # d:\ a.parts # 将路径通过分隔符分割成一个元祖 # ('d:\\', 'test', 'tt.txt.bk')
另一些常用操作…
p = Path(r'd:\test') p = Path(p, 'tt.txt') # 字符串拼接 p.exists() # 判断文件是否存在 p.is_file() # 判断是否是文件 p.is_dir() # 判断是否是目录
遍历文件夹
p = Path(r'd:\test') # WindowsPath('d:/test') p.iterdir() # 相当于os.listdir p.glob('*') # 相当于os.listdir, 但是可以添加匹配条件 p.rglob('*') # 相当于os.walk, 也可以添加匹配条件
创建文件夹
p = Path(r'd:\test\tt\dd') p.mkdir(exist_ok=True) # 创建文件目录(前提是tt目录存在, 否则会报错) # 一般我会使用下面这种创建方法 p.mkdir((exist_ok=True, parents=True) # 递归创建文件目录
文件详细信息(size, createtime…)
p = Path(r'd:\test\tt.txt') p.stat() # 获取详细信息 # os.stat_result(st_mode=33206, st_ino=562949953579011, st_dev=3870140380, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1525254557, st_mtime=1525254557, st_ctime=1525254557) p.stat().st_size # 文件大小 # 0 p.stat().st_ctime # 创建时间 # 1525254557.2090347 # 其他的信息也可以通过相同方式获取 p.stat().st_mtime # 修改时间
-
Python 中的异常处理,写一个简单的应用场景
def test39(): try: print("捕获异常") raise Exception("被捕获到的异常") except Exception as e: print("成功捕获到异常: %s" % e) else: print("没有异常则执行.") finally: print("无论是否异常都执行")
-
Python 中递归的最大次数,那如何突破呢?
python中为了防止无限递归造成python异常崩溃,设置了默认的最大递归次数,默认值是1000.如果超出了最大次数,则会抛出异常RecursionError: maximum recursion depth exceeded while calling a Python object
import sys sys.getrecursionlimit() # 查看最大递归次数 sys.setrecursionlimit(1500) # 设置最大递归次数
-
什么是面向对象的 mro
【理解】方法解析顺序(Method Resoluthion Order, 或MRO)
【应用】这个帖子说得挺好的
【现在新版本的MRO】python2.3之后,C3算法便是唯一用来确认新类的方法解析顺序的算法了。C3算法就是,C的线性化是C加上父类的线性化和父类列表的总和:L[SubClass(Base1, Base2, ..., BaseN)] = [SubClass] + merge(L[base1], ..., L[baseN], Base1, ..., BaseN)
这里的关键在于 merge,其输入是一组列表,按照如下方式输出一个列表:
1.检查第一个列表的头元素(如 L[B1] 的头),记作 H。
2.若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。
3.重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。
【例子】class X(object): pass class Y(object): pass class A(X, Y): pass class B(X, Y): pass class C(A, B): pass print C.__mro__
L[object] = [object] L[X] = [X, object] L[Y] = [Y, object] L[A] = [A] + merge(L[X], L[Y], [X], [Y]) = [A] + merge([X, object], [Y, object], [X], [Y]) = [A, X] + merge([object], [Y, object], [Y]) = [A, X, Y] + merge([object], [object]) = [A, X, Y, object] # 同理可以得出 L[B] = [B, Y, X, object] # 最终可得出C L[C] = [C] + merge(L[A], L[B], [A], [B]) = [C] + merge([A, X, Y, object], [B, X, Y, object], [A], [B]) = [C, A] + merge([X, Y, object], [B, X, Y, object]) = [C, A, B] + merge([X, Y, object], [X, Y, object]) = [C, A, B, X] + merge([Y, object], [Y, object]) = [C, A, B, X, Y] + merge([object], [object]) = [C, A, B, X, Y, object]
-
isinstance 作用以及应用场景?
【作用】判断对象是否为某种类。
【应用】校验参数类型时我会使用这个方法。 -
什么是断言?应用场景?
python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 -
lambda 表达式格式以及应用场景?
【格式】lambda 参数: 表达式
【应用场景】简单的,可以一行书写的代码中使用,可以简化代码。在内置方法filter()
,map()
,reduce()
中使用口感更佳. -
新式类和旧式类的区别
【分类】在python2中存在两种类,经典类和新式类,而新式类都继承于object。在python2.1之前,经典类是唯一的选择,python3之后新式类是唯一的选择,而python2.2~python2.7则可以混杂使用,但推荐使用新式类。
【区别】
1.经典类(calssic class),深度优先遍历
2.在python2.2中提出了type和class的统一,出现了一个内建类型以及自定义类的公共祖先object,即新式类(new-style class)预计算
3.python2.3之后新式类的C3算法,这是python3唯一支持的方式 -
dir()是干什么用的?
【作用】dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__()
,该方法将被调用。如果参数不包含__dir__()
,该方法将最大限度地收集参数信息
【语法】dir([object])
-
一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。
# 在包的__init__.py文件或.py文件中定义__all__属性
__all__ = ["demo1", "demo3"]
-
列举 5 个 Python 中的异常类型以及其含义
【Exception】常规异常的基类
【BaseException】所有异常的基类
【AssertionError】断言语句False
【AttributeError】对象没有这个属性
【ImportError】导入模块失败
【KeyError】映射中没有这个key
【SyntaxError】语法错误 -
copy 和 deepcopy 的区别是什么?
【copy】浅拷贝,可变类型的元素的地址是不变的,没有做拷贝。
【deepcopy】深拷贝,递归拷贝,所有的子元素都进行了拷贝。包括可变类型数据。 -
代码中经常遇到的*args, **kwargs 含义及用法。
-
Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
这些都是私有变量或私有方法
_a
单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入
__a
双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到)
__a__
双前后下划线,系统定义名字(不要自己发明这样的名字)
a__
单后置下划线,用于避免与Python关键词的冲突 -
w、a+、wb 文件写入模式的区别
-
举例 sort 和 sorted 的区别
【sort】是列表的方法,是对原列表进行排序,没有返回值。
【sorted】是内置的函数,是副本排序,返回一个排序之后的对象,原数据是不会变的。 -
什么是负索引?
负索引就是从右往左计数的索引,最右一位是-1,倒数第二为是-2,以此类推。 -
pprint 模块是干什么的?
pprint是python的内置模块,打印出来比print更美观。 -
解释一下 Python 中的赋值运算符
def test42():
a = 5
b = a # 把a的地址传给b
a += 1 # a = a + 1
a -= 1 # a = a - 1
a *= 1 # a = a * 1
a /= 1 # a = a / 1
a //= 1 # a = a // 1
a %= 1 # a = a % 1
a **= 1 # a = a ** 1
- 解释一下 Python 中的逻辑运算符
- 讲讲 Python 中的位运算符
- 在 Python 中如何使用多进制数字?
【二进制】二进制数字由0和1组成,我们使用0b或0B前缀表示二进制数,使用bin()
函数强转为二进制
【八进制】八进制数由数字0-7组成,用前缀0o或0O表示8进制数;使用oct()
函数强转八进制
【十六进制】十六进数由数字0-15组成,用前缀0x或者0X表示16进制数;使用hex()
函数强转十六进制
【十进制】正常数字,使用int()
函数转换为十进制 - 怎样声明多个变量并赋值?
a, b =1,2
面试题目来着微信公众号:GitChat
Python 爬虫面试题 170 道
以上答案皆为鄙人回答,如有问题,敬请诸君指出.
【python面试170题】系列
1. 语言特性
2. 编码规范
3. 数据类型-字符串
4. 数据类型-列表、字典
5. 数据类型-综合
6. 操作类题目
7. 高级特性、正则表达式
8. 其他内容
9. 算法和数据结构
10. 爬虫相关
11. 网络编程、并发、Git