Python工程师面试题目
1、请尽可能列举python列表的成员方法,并给出一下列表操作的答案:
len()
返回列表中的元素数量。max()
返回列表中的最大元素。最大元素的判断依据是列表中的对象类型。数字列表中的最大元素是最大的数字。字符串列表中的最大元素是按照字母顺序排序时排在最后一位的元素。因为max()
函数的定义依据是大于比较运算符。如果列表包含不同的无法比较类型的元素,则max()
的结果是 undefined。min()
返回列表中的最小元素。它是max()
函数的对立面,返回列表中的最小元素。sort()
返回一个从最小到最大排序的列表副本,并使原始列表保持不变。append()
会将元素添加到列表末尾。- reverse()反转列表中元素
- pop([index=-1])移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
- insert(index, obj)将对象插入列表
(1) a=[1, 2, 3, 4, 5], a[::2]=?, a[-2:] = ?
a[::2]=[1,3,5], a[-2:] = [4,5]
(2) 一行代码实现对列表a中的偶数位置的元素进行加3后求和?
考察map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
sum(map(lambda x:x+3, a[1::2]))
(3) 将列表a的元素顺序打乱,再对a进行排序得到列表b,然后把a和b按元素顺序构造一个字典d。
考察random.shuffle() 将序列的所有元素随机排序。考察浅拷贝和深拷贝,直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变;深拷贝是拷贝子对象,所以原始数据改变,子对象不会改变。
考察zip()函数,用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
import random
import copy
list_a = [20, 16, 10, 5,63,42,31]
random.shuffle(list_a)
print(list_a)
list_b = copy.deepcopy(list_a)
list_b.sort()
print(list_b)
d = {}
#方法一
#for i in range(len(list_a)):
# d[list_a[i]]=list_b[i]
#方法二
d=dict(zip(list_a,list_b))
print(d)
2、用python实现统计一篇英文文章内每个单词的出现频率,并返回出现频率最高的前10个单词及其出现次数,并解答以下问题?(标点符号可忽略)
(1) 创建文件对象f后,解释f的readlines和xreadlines方法的区别?
(2) 追加需求:引号内元素需要算作一个单词,如何实现?
import
sys,re
urldir
=
r
"C:\python27\a.txt"
distone
=
{}
numTen
=
[]
#先文档变成一个字典
f
=
open
(urldir,
'r'
)
for
line
in
f.readlines():
#用空格替换到所有非单词字符,\W是匹配任何非单词字符
line
=
re.sub(
'\W'
,
" "
,line)
lineone
=
line.split()
for
keyone
in
lineone:
if
not
distone.get(keyone):
distone[keyone]
=
1
else
:
distone[keyone]
+
=
1
f.close()
#整理前10出现的单词的次数
for
v
in
distone.values():
if
v
not
in
numTen:
numTen.append(v)
numTen.sort()
numTen
=
numTen[
-
10
:]
#将字典转为列表,其其实这个可以不转。直接遍历也行,之前没有想到同时出现的怎么办。
distone
=
sorted
(distone.iteritems(),key
=
lambda
d:d[
1
],reverse
=
True
)
#最后遍历,可能出现的次数一样的。
for
i
in
distone:
if
i[
1
]
in
numTen:
print
i
3、简述python GIL的概念, 以及它对python多线程的影响?
5、请回答一下问题:
(1) 阐述一下装饰器,描述符(property)、元类的概念,并列举其应用场景;
(2) 如何动态获取和设置对象的属性。
6.Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
7.介绍一下except的用法和作用?
答:try…except…except…[else…][finally…]
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。
8.Python中pass语句的作用是什么?
答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass
9.介绍一下Python下range()函数的用法?
答:列出一组数据,经常用在for in range()循环中
10.如何用Python来进行查询和替换一个文本字符串?
答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
>> import re
>>p=re.compile(‘blue|white|red’)
>>print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colourshoes
>>print(p.sub(‘colour’,'blue socks and red shoes’,count=1))
colour socks and redshoes
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
11.Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>print(re.match(‘super’, ‘insuperable’))
None
>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>print(re.search(‘super’, ‘insuperable’).span())
(2, 7)
12.用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
答:术语叫贪婪匹配( <.*> )和非贪婪匹配(<.*?> ) 贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配. 而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
源字符串:aa<div>test1</div>bb<div>test2</div>cc
正则表达式一:<div>.*</div>
匹配结果一:<div>test1</div>bb<div>test2</div>
正则表达式二:<div>.*?</div>
匹配结果二:<div>test1</div>(这里指的是一次匹配结果,所以没包括<div>test2</div>)
13.Python里面如何生成随机数?
答:random模块
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
随机实数:random.random( ):返回0到1之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数。
14.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告Pylint是另外一个工具可以进行codingstandard检查
15.如何在一个function里面设置一个全局的变量?
答:解决方法是在function的开始插入一个global声明:
def f()
global x
16.单引号,双引号,三引号的区别
答:单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释如果要表示Let’s go 这个字符串
单引号:s4 = ‘Let\’s go’
双引号:s5 = “Let’s go”
s6 = ‘I realy like“python”!’
这就是单引号和双引号都可以表示字符串的原因了
------------------------------------------------------------分割线----------------------------------------------------------------------------
1)对if __name__ == 'main'的理解陈述
__name__是当前模块名,当模块被直接运行时模块名为__main__,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行。
2)python是如何进行内存管理的?
a、对象的引用计数机制
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
b、垃圾回收
1>当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2>当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象
的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
c、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1>Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理 对小块内存的申请和释放。
2>Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用 系统的malloc。
3>对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
3)请写出一段Python代码实现删除一个list里面的重复元素
1
2
3
4
5
6
7
8
9
|
# 1.使用set函数 list = [ 1 , 3 , 4 , 5 , 51 , 2 , 3 ] set ( list ) # 2.使用字典函数, >>> a = [ 1 , 2 , 4 , 2 , 4 , 5 , 6 , 5 , 7 , 8 , 9 , 0 ] >>> b = {} >>> b = b.fromkeys(a) >>> c = list (b.keys()) >>> c |
4)Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
5)介绍一下except的用法和作用?
try…except…except…else…
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行如果存在finally语句,最后总是会执行。
6)Python中__new__与__init__方法的区别
__new__:它是创建对象时调用,会返回当前对象的一个实例,可以用__new__来实现单例
__init__:它是创建对象后调用,对当前对象的一些实例初始化,无返回值
7)常用的网络数据爬取方法
- 正则表达式
- Beautiful Soup
- Lxml
16)Linux部署服务脚本命令(包括启动和停止的shell脚本)
18)POST与 GET的区别
- GET数据传输安全性低,POST传输数据安全性高,因为参数不会被保存在浏览器历史或web服务器日志中;
- 在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用POST方式;
- GET在url中传递数据,数据信息放在请求头中;而POST请求信息放在请求体中进行传递数据;
- GET传输数据的数据量较小,只能在请求头中发送数据,而POST传输数据信息比较大,一般不受限制;
- 在执行效率来说,GET比POST好
19)什么是lambda函数?它有什么好处?
lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指点短小的回调函数
1
2
3
|
lambda [arguments]:expression >>> a = lambdax,y:x + y >>> a( 3 , 11 ) |
Python工程师面试题目的更多相关文章
- Python笔试面试题目及答案
1.is 和==的区别? is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象.是否指向同一个内存地址 == : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法 ...
- C/C++面试题目一
C/C++开发工程师面试题目(一)(附答案分析) 推荐:自己根据在面试中碰到做过的一些题目以及总结的题目,希望对面试的同学有所帮助. 一. 选择题 1. 下列类中( )不是输入输出流类iostrea ...
- 珍藏版 Python 开发工程师面试试题
珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...
- 去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4
今天的面试题以基础为主,去面试Python工程师,这几个基础问题不能答错 第1题:列表和元组有什么不同? 列表和元组是Python中最常用的两种数据结构,字典是第三种. 相同点: 都是序列 都可以存储 ...
- 大厂0距离:网易 Linux 运维工程师面试真题,内含答案
作为 Linux 运维工程师,进入大公司是开启职业新起点的关键,今天马哥 linux 运维及云计算智囊团的小伙伴特别分享了其在网易面试 Linux 运维及云计算工程师的题目和经历,希望对广大 Linu ...
- PHP面试题目搜集
搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...
- .NET工程师面试宝典
.Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...
- 开发工程师面试的秘密( 整理自 Export C Programming )
开发工程师面试的秘密 因为打算转战linux平台,所以一直在配置自己喜欢的linux操作系统.同时在看那本<C 专家编程>,这本书主要是针对ANSI C 介绍的,所以和Linux(Unix ...
- 2016年Web前端面试题目汇总
转载: 2016年Web前端面试题目汇总 以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢 ...
随机推荐
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...
- PHP使用iconv函数遍历数组转换字符集
/** * 字符串/二维数组/多维数组编码转换 * @param string $in_charset * @param string $out_charset * @param mixed $dat ...
- [转]EntityFramework之领域驱动设计实践
本文转自:http://www.cnblogs.com/daxnet/archive/2010/11/02/1867392.html Entity Framework之领域驱动设计实践 EntityF ...
- 数字(number)
数字(number) Time Limit:2000ms Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...
- 协程和I/O模型
1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切换,整个线程都阻塞在原地 该线程内的其他的任 ...
- poj3436 Computer Factory
题意: 电脑公司生产电脑有N个机器,每个机器单位时间产量为Qi. 电脑由P个部件组成,每个机器工作时只能把有某些部件的半成品电脑(或什么都没有的空电脑)变成有另一些部件的半成品电脑或完整电脑(也可能移 ...
- nodejs中相互引用(循环引用)的模块分析
话不多少,直接上源码吧: modA.js: module.exports.test = 'A'; const modB = require('./05_modB'); console.log( 'mo ...
- Apache CXF 框架结构和基本原理
CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成: 1.Bus 它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n g的Applicat ...
- 《Python基础教程》 读书笔记 第六章 抽象 函数 参数
6.1创建函数 函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> x=1 ...
- Codeforces GYM 100741A . Queries
time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input output stan ...