Python实习遇见的各种⾯试题
Python 语法
说说你平时 Python 都⽤哪些库
==和is区别。
==是⽐较两对象的值,is是⽐较在内存中的地址(id),is相当于id(objx) == id(objy)。
深拷贝和浅拷贝。
# 浅拷贝操作只会拷贝被拷贝对象的第⼀层对象,对于更深层级的只不过是拷贝其引⽤,如下例中 `a[2]`
# 和 `lst[2]` 这两个对象为第⼆层,实际上浅拷贝之后,这两个还是⼀个对象。深拷贝会完全的拷贝被拷
# 贝对象的所有层级对象,也就是⼀个真正意义上的拷贝。
>>> from copy import copy, deepcopy
>>> lst = [1, 2, [3, 4]]
>>> a, b = copy(lst), deepcopy(lst)
>>> a, b
([1, 2, [3, 4]], [1, 2, [3, 4]])
>>> id(lst[2]), id(a[2]), id(b[2])
(139842737414224, 139842737414224, 139842737414584)
>>> lst[0] = 10
>>> a
[1, 2, [3, 4]]
>>> b
[1, 2, [3, 4]]
>>> lst[2][0] = 'test'
>>> lst
[10, 2, ['test', 4]]
>>> a
[1, 2, ['test', 4]]
>>> b
[1, 2, [3, 4]]
__init__和__new__。
__init__只是单纯的对实例进⾏某些属性的初始化,以及执⾏⼀些需要在新建对象时的必要⾃定义操作,⽆返回值。⽽__new__返回的是⽤户创建的实例,这个才是真正⽤来创建实例的,所以__new__是在__init__之前执⾏的,先创建再初始化。
Python 2 和 Python 3 有哪些区别?
lz 当时只是简单的说了⼏点:
Python2 和 Python3 的默认字符串不⼀样,Python3 默认为 Unicode 形式。
raw_input(), input()
捕捉异常/错误的写法,Python2 除了后⾯的写法还⽀持:except Exception, e,⽽ Python3 只⽀持except Exception as e
Python3 中没有了xrange,⽽使⽤range代替它,在 Python3 中,range返回的是⼀个可迭代对象,⽽不是 Python2 那样直
接返回列表。
Python3 中map如果需要⽴即执⾏必须以list(map())这样的⽅式。
Python3 中,print改成了函数,⽽在 Python2 中,print是⼀个关键字。使⽤上有所差异。
Python3 中,3/2 == 1.5;Python2 中,3/2 == 1。
上⾯知识列了⼏点⽐较常见的,这⾥有⼀篇 sebastianraschka/Articles/2014_python_2_3_key_diff.html 写的详
细写。
连接字符串都有哪些⽅式?
格式化字符连接(%s)
format
join
+
如何判断某个对象是什么类型?
type(obj)
isinstance(obj)
⽣成器是什么?
⼀⾔难尽,推荐看这个
Python 中的 GIL 是什么?全称?举个例⼦说说其具体体现。
GIL 全称 Global Interpreter Lock(全局解释器锁),任何 Python 线程执⾏前,必须先获得 GIL 锁,然后,每执⾏100条字节
码,解释器就⾃动释放GIL锁,让别的线程有机会执⾏。要避免这种“现象”利⽤操作系统的多核优势可以有下⾯⼏种⽅法:使⽤ C 语⾔编写扩展,创建原⽣线程,摆脱 GIL,但是即使是扩展,在 Python 代码内,任意⼀条Python 代码还是会有
GIL 限制
使⽤多进程代替多线程,使⽤多进程时,每个进程都有⾃⼰的 GIL。故不存在进程与进程之间的 GIL 限制。但是多进程不
能共享内存。
s = 'abcd', s[2] = 'e'运⾏结果是什么?
报错,字符串是不可变对象
Python 中,sorted函数内部是什么算法?
在⾥⾯有提到,⽤的是算法
编码是⼀个什么样的过程?
编码是⼆进制到字符的过程
Python ⾥⾯怎么实现协程?
lz 当时也就简单说了下可以⽤ yield 关键字实现,举了个⼩例⼦,还说了⽤户控制调度,加上⼀些第三⽅框架,Gevent,tornado 之类的,可怜。这⾥安利⼀下的⼀篇⽂章
requests包新建⼀个session再get和普通的有什么区别?(tcp长连接)
维持⼀个会话,** 建⽴⼀个tcp长连接** ,cookie ⾃动保存,下次请求还是⼀个会话。
Python 都有哪些数据结构?可变对象,不可变对象分别有哪些?
可变对象:列表,字典
字符串,数字,元组,集合
在 Python 内,函数传参是引⽤传递还是值传递?
引⽤传递。
你会对你的项⽬写测试么?⽤哪些⽅法哪些库?
只说了⽤ 需要⾃⾏寻答案。
请新建⼀个只有⼀个元素1的列表和元组。
lst = [1]
tup = (1,)
函数默认参数是可变对象情况。
>>> def foo(a, b=[1, 2]):
print(b)
b.append(a)
print(b)
>>> val = 4
>>> foo(val)
# [1, 2]
# [1, 2, 4]
>>> foo(val)
# [1, 2, 4]
# [1, 2, 4, 4]
# 这⾥可以看到,第⼆次执⾏函数时,默认参数 b 的值已经变成 `[1, 2, 4]` 了,原因是,默认参数只在第
# ⼀次执⾏时会进⾏初始化,后⾯就默认使⽤ **初始化后的这个对象(引⽤)**,但是这⾥ b 是可变对象,
#添加了⼀个元素还是之前的对象,所以,引⽤没变,不过是值变了⽽已。
Flask 的 Route 是怎么实现的?你认为 Flask 框架有什么优缺点?
实际上在 Flask 类⾥⾯,route可以简单理解为不过是把对应的路由规则作为键,装饰的视图函数作为值,存
到uting.Map对象(可以看成是和字典类似的数据结构)⾥。这⾥是,好理解些。这是之前写的⼀篇
Flask 优点是轻量,灵活,可⾼度定制,插件化。缺点也是过于轻量,功能必须通过第三⽅插件实现,插件质量参差不齐,也不能完全保证后期维护。
这⼏点都只是个⼈之见,更详细标准的还需⾃⾏寻答案。
WSGI 是什么?uWSGI, nginx 这些都是什么⽤途?
这⾥有的解释,WSGI 就是⼀个通⽤的标准,遵守这个标准,我们能让我们的 Web 框架更加通⽤,编写更加简单。
uwsgi 和 Nginx 都是 Web Server,不同的是 Nginx 负责外⽹请求 ---(转换)--> 内⽹请求,uwsgi 负责的是内⽹请求 -> Python
Web 程序。
二叉树的遍历pythonnginx 和 Apache 的区别?(参考 )
nginx 相对 apache 的优点:
轻量级,同样起web 服务,⽐apache 占⽤更少的内存及资源
抗并发,nginx 处理请求是异步⾮阻塞的,⽀持更多的并发连接,⽽apache 则是阻塞型的,在⾼并发下nginx 能保持低资
源低消耗⾼性能
配置简洁
⾼度模块化的设计,编写模块相对简单
社区活跃
apache 相对nginx 的优点:
rewrite ,⽐nginx 的rewrite 强⼤
模块超多,基本想到的都可以到
少bug ,nginx 的bug 相对较多
超稳定
你部署 Python 项⽬时⽤的是 uWSGI 的哪个模式?
默认模式
这个应该问的可能性极⼩了,可翻阅查更详细的资料
数据结构,算法
层次遍历⼆叉树⽤什么⽅法?
# coding: utf-8
from collections import deque
class BNode:
""" ⼆叉树节点 """
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def level_traverse(binary_tree):
""" 层次遍历⼆叉树 """
stack = deque([binary_tree])
while stack:
top = stack.popleft()
print(top.value)
if top.left:
stack.append(top.left)
if top.right:
stack.append(top.right)
if __name__ == "__main__":
b_tree = BNode(1, BNode(2, BNode(4, BNode(5, BNode(7)))), BNode(3, BNode(6, right=BNode(8))))
level_traverse(b_tree)
⾮平衡⼆叉数如何变成平衡⼆叉数?
参考
先,中,后序遍历⼆叉数。完全⼆叉数是什么?
完全⼆叉树:深度为k有n个节点的⼆叉树,当且仅当其中的每⼀节点,都可以和同样深度k的满⼆叉树,序号为1到n的节点⼀对⼀对应时,称为“完全⼆叉树”。(摘⾃)
先序:先根后左再右
中序:先左后中再右
后序:先左后右再根
如何判断两个单链表是否相交于某个节点,包括 X 型,Y 型,V 型。
X 型不可能存在,⼀个单链表节点不存在两个不同的后继。
# 存在 V 型和 Y 型,如果交叉,则最后⼀个节点肯定是相同的,故直接从最后⼀个节点进⾏反向遍历。
# 反转单链表
def reverse_single_link_lst(link_lst):
if not link_lst:
return link_lst
pre = link_lst
cur =
< = None
while cur:
tmp =
< = pre
pre = cur
cur = tmp
return pre
# 寻交叉点
def point(node_a, node_b):
if node_a is None or node_b is None:
return None
next_a, next_b = node_a, node_b
while next_a or next_b:
if next_a.val == next_b.val:
if and and (val == val):
next_a, next_b = ,
continue
return next_a.val
next_a, next_b = ,
return None
# 构造单链表
class Node(object):
def __init__(self, value, next=None):
self.val = value
< = next
a = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
b = ListNode(7, ListNode(9, ListNode(4, ListNode(5))))
ra = reverse_single_link_lst(a)
rb = reverse_single_link_lst(b)
point(ra, rb)
# output:
# 4
如何判断两个单链表是否是同⼀个链表。
直接判断第⼀个节点即可。
单链表逆转。
见上⾯判断交叉链表内的reverse_single_link_lst()函数。
堆,栈,队列。
,,
说说你知道的排序算法以及其时间复杂度。
⼿写快速排序。画画堆排序的原理及过程。
# 快速排序,lz 当时写的⽐较复杂,但是是最常见的写法(紧张导致有⼏个⼩bug),如下def quick_sort(lst, start, stop):
if start < stop:
i, j, x = start, stop, lst[start]
while i < j:
while (i < j) and (lst[j] > x):
j -= 1
if (i < j):
lst[i] = lst[j]
i += 1
while (i < j) and (lst[i] < x):
i += 1
if (i < j):
lst[j] = lst[i]
j -= 1
lst[i] = x
quick_sort(lst, start, i-1)
quick_sort(lst, i+1, stop)
return lst
之后⾯试官⼤哥给了个特别简洁的写法,三路复⽤,地址在
def qsort(alist):
"""
quick sort(easy way, but more memory)
test: python -m doctest qsort.py
>>> import math
>>> import random
>>> size = 100
>>> alist = [random.randint(0, size * 10) for i in range(size)]
>>> qlist = qsort(alist)
>>> alist.sort()
>>> assert qlist == alist
"""
if len(alist) <= 1:
return alist
key = alist[0]
left_list, middle_list, right_list = [], [], []
[{i < key: left_list, i == key: middle_list, i > key: right_list}[
True
]
.append(i) for i in alist]
return qsort(left_list) + middle_list + qsort(right_list)
说说你所了解的加密算法,编码算法,以及压缩算法。了解 base64 的原理么?
只说了听过 base64, md5 这⼏种编码。。。。。⾃⾏搜索吧,考的概率极⼩。
数据库
索引是什么原理?有什么优缺点?
参考
乐观锁和悲观锁是什么?
你为什么选择 Redis ⽽不是 MongoDB 或者其他的?(有个项⽬⽤了 Redis)
SQL 和 NoSQL 区别?
⽹络
从浏览器输⼊⽹址到⽹页渲染完毕这过程发⽣了什么?
说的⾮常详细,看⾯的岗位不同,回答的侧重点不⼀样。如⾯的 Web ,可以侧重说说 nginx -> uwsgi -> Python -> uwsgi -> nginx 这个过程,(WSGI 标准)
TCP 三次握⼿四次挥⼿详细说下。
为什么是三次握⼿?两次不⾏么?
说说 TCP 和 UDP 的区别。
TCP(传输层)
优点:TCP ⾯向连接,可靠,稳定,传输数据前需要建⽴连接,故有三次握⼿四次挥⼿,还有拥塞控制,重传等
缺点:慢,占⽤系统资源,有确认机制,三次握⼿,所以容易被攻击,DDos
UDP
优点:快,⽆状态传输协议
缺点:不稳定,不可靠,容易丢包
谈谈你对 SQL 注⼊、 XSS 、 CSRF 的理解。以及如何防范。
,现在多数采⽤ ORM,以及参数化查询,很少再出现。
说说 DNS 是什么东西。
根据域名寻主机 IP 的协议。
HTTP 是⼯作在七层模型的哪⼀层?DNS ⼜是哪⼀层?TCP 和 IP 呢?
HTTP,DNS 应⽤层,TCP 传输层,IP ⽹络层。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论