面试题

1、什么是lambda函数?它有什么好处?另外python在函数编程方面提供了些什么函数和语法?

lambda是Python中的匿名函数。它语法简单,简化代码,不会产生命名冲突,污染命名空间。Python提供了map,reduce,filter等函数方法,提供了装饰器,闭包等语法
2、详细说说tuple、list、dict的用法,它们的特点;

tuple 元祖,固定长度不可变的顺序容器,访问效率高,是和存储一些常量数据,可以作为字典的键使用
list 列表,是长度可变有序的数据存储容器,。可以通过下标索引取到相应的数据
dict 字典,长度可变的hash字典容器。存储的方式为键值对,可以通过相应的键获取相应的值,key支持多种类型
3、说说python中装饰器、迭代器的用法;描述下dict 的 items() 方法与 iteritems() 方法的不同;

装饰器是指对函数执行过程,做一些扩展,甚至可以更改本身函数的执行
迭代器是指遵循迭代器协议的对象,这类对象在被for循环时,每次迭代生成下一个项,不用一开始就生成整个列表
在python3中 不存在iteritems,items方法返回可迭代对象
在python2中 items()返回[(key,value)]的列表对象,iteritems()返回迭代器对象,iteritems()循环时不可以增删dict的内容
4、讲讲对unicode, gbk, utf-8等的理解,python2.x是如何处理编码问题?

复制代码
unicode编码:为了解决各个国家的语言的存储,引进的unicode码,包括UCS2,UCS4,UTF-8,UTF-7等
gbk:和unicode不一样的编码方式 ,常用的为 gbk-2312
utf-8: UTF-8 使用 1-4 个字节来存储单个字符,应该是目前最流行的字符集。Linux 默认字符集就是UTF-8。既解决了大多数语言的编码方式,又避免了简单字符存储对空间的浪费

python 2.x 需要在文件上方声明文件的编码方式# -- coding: utf8 --,可以通过str.decode/str.encode处理字符串的文本编码
保证 python 编辑器的编码正确,或使用 u’中文’保证被转换成 unicode 编码,推荐使用
sys.setdefaultencoding(‘utf-8’)来保证我们的编码
复制代码
5、Python 是如何进行内存管理的?python 的程序会内存泄露吗?说说有没有什么方面防止或检测内存泄露?

复制代码
Python GC主要使用 引用计数 来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”解决容器对象可能产生的循环引用问题。通过分代
以空间换时间的方法提高垃圾回收效率
1、引用计数: 每个对象中都有ob-refcnt来做引用计数。当一个对象…,ob-refcnt就会增加,当引用的对象删除,那么ob-refcnt就会减少当ob-refcnt为零,就会释放该对象的内存空间
2、标记清除: 解决循环引用的问题。先按需分配,等到没有空闲内存的时候,从寄存器和程序栈上的引用出发,遍历所有对象和引用把所有能访问的打标记,最后将没有标记的对象释放掉
3、分代技术: 提高效率,提高垃圾回收的效率,按照存活时间,分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”,垃圾回收的频率随代的存活时间增大而减小。。Python默认定义分代对象集合,引用数越大,对象的存活时间越长

Python也会内存泄露,Python本身的垃圾回收机制无法回收重写了__del__的循环引用的对象

程序员管理好每个python对象的引用,尽量在不需要使用对象的时候,断开所有引用
尽量少通过循环引用组织数据,可以改用weakref做弱引用或者用id之类的句柄访问对象
通过gc模块的接口可以检查出每次垃圾回收有哪些对象不能自动处理,再逐个逐个处理
复制代码
6、关于 python 程序的运行性能方面,有什么手段能提升性能?

