发布于2019-07-17 19:27 阅读(5630) 评论(0) 点赞(27) 收藏(51)
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 有哪些区别?
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
。连接字符串都有哪些方式?
%s
)format
join
+
如何判断某个对象是什么类型?
type(obj)
isinstance(obj)
生成器是什么?
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
这样的日期格式,注意润年,大小月,不允许用库函数,尽量越底层实现越好。(手写)
作者:对不起你是个好人
链接:https://www.pythonheidong.com/blog/article/1874/da00a440928ccefc5e8b/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!