标签分类 技术文章:
当前位置:首页 > Python技术文章 > 分享7道Python开发工程师面试题

精选Python开发工程师面试题

  • 发布时间:
  • 作者:码农之家原创
  • 点击:202

这篇文章主要知识点是关于Python、开发工程师、面试题、Python 面试中 8 个必考问题 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Selenium3自动化测试实战:基于Python语言
  • 类型:Selenium3大小:99.55 MB格式:PDF出版:电子工业出版社作者:虫师
立即下载

更多Python相关的学习资源可以参阅 Python电子书程序设计电子书 等栏目。

分享7道Python开发工程师面试题

你知道吗?实际上Python早在20世纪90年代初就已经诞生,可是火爆时间却并不长,就小编本人来说,也是前几年才了解到它。据统计,目前Python开发人员的薪资待遇为10K以上,这样的诱惑很难让人拒绝,所以这几年使得许多人纷纷学习Python。

 

分享7道Python开发工程师面试题

Python 是一种解释型脚本语言,注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,它的这两个优势让其在开发者中大受欢迎,同时在运维领域也被大量运用到自动化运维场景中。如今使用到Python的领域非常广泛,主要有人工智能、图形处理、数据库编程、网络编程、Web编程、多媒体应用等等。话说现在为什么那么多公司在招聘Python开发者呢?其主要原因是Python的各种优势领各大企业公司开始使用Python开发,这就造成了Python开发人才的紧缺,相应的Python开发人员的薪资待遇也在增高。下面就来给大家分享一波相关的面试题:

NO.1Python内建数据类型有哪些?

整型--int 布尔型--bool

字符串--str 列表--list

元组--tuple 字典--dict

NO.2Python2和Python3的range(100)的区别是什么?

python2返回列表,python3返回迭代器,节约内存

NO.3简述面向对象中__new__和__init__的区别?

__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数

1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别

2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

NO.4请说出python中生成随机整数、随机小数、0--1之间小数的方法?

随机整数:random.randint(a,b),生成区间内的整数

随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数

0-1随机小数:random.random(),括号中不传参

分享7道Python开发工程师面试题

NO.5避免转义给字符串加哪个字母表示原始字符串?

r , 表示需要原始字符串,不转义特殊字符

python中断言方法举例

assert()方法,断言成功,则程序继续执行,断言失败,则程序报错

NO.6一句话解释什么样的语言能够用装饰器?

函数可以作为参数传递的语言,可以使用装饰器

NO.7简要说明with方法打开处理文件帮我们做了什么?

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open

写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

以上就是小编今天整理的面试题分享,大家是否都了解呢?不知道的小伙伴好好在仔细研究研究,勤下功夫多加练习,让自己的Python编程技术更加出色,这样无论面试官出怎样刁难的题目,对你而言不就是小菜一碟,让我们撸起袖子加油干!

以上就是分享7道Python开发工程师面试题的详细内容,更多请关注码农之家其它相关文章!

Python 面试中 8 个必考问题

1、下面这段代码的输出结果是什么?请解释。

def extendList(val, list=[]):
  list.append(val)
  return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

怎样修改extendList的定义能够产生以下预期的行为?

上面代码输出结果将是:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

很多人都会误认为list1=[10],list3=[‘a'],因为他们以为每次extendList被调用时,列表参数的默认值都将被设置为[].但实际上的情况是,新的默认列表只在函数被定义的那一刻创建一次。

当extendList被没有指定特定参数list调用时,这组list的值随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。因此list1和list3是在同一个默认列表上进行操作(计算)的。而list2是在一个分离的列表上进行操作(计算)的。(通过传递一个自有的空列表作为列表参数的数值)。

extendList的定义可以作如下修改。

尽管,创建一个新的列表,没有特定的列表参数。

下面这段代码可能能够产生想要的结果。

def extendList(val, list=None):
 if list is None:
  list = []
 list.append(val)
 return list

通过上面的修改,输出结果将变成:

list1 = [10]
list2 = [123]
list3 = ['a']

2、下面这段代码的输出结果将是什么?请解释。

def multipliers():
 return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]

你如何修改上面的multipliers的定义产生想要的结果?

上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6])。

上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。碰巧的是,《The Hitchhiker's Guide to Python》也指出,在与lambdas函数相关也有一个被广泛被误解的知识点,不过跟这个case不一样。由lambda表达式创造的函数没有什么特殊的地方,它其实是和def创造的函数式一样的。

下面是解决这一问题的一些方法。

一种解决方法就是用Python生成器。

def multipliers():
 for i in range(4): yield lambda x : i * x

另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。

def multipliers():
 return [lambda x, i=i : i * x for i in range(4)]

还有种替代的方案是,使用偏函数:

from functools import partial
from operator import mul
def multipliers():
 return [partial(mul, i) for i in range(4)]

3、下面这段代码的输出结果将是什么?请解释。

class Parent(object):
  x = 1
class Child1(Parent):
  pass
class Child2(Parent):
  pass