1、使用多进程,充分利用机器的多核性能
2、对于性能影响较大的部分代码,可以使用C或C++编写
3、对于IO阻塞造成的性能影响,可以使用IO多路复用来解决
4、尽量使用python的内建函数
5、尽量使用局部变量
7、list 对象 alist [{‘name’:‘a’,‘age’:20},{‘name’:‘b’,‘age’:30},{‘name’:‘c’,‘age’:25}], 请按 alist 中元素的age 由大到小排序;

def sort_by_age(list1):
return sorted(alist,key=lambda x:x[‘age’],reverse=True)
8、两个 list 对象 alist [‘a’,‘b’,‘c’,‘d’,‘e’,‘f’], blist [‘x’,‘y’,‘z’,‘d’,‘e’,‘f’],请用简洁的方法合并这两个 list,并且 list 里面的元素不能重复;

复制代码
alist = [‘a’,‘b’,‘c’,‘d’,‘e’,‘f’]
blist = [‘x’,‘y’,‘z’,‘d’,‘e’,‘f’]

def merge_list(*args):
s = set()
for i in args:
s = s.union(i)
return list(s)
复制代码
9、打乱一个排好序的 list 对象 alist;

import random
random.shuffle(alist)
10、简单实现一个stack

复制代码
class Stack:
def init(self):
self.items = []

def __iter__(self):
    return self.items.__iter__()

def pop(self):
    return self.items.pop()

def top(self):
    if len(self.items) > 0:
        return self.items[len(self.items) - 1]

def push(self, item):
    self.items.append(item)

def empty(self):
    self.items = []

def size(self):
    return len(self.items)

复制代码
11、输入某年某月某日,判断这一天是这一年的第几天?(可以用 python 标准库)

复制代码
import datetime
def dayofyear():
year = input(“请输入年份:”)
month = input(“请输入月份:”)
day = input(“请输入天:”)
date1 = datetime.date(year=int(year),month=int(month),day=int(day))
date2 = datetime.date(year=int(year),month=1,day=1)
return (date1 -date2).days
复制代码
12、将字符串:“k:1|k1:2|k2:3|k3:4”,处理成 python 字典:{k:1, k1:2, … }

复制代码
str1 = “k:1|k1:2|k2:3|k3:4”
def str2dict(str1):
dict1 = {}
for iterms in str1.split(’|’):
key,value = iterms.split(’:’)
dict1[key] = value
return dict1
复制代码

请完成一个程序,并能按步骤实现以下功能:

  1. 下载https://en.wikipedia.org/wiki/Machine_translation 页面的内容并保存为mt.html

    需要编写代码来下载页面。
    
  2. 统计mt.html中

    标签内下所有单词以及数目并存储到mt_word.txt中。

    mt_word.txt有如下几点要求:
    
    a) 每个单词一行。单词在前,单词出现的次数在后,中间用Tab(\t)进行分隔。
    
    b) 单词要按照单词数目从多到少的顺序进行排列。比如说单词a出现了100次,单词b出现了10次,则单词a要在单词b的前面。
    
  3. 提取出mt.html中所有的年份信息(比如说页面中的1629, 1951这些的四位数字就是年份)存储到mt_year.txt中。

    mt_year.txt有如下几点要求:
    
    a) 每个年份是一行。
    
    a) 年份需要从过去到现在的顺序进行排列。比如说文章中出现了2007和1997,则1997需要排在2007的前面。
    

要求:

  1. 仅限python编程,而且仅仅可以使用python自带的函数或库。

  2. 提交可执行的程序以及mt.html, mt_word.txt, mt_year.txt。

  3. 限定在一个小时内完成。

复制代码

1. 下载https://en.wikipedia.org/wiki/Machine_translation 页面的内容并保存为mt.html需要编写代码来下载页面。

