无笔试的情况下,准备python相关基础知识面试
在面试时造航母,工作时仅是拧螺丝的就业大背景下,现在的招聘测试都要求代码能力,但是却总是一件让我很难以理解的事情,要求会写代码,却没有笔试环节,我着实有点懵逼。考察什么?如何考察?
但作为弱势群体的求职者,还是需要准备呀,思来想去,估计会问一些原理性的东西多一点。
关于无笔试的python相关知识。小白我就罗列总结几点吧:
一、基础一点的:
1、数据类型: 哪些是可变类型,哪些是不可变类型?
回答: 列表、字典、集合是可变类型
字符串、元组、冰冻集合是不可变类型。
2、函数重载: python是否支持函数重载?
回答: 函数重载是函数名称相同,调用函数时,可以根据函数参数的个数不同,或者参数的数据类型不同,区别调用不同的函数。
Python是不支持函数重载的,因为定义函数时不需要指定参数类型,同时python支持可变参数传参(*arg和**kw),因此无法通过参数的个数或类型去区别调用。
PS:Java是支持函数重载的。
3、深浅拷贝:
回答: a、浅拷贝copy.copy对于列表中的可变元素前后是共用一个内存地址,是互相影响的
b、深拷贝copy.deepcopy()对于列表中的可变元素是新生成的地址,是相互不影响的
4、python的六大剑客的功能及用法:
1)、lambda
2)、map
3)、filter
4)、reduce
5)、推导列表
6)、切片
5、讲一讲冒泡排序思想、过程?
冒泡的思想:两两比较,交换排序。
通用版冒泡,是稳定的排序算法,时间复杂度是(n-1)的平方
def my_sort(arr):
for i in range(len(arr) - 1):
for j in range(len(arr)-1-i):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
改进版的冒泡:
def my_sort(arr):
for i in range(len(arr) - 1):
flag = 0
for j in range(len(arr)-1-i):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
flag = 1
if not flag:
break
return arr
二、深一点的:
1、设计单例,写一种单例设计的方法:
2、装饰器的功能与原理?
功能:在不改变原有函数的基础上,给函数增加一些通用的功能,核心是一个闭包函数。
闭包的原理:将内部的函数和函数中使用的外层函数变量打个包一起返回
如下:是最简单的一个装饰器
实现功能:额外统计函数/方式的执行消耗的时间
import time
def deco(xxx):
def func():
print("执行目标方法前,先记录当前时间")
t1 = time.time()
xxx() # 正在执行目标方法
t2 = time.time()
print("执行完目标方法后,再记录当前时间")
print("目标方法执行耗时为%s"%(t2-t1))
return func
@deco
def myfunc():
print("正在执行目标方法")
i = 0
while i < 10000000:
i += 1
最终执行结果如下:
>>> myfunc()
执行目标方法前,先记录当前时间
正在执行目标方法
执行完目标方法后,再记录当前时间
目标方法执行耗时为0.7656149864196777
3、爬虫的原理与实现步骤?
PS:有些XXX自己不懂代码,但经常听到爬虫这个词,觉得很高大上,喜欢装X问这个。或者有些项目偏数据分析的,也可能会问。
基本原理:
爬虫是 模拟用户在浏览器或者App应用上的操作,把操作的过程、实现自动化的程序。由以下4个基本流程。
(1)、发起请求
通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应
(2)、获取响应
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型
(3)、解析响应
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理
(4)、保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
总体也可以分成三步:请求、分析、存储。
请求库:实现 HTTP 请求操作
urllib:一系列用于操作URL的功能。
requests:基于 urllib 编写的,阻塞式 HTTP 请求库,发出一个请求,一直等待服务器响应后,程序才能进行下一步处理。
selenium:自动化测试工具。一个调用浏览器的 driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
aiohttp:基于 asyncio 实现的 HTTP 框架。异步操作借助于 async/await 关键字,使用异步库进行数据抓取,可以大大提高效率。
分析库:从网页中提取信息
beautifulsoup:html 和 XML 的解析,从网页中提取信息,同时拥有强大的API和多样解析方式。
pyquery:jQuery 的 Python 实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好。
lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
tesserocr:一个 OCR 库,在遇到验证码(图形验证码为主)的时候,可直接用 OCR 进行识别。
存储库: Python 与数据库交互
pymysql:一个纯 Python 实现的 MySQL 客户端操作库。
pymongo:一个用于直接连接 mongodb 数据库进行查询操作的库。
redisdump:一个用于 redis 数据导入/导出的工具。基于 ruby 实现的,因此使用它,需要先安装 Ruby。
4、先讲冒泡,再问如何优化?(增加状态码,或者采用鸡尾酒算法优化)
答案上面有,此处略
5、快速排序的思想?
快排思想:分治+递归的思想
def mysort(arr):
n = len(arr)
if n < 2:
return arr
pos = arr[0]
left = [i for i in arr[1:] if i <= pos]
right = [i for i in arr[1:] if i > pos]
return mysort(left) + [pos] + mysort(right)
if __name__ == "__main__":
my_sort([3,2,4,6,1,5])
6、二分法查找的思想?
思想:折半查找的思想
前提:基于有序序列
def my_search(arr,target):
first = 0
last=len(arr)-1
while first <= last:
index = (first+last)//2
# 中间值大于目标,说明目标在列表左侧,此时需要移动往左边移动last
if arr[index] > target:
last =index - 1
# 中间值小于目标,说明目标在列表右侧,此时需要移动往右边移动first
elif arr[index] < target:
first =index + 1
else: #只有正好相等时,才表明目标值找到了
return 1
# 循环完后,无返回,则最终返回False,没有找到
return 0
if __name__ == "__main__":
my_search([1,2,3,4,5,6],3)
my_search([1,2,3,4,5,6],0)
7、其他某种排序算法的原理?(没有笔试,基本不太可能问这个)
8、多进程,多线程编程?(没有笔试,基本不太可能问这个)
答案后续补充,太晚了,睡觉。