关于Python的一些面试题


1.现有字典 d={‘a’:24,’g’:52,’l’:12,’k’:33}请按字典
中的 value 值进行排序?
sorted(d.items(),key = lambda x:x[1])
2. Redis 由于存储的指纹过多怎么办?
设置生存时间
定时清理
持久化
主从
3. Phontomjs 相关?
主程序退出后,selenium 不保证 phantomJS 也成功退出,最好手动关闭
phantomJS 进程。(有可能会导致多个 phantomJS 进程运行,占用内存)
WebDriverWait 虽然可能会减少延时,但是目前存在 bug(各种报错),这
种情况可以采用 sleep。
phantomJS 爬数据比较慢,可以选择多线程。如果运行的时候发现有的可以
运行,有的不能,可以尝试将 phantomJS 改成 Chrome。
4. 什么是函数?
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。Python 提供了许多内建函
数,但也可以自己创建函数,这被叫做用户自定义函数
5. scrapy-redis 去重原理?
可见 scrapy_redis 是利用 set 数据结构来去重的,去重的对象是 request
的 fingerprint(其实就是用 hashlib.sha1()对 request 对象的某些字段信息进
行压缩)。其实 fp 就是 request 对象加密压缩后的一个字符串(40 个字符,0~f)
6. map 函数和 reduce 函数?
①从参数方面来讲:
map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元
组)。其中,函数(即 map 的第一个参数位置的函数)可以接收一个或多个参数。
reduce() 第一个参数是函数,第二个是 序列(列表或元组)。但是,其函
数必须接收两个参数。
黑 马 程 序 员
②从对传进去的数值作用来讲:
map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函
数“作用”一次;(请看下面的栗子)
reduce()是将传人的函数作用在序列的第一个元素得到结果后,把这个结果
继续与下一个元素作用(累积计算)。
7. Python 的引用类型有哪些?
对象本身可以修改,比如列表,字典等
8. self 和 cls 区别?
约定俗成,一般用到 staticmethod,classmethod 或者后期绑定就用 cls,否
则就用 self,属于*args 的范畴的
9. 怎么设置深度爬取?
通过在 settings.py 中设置 DEPTH_LIMIT 的值可以限制爬取深度,这个深度
是与 start_urls 中定义 url 的相对值。也就是相对 url 的深度。若定义 url 为
http://www.domz.com/game/,DEPTH_LIMIT=1 那么限制爬取的只能是此 url 下一
级的网页。深度大于设置值的将被忽视。
10. 怎么储存图片和视频? 一般存储的是 URL
保存在云服务器
11. a=1,b=2,不用中间变量交换 a 和 b 的值?
a=a+b
b=a-b
a=a-b
12. 代理 IP 里的“透明”“匿名”“高匿”分别是指?
透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送
的仍然是真实的 IP。你要想隐藏的话,不要用这个。
普通匿名代理能隐藏客户机的真实 IP,但会改变我们的请求信息,服务器端
有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知
道你的 ip 地址,但仍然可以知道你在使用代理,当然某些能够侦测 ip 的网页仍
然可以查到你的 ip。
黑 马 程 序 员
高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏
览器在访问它,这时客户的真实 IP 是隐藏的,服务器端不会认为我们使用了代

