说实话,都9012了,还在用这种背题式的方法来考核程序员,实在太不切合程序员的实际工作了……
**文末给出了一种更极客的考核方式,Talk is cheap,Show me the code(写代码,憋bb) —— 写得出工作代码,就说明你有工作能力;写不出,书背的再溜也不行 。
面试官只需要:节选一段工作代码,然后把原有代码删除,让面试者自己写代码实现;或是保留一段有bug的代码,让面试者修改即可 —— 这都是最常见的程序员工作场景,最能考核面试者的真实代码能力;而且题目随处可见,扒一下你的产品代码就能找到。
不用付出10个下午尴尬而不失礼貌的微笑,招聘的效率、准确率、靠谱程度都会更高,面试者和面试官也都会更省心,相信更多企业能发现这个系统的价值。
(正题开始:精选自个大公司经典面试题,版权归原作者所有。)
1. Python 的特点和优点是什么?
答案:太长,略
2. 什么是lambda函数?它有什么好处?
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。 lambda 函数不能包含命令,它们所包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。
lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:
>>> g = lambda x, y: xy*
>>> g(3,4)
12
>>> g = lambda x, y=0, z=0: x+y+z
>>> g(1)
1
>>> g(3, 4, 7)
14
也能够直接使用lambda函数,不把它赋值给变量:
>>> (lambdax,y=0,z=0:x+y+z)(3,5,6)
14
如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。
3. 深拷贝和浅拷贝的区别是什么?
深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中,我们使用 deepcopy()函数进行深拷贝,使用方法如下:
>>> import copy
>>> b=copy.deepcopy(a)
浅拷贝是将对象的引用复制给另一个对象。因此,如果我们在副本中进行更改,则会影响原对象。使用 copy()函数进行浅拷贝,使用方法如下:
>>> b=copy.copy(a)
4. Python异常处理的用法和作用
- 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。
- 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
- try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
- 如果存在finally语句,最后总是会执行。
5. 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):返回指定范围内的浮点数
6. 如何在Python中实现多线程?
**a. **Python有一个multi-threading包,但是如果你想让multi-thread加速你的代码,那么使用它通常不是一个好主意。
b. Python有一个名为GlobalInterpreter Lock(GIL)的结构。 GIL确保只有一个“线程”可以在任何时候执行。一个线程获取GIL,做一点工作,然后将GIL传递到下一个线程。
c. 这种情况很快发生,因此对于人眼看来,您的线程似乎并行执行,但它们实际上只是轮流使用相同的CPU核心。
d. 所有这些GIL传递都增加了执行的开销。这意味着如果您想让代码运行得更快,那么使用线程包通常不是一个好主意。
7. 如何在python中使用三元运算符?
三元运算符是用于显示条件语句的运算符。这包含用于评估为true或false值的语句。
句法:三元操作符语法如下,
[on_true] if [expression] else [on_false]
例:
x,y = 25,50
big = x if x < y else y
如果x <y为真,则返回值为big= x,如果不正确则返回big = y作为结果。
8. 用一个例子解释Python中的继承。
继承允许一个类获得另一个类的所有成员(比如属性和方法)。继承提供代码可重用性,使创建和维护应用程序变得更容易。我们继承的类称为super-class,继承的类称为派生/子类。
以下是Python支持的不同类型的继承:
**a. **单一继承 - 派生类获取单个超类的成员。
b. Multi-level继承 - 从基类base1继承的派生类d1,d2继承自base2。
c. 分层继承 - 从一个基类可以继承任意数量的子类
d. 多重继承 - 派生类从多个基类继承。
9. 解释Flask是什么及其好处?
Flask是基于“Werkzeug,Jinja2和良好意图”BSD许可证的Python网络微框架。 Werkzeug和Jinja2是它的两个依赖项。这意味着它对外部库几乎没有依赖性。它使框架变得轻盈,只是少量依赖于更新和更少的安全性错误。
会话基本上允许您记住从一个请求到另一个请求的信息。在flask中,会话使用签名的cookie,以便用户可以查看会话内容并进行修改。当且仅当有密钥Flask.secret_key,用户可以修改会话。
10. Python中的字典是什么?
Python中的内置数据类型称为字典。它定义了键和值之间的one-to-one关系。字典包含一对键及其对应的值。字典由键来索引。
我们来举个例子:
以下示例包含一些键,Country, Capital & PM,它们的相应值分别是印度,德里和莫迪。
dict={‘Country’:‘India’,‘Capital’:‘Delhi’,‘PM’:‘Modi’}
print dict[Country]
India
print dict[Capital]
Delhi
print dict[PM]
Modi
11. 什么是负指数,为什么使用它们?
Python中的序列是索引的,它由正数和负数组成。正的数字使用’0’作为第一个索引,'1’作为第二个索引,以此类推。
负数的索引从’-1’开始,表示序列中的最后一个索引,’ - 2’作为倒数第二个索引,依次类推。
12. 如何用Python来进行查询和替换一个文本字符串?
可以使用sub()方法来进行查询和替换,sub方法的格式为:
a. sub(replacement, string[,count=0])
b. replacement是被替换成的文本
c. string是需要被替换的文本
d. count是一个可选参数,指最大被替换的数量
13. 解释一下python的and-or语法
与C表达式 bool ? a : b类似,但是bool and a or b,当 a 为假时,不会象C表达式 bool ? a : b 一样工作
应该将 and-or 技巧封装成一个函数:
defchoose(bool, a,b):return(booland[a]or[b])[0]
因为 [a] 是一个非空列表,它永远不会为假。甚至 a 是 0 或 ‘’ 或其它假值,列表[a]为真,因为它有一个元素。
14. 请写出一段Python代码实现删除一个list里面的重复元素
1,使用set函数,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
15. 单引号,双引号,三引号的区别?
单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释
如果要表示Let’s go 这个字符串
单引号:s4 = ‘Let\’s go’
**双引号:**s5 = “