Python面试题
python编程
*args
和**kwargs参数的含义和使用方法
*args 表示位置参数 ,会接受任意多个参数,并把这些参数作为元组传递给函数,
使用例子如下:
**kwargs 表示关键字参数,是一个字典.位置参数要放在关键字参数的前面def func(*args): for i in args: print(i) func(8,4,5,1,3)
使用例子如下:def func(**kwargs): for i in kwargs: print(i,kwargs[i]) func(a=1,b=2,c=3)
- 描述一下python2和python3的区别,比如类型检查等
python2和python3还是有很大的差别,相比来说python3更加的严谨了,比如:
(1)在类型方面python2非浮点数有long和int,但是在python3中只有int,没有长整型long
(2)python2 print是个语句,python3 print是个函数
(3)python2 range()返回一个列表,xrange()返回一个迭代器。python3里range()返回迭代器,不存在xrange
(4)而且python3中增加了许多新特性和第三方库等。比如python3.6提供了新的一种字符串格式化的方法f-Strings. - 请列常用的python library,并说明其作用基本使用示例
(1)request Python实现的简单易⽤的HTTP库
(2)virtualenv 创建Python虚拟环境的工具
(3)pip Python包和依赖关系管理工具。
(4)SQLAlchemy python数据库的管理工具
(5)IPython 非常有效、完美的python交互式,功能丰富的工具 - 描述python开发中,协程,线程,进程以及asyncio的异同,请写一个python程序在多核CPU上并行执行
python中进程是由若干个线程组成,一个进程至少有一个线程,一个线程也可以有多个协程。
进程是系统资源分配的单位,线程是CPU调度和分配的单位,进程切换需要的资源很最大,效率很低,线程切换需要的资源一般,效率一般,
协程切换任务资源很小,效率高,多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发。asyncio提供了完善的异步IO支持。import os import sys import multiprocessing def dump_file(input_dir): if not os.path.exists(input_dir): print('dir {} not exists'.format(input_dir)) return path_list = [os.path.join(input_dir, f).strip('\n') for f in os.listdir(input_dir)] file_path_list = filter(lambda file_path: os.path.isfile(file_path),path_list) for file_path in file_path_list: print('{}:{} size:{}'.format(os.getpid(), file_path,os.path.getsize(file_path))) if __name__ == '__main__': pool_size = multiprocessing.cpu_count() pool = multiprocessing.Pool(processes=pool_size,) for i in range(pool_size): if len(sys.argv) > 1: pool.apply_async(dump_file, args=(sys.argv[1],)) else: pool.apply_async(dump_file, args=(os.getcwd(),)) pool.close() pool.join()
正则表达式
- re.search和re.match的区别
re.match 检查字符串的开头是否匹配,如果字符串开头不符合正则表达式,则匹配失败,函数返回None。
re.search 匹配整个字符串,在字符串中查找第一个匹配值,然后返回,没有匹配,则返回None。 - 贪婪匹配/非贪婪匹配区别
贪婪匹配:尽可能匹配最长的字符串
非贪婪匹配:尽可能匹配最短的字符串
默认情况下匹配都是贪婪模式,如果要改成非贪婪模式,只需要量词后面加上一个问号?。 - 请用python写一个正则表达式实现如下内容的匹配,并实现数据的结构化
acb8af4a-02fb-4aa5-71ae-c3589jfabc0 AC009C 关于公司为全资子公司San Jose USA, L.L.C.申请融资提供担保的公告 2018-02-29
{
'uuid': 'acb8af4a-02fb-4aa5-71ae-c3589jfabc0',
'code': 'AC009C',
'title': '关于公司为全资子公司San Jose USA,L.L.C.申请融资提供担保的公告',
'date': '2018-02-29'
}
import re
a = 'acb8af4a-02fb-4aa5-71ae-c3589jfabc0 AC009C 关于公司为全资子公司 San Jose USA, L.L.C.申请融资提供担保的公告 2018-02-29'
ret1 = re.match('[\w]*[\W][\w]*[\W][\w]*[\W][\w]*[\W][\w]*', a)
ret2 = re.sub('[\w]*-[\w]*[\W][\w]*[\W][\w]*[\W][\w]*\s', '', a)
ret3 = re.match('\d{6}', ret2)
ret4 = re.sub('[\d]{6}\s', '', ret2)
ret5 = re.search('\d{4}-\d{2}-\d{2}', ret4)
ret6 = re.sub('\d{4}-\d{2}-\d{2}', '', ret4)
list = {}
list['uuid'] = ret1.group()
list['code'] = ret3.group()
list['title'] = ret6
list['date'] = ret5.group()
print(list)
python程序调试方法
-
某程序在运行的流程是监听网络需求,进行数据库读操作,运行相关算法,进行数据写操作,响应网络请求。如果整个处理流程很慢,该怎么进行诊断和监控
如果整个流程处理的比较慢,查看每个模块的消耗时间,根据消耗时间查看哪个模块的速度较慢,然后进行优化 -
python程序如何实现断点设置和单步调试,如何实现远程调试 (请分有IDE和没有IDE两种情况介绍)
有pycharm:
(1)设置断点:在行号后面单击,生成断点,再次单击取消断点
(2)运行调试:按”Shift+F9”,程序运行到断点前
(3)点击”Console”窗口下”Show Python Prompt”,进入可输入命令状态
(4)输入自己想查看的变量名
无IDE:
单步调试Python
在合适的地方加上 如下语句,添加端点
import pdb
pdb.set_trace()
启动程序,python -m pdb **.py 加上调试参数 -m pdb
进入调试模式后,通过如下命令进行调试(模式有点向gdb了,在命令行下操作)
l :显示当前运行到哪行代码;
n: 单步运行;
s:单步运行,如果当前行为函数调用语句,则进入函数;
p para_name :打印para_name变量值;
b line_number :在当前文件的第 line_number行设置断点;
r:返回当前函数;
c:跳到下一个端点 -
python程序如何打印当前执行的调用栈情况
traceback.print_stack()
编程问题
- 实现flatten函数完成如下的转换功能
nested_json = {
"a": 1,
"b": [35, 26],
"c": [{
"d": [2, 3, 4],
"e": [
{
"f": 1,
"g": 2
}
]
}],
"h": {}
}
flattened_json = flatten(nested_json)
print(flattened_json)
{'a': 1,
'b.0': 35,
'b.1': 26,
'c.0.d.0': 2,
'c.0.d.1': 3,
'c.0.d.2': 4,
'c.0.e.0.f': 1,
'c.0.e.0.g': 2,
'h': {}
}
- 采用python3编写代码,完成如下的排序功能:
输入:(9, 2), (3, 7), (7, 8), (3, 5), (1, 9)
输出:(1, 9), (3, 7), (3, 5), (7, 8), (9, 2)
满足:输入是二元组的列表,对这一组二元组进行排序,先按照二元组的第一个维度按照升序排序,然后按照二元组的第二个维度进行降序排列
# 获取列表的第二个元素
def getSecond(temp):
return temp[1]
# 列表
temp = [(9, 2), (3, 7), (7, 8), (3, 5), (1, 9)]
# 指定第二个元素排序
result = sorted(temp, reverse=False)
result = sorted(result,key=getSecond,reverse=True)
print('排序列表:', result)
Linux面试题
-
假设这里有一台服务器地址为192.168.0.2,开放的端口为6623,如何连接到远程服务器操作?
ssh [email protected]:6623 -
假设这里有一台服务器地址为192.168.0.2,开放的端口为6623,怎么将服务器的/opt/data的文件拷到本地目录?
scp [email protected]:/opt/data /本地目录 -
通过
python server.py
开启了某个服务,现在该服务失去响应了,请问如何找到这个进程,并杀掉。
ps -ef|grep 服务,找到进程号 kill -9 进程号 -
列出文件夹下所有json文件,并删除昨天创建的文件
find ./ -type f -name ‘*.json’ -
如何查看系统某个端口是否已经被其他程序占用
lsof -i:端口号 -
在执行Linux命令时,如果既想把输出保存到文件中,又想在屏幕上看到输出内容,该如何处理
./out | tee out.log -
git rebase命令和git merge命令有什么区别,2个命令对系统会造成什么影响。
分支合并和rebase
git merge # 将branch分支合并到当前分支
git merge origin/master --no-ff # 不要Fast-Foward合并,这样可以生成merge提交
git rebase master # 将master rebase到branch -
列举经常使用的系统监控命令,包括网络,CPU,GPU等使用情况的监控
网络监控:ethtool查看网卡带宽 netstat 检验本机各端口的网络连接情况
CPU监控:mpstat实时系统监控工具,它会报告与CPU相关的统计信息 top 系统中各个进程的资源占用状况及总体状况
GPU监控:nvidia-smi 单次查看 watch -n 10 nvidia-smi:周期性的显示GPU的情况,10 表示每10秒显示一次 -
文件系统写不入数据,初步检查发行文件系统是可写的,而且还有30%的空间没有使用,请尝试分析一下可能存在问题
最有可能是权限问题, 其次很小的概率是 inode 满了, 还有很多其他更小可能的事件, 如目录过深, 文件名过长或写指令本身的问题等等 -
如何设置定时任务,如果定时任务执行命令的结果和在命令行直接执行该命令的结果不同,请考虑可能存在什么问题
在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出。
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“cron table”的简写。
直接在命令行执行 就是在当前的shell环境下执行
比如涉及到一些环境变量的时候 必须在当前shell环境里执行,
在脚本里执行的话 脚本执行的时候 会fork一个子进程 所有操作都在子进程进行
如果涉及到一些在脚本里设置环境变量的东西 脚本结束了 环境变量也就消失了 -
pip安装程序包太慢了怎么处理,apt命令 安装程序包太慢了怎么处理
使用apt-get、pip等安装工具下载依赖包时,因为很多源都部署在国外服务器,下载速度异常缓慢,经常出现下载超时的错误,无法正常安装软件的情况,
可以用的方法有:
(1)使用代理服务器
(2)在国内找镜像服务器,这也是最简单的,将下载源更换为国内镜像源
其他:
- 请介绍一下你项目中用到的技术栈,觉得得意和出色的点,让你头疼的点以及怎么解决的
就最近的打卡助手项目中,做的新浪微博的SSO单点登录,通过研究开发者文档成功实施到项目中。开始发现每次授权时还得必须填写账户名、密码,最后经过排查发现自己登录时引入了强制登录的参数,
然后将强制登陆的参数改为forcelogin=false,虽然挺小的一个点,但当时还以为流程中哪里出了错误,找了半天。哈哈 - 请介绍一下最近看的5本书和为什么选择这5本
(1)算法图解 最近想看看算法和数据结构,把大学学的算法与数据结构的知识拾起来
(2)Flask Web开发:基于python的web应用开发实战 因为一直用的flask框架,所以看看
(3)图解HTTP 想进一步了解HTTP和web
(4)linux鸟哥的私房菜 虽然一直用Linux开发,但还是想系统的深入一下linux
(5)徐志摩诗集 这确实是最近看的,从小喜欢语文,喜欢现代诗 - 请简单描述您未来5年的规划
在以后的1-2年内,我希望自己能够在岗位上学到更多的技术与知识,不断努力,去让自己技能和职业能力得到更大的提升。3-4年,朝更加长远的路线发展,比如AI,大数据、人工智能方向或者
也可以朝全栈慢慢发展,争取以后做到架构师啊,路漫漫其修远兮。。。。。