Python 语法javascript
说说你平时 Python 都用哪些库html
==
和 is
区别。java
==
是比较两对象的值,is
是比较在内存中的地址(id), is
至关于 id(objx) == id(objy)
。深拷贝和浅拷贝。node
# 浅拷贝操做只会拷贝被拷贝对象的第一层对象,对于更深层级的只不过是拷贝其引用,以下例中 `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__
。python
__init__
只是单纯的对实例进行某些属性的初始化,以及执行一些须要在新建对象时的必要自定义操做,无返回值。而 __new__
返回的是用户建立的实例,这个才是真正用来建立实例的,因此 __new__
是在 __init__
以前执行的,先建立再初始化。Python 2 和 Python 3 有哪些区别?nginx
raw_input()
, input()
except Exception, e
, 而 Python3 只支持 except Exception as e
xrange
, 而使用 range
代替它,在 Python3 中,range
返回的是一个可迭代对象,而不是 Python2 那样直接返回列表。map
若是须要当即执行必须以 list(map())
这样的方式。print
改为了函数,而在 Python2 中,print
是一个关键字。使用上有所差别。3/2 == 1.5
;Python2 中,3/2 == 1
。链接字符串都有哪些方式?git
%s
)format
join
+
如何判断某个对象是什么类型?github
type(obj)
isinstance(obj)
生成器是什么?web
Python 中的 GIL 是什么?全称?举个例子说说其具体体现。面试
s = 'abcd', s[2] = 'e'
运行结果是什么?
Python 中,sorted
函数内部是什么算法?
编码是一个什么样的过程?
Python 里面怎么实现协程?
requests
包新建一个 session
再 get
和普通的 requests.get
有什么区别?(tcp长链接)
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 框架有什么优缺点?
WSGI 是什么?uWSGI, nginx 这些都是什么用途?
nginx 和 Apache 的区别?(参考 interview_python)
你部署 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)
非平衡二叉数如何变成平衡二叉数?
先,中,后序遍历二叉数。彻底二叉数是什么?
如何判断两个单链表是否相交于某个节点,包括 X 型,Y 型,V 型。
# 存在 V 型和 Y 型,若是交叉,则最后一个节点确定是相同的,故直接从最后一个节点进行反向遍历。 # 反转单链表 def reverse_single_link_lst(link_lst): if not link_lst: return link_lst pre = link_lst cur = link_lst.next pre.next = None while cur: tmp = cur.next cur.next = 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 next_a.next and next_b.next and (next_a.next.val == next_b.next.val): next_a, next_b = next_a.next, next_b.next continue return next_a.val next_a, next_b = next_a.next, next_b.next return None # 构造单链表 class Node(object): def __init__(self, value, next=None): self.val = value self.next = 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
以后面试官 akun 大哥给了个特别简洁的写法,三路复用,地址在 Gist
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)
索引是什么原理?有什么优缺点?
乐观锁和悲观锁是什么?
你为何选择 Redis 而不是 MongoDB 或者其余的?(有个项目用了 Redis)
SQL 和 NoSQL 区别?
从浏览器输入网址到网页渲染完毕这过程发生了什么?
TCP 三次握手四次挥手详细说下。
为何是三次握手?两次不行么?
说说 TCP 和 UDP 的区别。
谈谈你对 SQL 注入、 XSS 、 CSRF 的理解。以及如何防范。
说说 DNS 是什么东西。
HTTP 是工做在七层模型的哪一层?DNS 又是哪一层?TCP 和 IP 呢?
说说你知道的 HTTP 方法和 状态码。
HTTP 的 GET 和 POST 有什么区别?
HTTP 和 HTTPS 的区别?
说说你知道的 HTTP 包头部信息里都有哪些字段。
HTTP 包头部信息里面的 Host
字段是什么做用?
说说 cookie 里面你都知道哪些字段。
Session 是什么东西?
在写爬虫过程当中,若是碰见须要加载 js 的状况你是如何处理的。
普通匿名代理和高匿代理有什么区别?
你知道哪些反爬措施?
re
里 match
函数 和 search
函数有什么区别?举例说明。retry
装饰器,使用以下:# 能够指定重试次数,直到函数返回正确结果。 @retry(retries=3) def func(*args, **kw): try: # some action return True except: return False
大概能够像下面这样写,
from functools import wraps def retry(retries=3): def timesf(func): @wraps(func) def wrap(*args, **kw): i = 0 status = True while status and i < times: status = func(*args, **kw) i += 1 return status return wrap return timesf
酒店ID + 出现次数
(最后提到了其余想法,如文件切片,bitmap 之类)xxxx-xx-xx
这样的日期格式,注意润年,大小月,不容许用库函数,尽可能越底层实现越好。(手写)