session = requests.session()
response = session.get(url=“https://en.wikipedia.org/wiki/Machine_translation”)
with open(‘mt.html’,‘wb’) as f:
f.write(response.content)

2、统计mt.html中

标签内下所有单词以及数目并存储到mt_word.txt中

解析页面,拿到所有的p标签中的文本

soup = BeautifulSoup(response.text,features=“lxml”)
tag2 = soup.find_all(name=‘p’)
list_p = []
for i in tag2:
list_p.append(i.get_text())

将所有的文本合并成一个字符串

str_p = ’ ‘.join(list_p)
word_set = set()
for word in str_p.split():
word = word.strip(’,.()""/; ')
word_set.add(word)

word_dict = {}

word_list = []
for word in word_set:
if word == ‘’:
continue
# word_dict[word] = str_p.count(word)
dict2 = {word:str_p.count(word)}
word_list.append(dict2)

将单词按照数目反序排列,然后写入文件

blist = sorted(word_list,key = lambda x:list(x.values())[0],reverse =True)
with open(‘mt_word.txt’,‘w’) as f:
for item in blist:
for k,v in item.items():
line = k + ‘\t’ + str(v) + ‘\n’
f.write(line)

3、提取出mt.html中所有的年份信息(比如说页面中的1629, 1951这些的四位数字就是年份)存储到mt_year.txt中

year = re.compile(r’\d{4}’)
years_list = re.findall(year,response.text)
years_list = sorted(list(set(years_list)))
with open(‘mt_year.txt’,‘w’) as f:
for year in years_list:
line = year + ‘\n’
f.write(line)
复制代码

一、试列出至少三种目前流行的大型数据库的名称:________、_________、__________,其中您最熟悉的是__________,从__________年开始使用。

Oracle,Mysql,SQLServer   Oracle 根据自己情况
答案

二、有表List,并有字段A、B、C,类型都是整数。表中有如下几条记录:

A

B

C

2

7

9

5

6

4

3

11

9

现在对该表一次完成以下操作:

  1. 查询出B和C列的值,要求按B列升序排列
  2. 写出一条新的记录,值为{7,9,8}
  3. 查询C列,要求消除重复的值,按降序排列

写出完成完成以上操作的标准的SQL语句,并且写出操作3的结果。

create table List2(A int ,B int,C int)
select B,C from List order by B
insert into List values(7,9,8)
select distinct(C) from List order by 1 desc;
9 8 4
答案

三、请简要说明视图的作用

1. 数据库视图隐藏了数据的复杂性。
2. 数据库视图有利于控制用户对表中某些列的访问。
3. 数据库视图使用户查询变得简单。
答案

四、列举您使用过的python网络爬虫所用到的网络数据包(最熟悉的在前):

requests、urllib、urllib2、httplib2
答案

五、列举您使用过的python网络爬虫所用到的解析数据包(最熟悉的在前):

BeautifulSoup、pyquery、Xpath、lxml
答案

六、列举您使用过的python中的编码方式(最熟悉的在前):

UTF-8,ASCII,gbk
答案

七、python3.5语言中enumerate的意思是_______________________

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
答案

八、99的八进制表示是_______________________

143
答案

九、请举出三种常用的排序算法

冒泡、选择、快速
答案

十、列出比较熟悉的爬虫框架

Scrapy
答案

十一、     用4、 9 、 2、 7四个数字,可以使用+、-、*和/,每个数字使用一次,使表达式的结果为24,表达式是_____________________________

(9+7-4)*2
答案

十二、     对你最有影响的或是您认为最有价值的软件方面的几本书是?

十三、     您最熟悉的Unix环境是_____________.Unix下查询环境变量的命令是________,查询脚本定时任务的命令是____________________

1 AIX , env  crontab
答案

十四、     写出在网络爬虫爬取数据的过程中,遇到的防爬虫问题的解决方案

 通过headers反爬虫:解决策略,伪造headers
 基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
 基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求
答案

十五、     阅读以下Python程序

for i in range(5,0,-1):

      print(i)

请在下面写出打印结果

5 4 3 2 1
答案

十六、在某系统中一个整数占用两个八位字节,使用Python按下面的要求编写完整程序。

    接收从标准输入中依次输入的五个数字,将其组合成为一个整数,放入全局变量n中,随后在标准输出输出这个整数。(ord(char)获取字符ASCII值的函数)

 

人,从刚出生来到这个世界,便开始探索这个世界。累了就歇会,精神了就继续探索,直至死亡。
1、 post、get有什么区别?

复制代码

  1. 根据HTTP规范,GET一般用于获取/查询资源信息,应该是安全的和幂等。而POST一般用于更新资源信息
  2. get是在url中传递数据,数据放在请求头中。 post是在请求体中传递数据
  3. get传送的数据量较小,只能在请求头上发送数据。post传送的数据量较大,一般被默认为不受限制。
  4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
    建议:
    1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
    2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
    复制代码
    2、 http、https协议有什么区别?

复制代码
http协议是超文本传输协议,被用于在web浏览器和网站服务器之间传递信息。http协议工作是以明文方式发送内容,不提供任何形式的数据加密,而这也是很容易被黑客利用的地方,如果黑客截取了web浏览器和网站服务器之间的传输信息,就可以直接读懂其中的信息,因此http协议不适合传输一些重要的、敏感的信息,比如信用卡密码及支付验证码等。
安全套接字层https协议就是为了解决http协议的这一安全缺陷而出生的,为了数据传输的安全,https在http的基础上加入了ssl协议,ssl依靠证书来验证服务器的身份,为浏览器和服务器之间的通信加密,这样的话即使黑客借去了发送过程中的信息,也无法破解读懂它,我们网站及用户的信息便得到了最大的安全保障。

https协议需要到ca申请证书,一般免费证书很少,需要费用。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
复制代码
3、 域名和IP之间有什么关系,如何查看某个域名对应的所有IP?

国际互联网(Internet)上有成千百万台主机(host),为了区分这些主机,人们给每台主机都分配了一个专门的“地址”作为标识,称为IP地址
由于IP地址全是些的数字,为了便于用户记忆,Internet上引进了域名服务系统DNS(Domain Name System)。
当您键入某个域名的时候,这个信息首先到达提供此域名解析的服务器上,再将此域名解析为相应网站的IP地址。完成这一任务的过程就称为域名解析。

1.ping 2.nslookup 3.使用站长工具等
4、 http协议头中,keep-alive字段有什么作用?

HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);
当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
5、 robots协议是什么?

Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
6、 列出几种常见的关系型数据库和非关系型数据库?(每种至少两个)

Oracle、Mysql、SQLServer、DB2 Redis MongoDB Cassandra
7、 内存泄露是什么?如何避免?

复制代码
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。
内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
导致程序运行速度减慢甚至系统崩溃等严重后果。

del() 函数的对象间的循环引用是导致内存泄漏的主凶。

不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题.
通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息
可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为 0 来判断是否内存泄漏

Python的内存管理机制
1.引用计数:通过引用计数来保持对内存中的变量跟踪,Python内部记录中所有在使用对象各有多少个引用。
Python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用,简称引用计数。当对象被创建时就创建了一个引用计数。
当某个对象的引用计数为0时,对象就不在需要,就列入了垃圾回收队列。
引用计数增加:1.对象被创建:x=4;2.另外的别人被创建:y=x;3.被作为参数传递给函数:foo(x);4.作为容器对象的一个元素:a=[1,x,‘33’];
引用计数减少时:1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1;
2.对象的别名被显式的销毁:del x ;或者del y;
3.对象的一个别名被赋值给其他对象:x=789
4.对象从一个窗口对象中移除:myList.remove(x)
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

2.垃圾回收
1.引用计数: 每个对象中都有ob-refcnt来做引用计数。当一个对象…,ob-refcnt就会增加,当引用的对象删除,那么ob-refcnt就会减少当ob-refcnt为零,就会释放该对象的内存空间
2.标记清除: 解决循环引用的问题。先按需分配,等到没有空闲内存的时候,从寄存器和程序栈上的引用出发,遍历所有对象和引用把所有能访问的打标记,最后将没有标记的对象释放掉
3.分代技术: 提高效率,提高垃圾回收的效率,按照存活时间,分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”,垃圾回收的频率随代的存活时间增大而减小。。Python默认定义分代对象集合,引用数越大,对象的存活时间越长

3.内存池机制
在Python中,大多数申请的都是小块的内存,会执行大量的malloc和free操作。Python引入了一个内存池机制,用于管理对小块内存的申请和释放,即Pymalloc机制。
它将不用的内存放到内存池而不是返回给操作系统。

  1. 当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。
  2. 对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
    复制代码
    8、 列举几个常用的dom解析项目、插件

xml、libxml2 、lxml 、xpath
9、 常见的反爬虫机制有哪些?

通过headers反爬虫:解决策略,伪造headers
基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求
10、如何提高爬取效率?

  1. 爬取方面,利用异步io。
    2.处理方面,利用消息队列做生产者消费者模型

1、楼梯问题

1.1、给一个楼梯,从最下面往上走,每次可以走1到n步,求总共有多少种走法?

1.2、给一个楼梯,从最下面往上走,每次可以走1步或2步,求总共有多少种走法?

1.3、给一个楼梯,从最下面往上走,每次可以走1步或2步或3步,求总共有多少种走法?

复制代码

1、 给一个楼梯,从最下面往上走,每次可以走1或2步,求总共有多少种走法?

假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2。

如果有大于2级的n级台阶,那么假如第一次跳一级台阶,剩下还有n-1级台阶,有f(n-1)种跳法,假如第一次条2级台阶,剩下n-2级台阶,有f(n-2)种跳法。这就表示f(n)=f(n-1)+f(n-2)。

def walk_stairs(stairs):
if stairs == 1:
return 1
if stairs == 2:
return 2
else:
return walk_stairs(stairs-1) + walk_stairs(stairs-2)

2、给一个楼梯,从最下面往上走,每次可以走1到n步,求总共有多少种走法?

上1个台阶 1

上2个台阶 2

上3个台阶 4

上4个台阶 8

上n个台阶 2^(n-1)

3、给一个楼梯,从最下面往上走,每次可以走1步或2步或3步,求总共有多少种走法?

上1个台阶 2^(1-1)

上2个台阶 2^(2-1)

上3个台阶 2^(3-1)

f(n) = f(n-1) + f(n-2) + f(n-3)

复制代码
2、 给一个字符数组,字符包含a-z、1-9,比如:a b c 4 b 2 a c 1 1 3,求只出现一次的第一次出现的字符

复制代码
str_list = [‘a’, ‘b’, ‘c’, 4, ‘b’, 2, ‘a’, ‘c’, 1, 1, 3]

def find_only_one(alist):
for string in alist:
count = alist.count(string)
if count == 1:
return string
return None
复制代码
3、 有一个html文本字符串,让我取出sflkj这个a标签里面的href的链接地址?

from bs4 import BeautifulSoup
text = “sflkj
the_html = BeautifulSoup(text,features=‘lxml’)
print(the_html.find(‘a’).attrs[‘href’])
4、 下面是一个单线程的代码,请改写成多线程的:

复制代码
start = “http://google.com
queue = [start]
visited = {start}
while queue:
url = queue.pop(0)
print(url)
for next_url in extract_url(url):
if next_url not in visited:
queue.append(next_url)
visited.add(next_url)
复制代码

复制代码
from concurrent.futures import ThreadPoolExecutor

start = “http://google.com
queue = [start]
visited = {start}
pool = ThreadPoolExecutor(10)

def func(url):
for next_url in extract_url(url):
if next_url not in visited:
queue.append(next_url)
visited.add(next_url)

while queue:
url = queue.pop(0)
pool.submit(func,url)
pool.shutdown(wait=True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值