13. 请分别求出今天是本年、本月、本周的第几天?
# -*- coding:utf-8 -*-
import datetime
nowtime1 = datetime.datetime.now().strftime('%Y-%m-%d').split('-')
today = nowtime1[2]
d=datetime.datetime.now()
weekday = d.weekday()+1
dt = datetime.datetime(int(nowtime1[0]), int(nowtime1[1]),
int(nowtime1[2]))
print("是第"+dt.strftime("%j")+"天")
print '是本月第%s 天'%today
print '是本周第%s 天'%weekday
14. MD5
MD5 功能:
输入任意长度的信息,经过处理,输出为 128 位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
根据 128 位的输出结果不可能反推出输入的信息(不可逆);
MD5 用途:
防止被篡改
防止直接看到明文
防止抵赖(数字签名)
MD5 算法过程:
对 MD5 算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每
一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四
个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。
15. 哈希表
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待
查找的值即 key,即可查找到其对应的值。
黑 马 程 序 员
哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无
序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键
的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。
使用哈希查找有两个步骤:
1. 使用哈希函数将被查找的键转换为数组的索引。在理想的情况下,不同
的键会被转换为不同的索引值,但是在有些情况下我们需要处理多个键被哈希到
同一个索引值的情况。所以哈希查找的第二个步骤就是处理冲突
2. 处理哈希碰撞冲突。哈希表是一个在时间和空间上做出权衡的经典例
子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时
间复杂度为 O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序
查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端
之间找到了平衡。只需要调整哈希函数算法即可在时间和空间上做出取舍。
16. python 的魔法方法
魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)
了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,
你可以定义自己想要的行为,而这一切都是自动发生的。它们经常是两个下划线
包围来命名的(比如 __init__,__lt__),Python 的魔法方法是非常强大的,
所以了解其使用方法也变得尤为重要!
__init__ 构造器,当一个实例被创建的时候初始化的方法。但是它并不是
实例化调用的第一个方法。
__new__才是实例化对象调用的第一个方法,它只取下 cls 参数,并把其他
参数传给 __init__。 __new__很少使用,但是也有它适合的场景,尤其是当类
继承自一个像元组或者字符串这样不经常改变的类型的时候。
__call__ 允许一个类的实例像函数一样被调用
__getitem__ 定义获取容器中指定元素的行为,相当于 self[key]
__getattr__ 定义当用户试图访问一个不存在属性的时候的行为
__setattr__ 定义当一个属性被设置的时候的行为
__getattribute__ 定义当一个属性被访问的时候的行为
17. 字符集和字符编码
字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、
数字等。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个
黑 马 程 序 员
数不同,常见字符集有:ASCII 字符集、ISO 8859 字符集、GB2312 字符集、BIG5
字符集、GB18030 字符集、Unicode 字符集等。
字符编码就是以二进制的数字来对应字符集的字符。
常见的编码字符集(简称字符集)
Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使
用的字符(如中文、日文、英文、德文等)。
ASCII:ASCII 既是编码字符集,又是字符编码。早期的计算机系统只能处理
英文,所以 ASCII 也就成为了计算机的缺省字符集,包含了英文所需要的所有字
符。
GB2312:中文字符集,包含 ASCII 字符集。ASCII 部分用单字节表示,剩余
部分用双字节表示。
GBK:GB2312 的扩展,但完整包含了 GB2312 的所有内容。
GB18030:GBK 字符集的超集,常叫大汉字字符集,也叫 CJK(Chinese,
Japanese,Korea)字符集,包含了中、日、韩三国语
注意:Unicode 字符集有多种编码方式,如 UTF-8、UTF-16 等;ASCII 只有
一种;大多数 MBCS(包括 GB2312)也只有一种。
18. 去列表里面最大值
import numpy
list=[1,3,5,7]
list.remove(numpy.max(list))
19. 怎样写有序字典
from collections import OrderedDict
dic=OrderedDict() #声明有序字典
dic.clear() #清空有序字典
dic['233']=233 #加入键值对
dir(OrderedDict) #列出所有的成员函数
20. with 语句
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异
常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中
锁的自动获取和释放等。
21. requests 返回的 content 和 text 的区别?
黑 马 程 序 员
resp.text 返回的是 Unicode 型的数据。
resp.content 返回的是 bytes 型也就是二进制的数据
如果想取文本,可以通过 r.text。
如果想取图片,文件,则可以通过 r.content。
22. MySQLdb.connect 中
cursorclass=MySQLdb.cursors.DictCursor 参数用途?
cursorclass 是创建 cursor 对象的参数,执行查询后每条记录的结果以列表
形式表示。cursors 参数为 MySQLdb.cursors.DictCursor 表示按字典形式返回
查询记录。
23. 用 conn.execute()执行 sql 返回什么?
返回执行 SQL 语句后受影响的行数。
24. cursor.execute 查询出结果后,有哪些方法可以获得结果?
fetchone
fetchall
fetchmany 可指定返回个数 fetchmany(3)
25. 有一个已经排好序的数组 l = [0,10,20,30,40,50]。现输入
一个数,要求按原来的规律将它插入数组中
l = [0,10,20,30,40,50]
cnt = len(l)
n = int(raw_input('Input a number:'))
l.append(n)
for i in range(cnt):
if n<l[i]:
for j in range(cnt,i,-1):
print cnt,i
l[j] = l[j-1]
l[i] = n
break
print 'The new sorted list is:',l
黑 马 程 序 员
26. a=1,b=2,不用中间变量交换 a 和 b 的值?
a=a+b
b=a-b
a=a-b
27. 求输出结果
def num():
return [lambda x:i*x for i in range(4)]
print [m(2) for m in num()]
[6, 6, 6, 6]
列表推导式保存了 4 个函数对象,调用函数的时候才会对 i 赋值。i 保存的值
是 3
28. 去列表里面最大值
import numpy
list=[1,3,5,7]
list.remove(numpy.max(list))
29. 什么是队列,什么是栈
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线
性表的一端进行。
特点:后进先出(Last In First Out),简称为 LIFO 线性表。
栈的基本运算有六种:
构造空栈:InitStack(S)、
判栈空: StackEmpty(S)、
判栈满: StackFull(S)、
进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素
退栈: Pop(S) 、 可形象地理解为弹出,弹出后栈中就无此元素了。
取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈
顶不会改变。
队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有
限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只
出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头 (Front)
,队列的操作原则是先进先出的,所以队列又称作 FIFO 表(First In First Out)
黑 马 程 序 员
队列的基本运算也有六种:
置空队 :InitQueue(Q)
判队空: QueueEmpty(Q)
判队满: QueueFull(Q)
入队 : EnQueue(Q,x)
出队 : DeQueue(Q)
取队头元素: QueueFront(Q),不同与出队,队头元素仍然保留。
30. 用两个队列如何实现一个栈,用两个栈如何实现一个队列
两个栈实现一个队列
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现 delete
时,将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺
序恰好是先压入栈 1 的元素此时在栈 2 的上面,为了实现效率的提升,在 delete
时,判断栈 2 是否有数据,如果有的话,直接删除栈顶元素,在栈 2 为空时才将
栈 1 的数据压入到栈 2 中,从而提高程序的运行效率,实现过程可以分为下面几
个步骤:
1、push 操作时,一直将数据压入到栈 2 中
2、delete 操作时,首先判断栈 2 是否为空,不为空的情况直接删除栈 2 栈顶元
素,为空的话将栈 1 的数据压入到栈 2 中,再将栈 2 栈顶元素删除。
两个队列实现一个栈
因为队列是先进先出,所以要拿到队列中最后压入的数据,只能每次将队列中数
据 pop 到只剩一个,此时这个数据为最后压入队列的数据,在每次 pop 时,将数
据压入到另一个队列中。每次执行 delete 操作时,循环往复。(感觉效率低)
每次删除时间复杂度 O(N)
31. Dir()方法
用 dir()函数可以查看对像内所有属性及方法

猜你喜欢

转载自www.cnblogs.com/niupeinan/p/10494578.html