print Parent.x, Child1.x, Child2.x
Child1.x = 2
print Parent.x, Child1.x, Child2.x
Parent.x = 3
print Parent.x, Child1.x, Child2.x

输出结果将是:

1 1 1
1 2 1
3 2 3

让很多人困惑或惊讶的是最后一行输出为什么是3 2 3 而不是 3 2 1.为什么在改变parent.x的同时也改变了child2.x的值?但与此同时没有改变Child1.x的值?

此答案的关键是,在Python中,类变量在内部是以字典的形式进行传递。

如果一个变量名没有在当前类下的字典中发现。则在更高级的类(如它的父类)中尽心搜索直到引用的变量名被找到。(如果引用变量名在自身类和更高级类中没有找到,将会引发一个属性错误。)

因此,在父类中设定x = 1,让变量x类(带有值1)能够在其类和其子类中被引用到。这就是为什么第一个打印语句输出结果是1 1 1

因此,如果它的任何一个子类被覆写了值(例如说,当我们执行语句Child1.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是1 2 1

最终,如果这个值在父类中进行了修改,(例如说,当我们执行语句Parent.x = 3),这个改变将会影响那些还没有覆写子类的值(在这个例子中就是Child2)这就是为什么第三打印语句输出结果是3 2 3

4、下面这段代码在Python2下输出结果将是什么?请解释。

def div1(x,y):
  print "%s/%s = %s" % (x, y, x/y)
def div2(x,y):
  print "%s//%s = %s" % (x, y, x//y)
div1(5,2)
div1(5.,2)
div2(5,2)
div2(5.,2.)

在Python3下结果会有怎样的不同?(当然,假设上述打印语句被转换成Python3的语法)

在Python2中,上述代码输出将是

5/2 = 2
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

默认情况下,Python 2 自动执行整形计算如果两者都是整数。因此,5/2 结果是2,而5./2结果是2.5

注意,在Python2中,你可以通过增加以下引用来覆写这个行为。

from future import division

同时要注意的是,//操作符将总是执行整形除法,不管操作符的类型。这就是为什么即使在Python 2中5.0//2.0的结果是2.0。然而在Python3中,没有此类特性,

例如,在两端都是整形的情况下,它不会执行整形除法

因此,在Python3中,将会是如下结果:

5/2 = 2.5
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

注: 在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如 10 // 3 其结果就为 3,余数会被截除掉,而 (-7) // 3 的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一样)

5、下面代码的输出结果将是什么?

list = ['a', 'b', 'c', 'd', 'e']
print list[10:]

下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。

例如,尝试获取list[10]和之后的成员,会导致IndexError.

然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。

这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致bug很难被追踪到。

6、考虑下列代码片段:

list = [ [ ] ] * 5
list # output?
list[0].append(10)
list # output?
list[1].append(20)
list # output?
list.append(30)
list # output?

2,4,6,8行将输出什么结果?试解释。

输出的结果如下:

[[], [], [], [], []]
[[10], [10], [10], [10], [10]]
[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]
[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30]

解释如下:

第一行的输出结果直觉上很容易理解,例如 list = [ [ ] ] * 5 就是简单的创造了5个空列表。然而,理解表达式list=[ [ ] ] * 5的关键一点是它不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们才能更好的理解接下来的输出结果。

list[0].append(10) 将10附加在第一个列表上。

但由于所有5个列表是引用的同一个列表,所以这个结果将是:

[[10], [10], [10], [10], [10]]

同理,list[1].append(20)将20附加在第二个列表上。但同样由于5个列表是引用的同一个列表,所以输出结果现在是:

[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]

作为对比, list.append(30)是将整个新的元素附加在外列表上,因此产生的结果是: [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30].

7、Given a list of N numbers。

给定一个含有N个数字的列表。

使用单一的列表生成式来产生一个新的列表,该列表只包含满足以下条件的值:

(a)偶数值

(b)元素为原始列表中偶数切片。

例如,如果list[2]包含的值是偶数。那么这个值应该被包含在新的列表当中。因为这个数字同时在原始列表的偶数序列(2为偶数)上。然而,如果list[3]包含一个偶数,

那个数字不应该被包含在新的列表当中,因为它在原始列表的奇数序列上。

对此问题的简单解决方法如下:

[x for x in list[::2] if x%2 == 0]

例如,给定列表如下:

list = [ 1 , 3 , 5 , 8 , 10 , 13 , 18 , 36 , 78 ]

列表生成式[x for x in list[::2] if x%2 == 0] 的结果是,

[10, 18, 78]

这个表达式工作的步骤是,第一步取出偶数切片的数字,

第二步剔除其中所有奇数。

8、给定以下字典的子类,下面的代码能够运行么?为什么?

class DefaultDict(dict):
 def __missing__(self, key):
  return []
d = DefaultDict()
d['florp'] = 127

能够运行。

当key缺失时,执行DefaultDict类,字典的实例将自动实例化这个数列。

总结

以上所述是小编给大家介绍的Python 面试中 8 个必考问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到如何由java转学python、 python ddt数据驱动实例代码、 python测试opencv时imread导致、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:python识别爬虫的实例方法

下一篇:python创建模块的方法总结

展开 +

收起 -

学习笔记
网友NO.217114

python爬虫面试宝典(常见问题)

是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访问资源时在空闲等待时同时访问其他资源,实现多线程机制 是否了解网络的同步和异步? 同步:提交请求-等待服务器处理-处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发-服务器处理(这是浏览器仍然可以作其他事情)-处理完毕 链表和顺序表储存时各自有什么优点? 1.顺序表存储 原理:顺序表存储是将数据元素放到一块连续的内存存储空间,存取效率高,速度快。但是不可以动态增加长度 优点:存取速度高效,通过下标来直接存储 缺点:1.插入和删除比较慢,2.不可以增长长度 比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序 2.链表存储 原理:链表存储是在程序运行过程中动态的分配空间,只要存储器还有空间,就不会发生存储溢出问题 优点:插入和删除速度快,保留原有的物理顺序,比如:插入或者删除一个元素时,只需要改变指针指向即可 缺点:查找速度慢,因为查找时,需要循环链表访问 使用redis搭建分布式系统时如何处理网络延迟和网络异常? 由于网络异常的存在,分布式系统中请求结果存在“三态”的概念,即三种状态:“……

网友NO.718557

(全面)python面试题的经典示例总结

本篇文章给大家带来的内容是关于(全面)python面试题的经典示例总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、Python如何实现单例模式? Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式: 1、 class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance = Nonedef __call__(cls, *args, **kw):if cls.instance is None:cls.instance = super(Singleton, cls).__call__(*args, **kw)return cls.instanceclass MyClass(object):__metaclass__ = Singletonprint MyClass()print MyClass() 使用decorator来实现单例模式 def singleton(cls):instances = {}def getinstance():if cls not in instances:instances[cls] = cls()return instances[cls]return getinstance@singletonclass MyClass:… 2:什么是lambda函数? Python允许你定义一种单行的小函数。定义lambda函数的形式如下:labmda 参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个: g = lambda x, y: x*y g(3,4)12 g = lambda x, y=0, z=0: x+y+z g(1)1 g(3, 4, 7)14 也能够直接使用lambda函数,不把它赋值给变量: (lambda x,y=0,z=0:x+y+z)(3,5,6)14 如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函……

网友NO.702600

python面试题之列表声明实例分析

本文实例讲述了python面试题之列表声明。分享给大家供大家参考,具体如下: 下面程序输出的结果为? val = [['a']*2]*2print valval[0][1]='b'print val 答案为: [['a', 'a'], ['a', 'a']] [['a', 'b'], ['a', 'b']] 而不是 [['a', 'a'], ['a', 'a']] [['a', 'b'], ['a', 'a']] 请看下面的例子: val = ['a']*2 #或者直接声明val = ['a','a']print valprint id(val)print id(val[0])print id(val[1]) 输出的结果为 ['a', 'a'] 39993928 38858384 38858384 可以看到val中的两个'a'是指向的同一个地址: 再看下面的代码: 直接声明的话,不会改变后面的'a' val = [['a','a'],['a','a']]print valprint id(val)print id(val[0][0])print id(val[1][0])val[0][0] = 'b'print valprint id(val)print id(val[0][0])print id(val[1][0]) 结果为: [['a', 'a'], ['a', 'a']] 39405512 38268560 38268560 [['b', 'a'], ['a', 'a']] 39405512 38390280 38268560 而 val = [['a','a']]*2print valprint id(val)print id(val[0][0])print id(val[1][0])val[0][0] = 'b'print valprint id(val)print id(val[0][0])print id(val[1][0]) 结果为: [['a', 'a'], ['a', 'a']] 40388552 39251600 39251600 [['b', 'a'], ['b', 'a']] 40388552 39373320 39373320 更多Python相关内容感兴趣的读者可查看本站专题:《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《……

网友NO.928149

python正则表达式面试题解答

三道python正则表达式面试题,具体如下 1.去除以下html文件中的标签,只显示文本信息。 divp岗位职责:/pp完成推荐算法、数据统计、接口、后台等服务器端相关工作/ppbr/pp必备要求:/pp良好的自我驱动力和职业素养,工作积极主动、结果导向/ppbr/pp技术要求:/pp1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式/pp2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架/pp3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种br/pp4、掌握NoSQL、MQ,熟练使用对应技术解决方案/pp5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js/ppbr/pp加分项:/pp大数据,数理统计,机器学习,sklearn,高性能,大并发。/p/div 利用python正则表达式re模块中的sub方法,将标签替换为空字符串,代码如下: #-*- coding:utf-8 -*-import re#去除标签s = "div\p岗位职责:/p\p完成推荐算法、数据统计、接口、后台等服务器端相关工作/p\pbr/p\p必备要求:/p\p良好的自我驱动力和职业素养,工作积极主动、结果导向/p\pbr/p\p技术要求:/p\p1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式/p\p2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架/p\p3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种br……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明