看完2019年阿里巴巴Python面试题详解,月薪3万不是梦( 二 )


三、内存池机制Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;
第3层是最上层,也就是我们对Python对象的直接操作;
在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:
如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.
这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.
经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
 
函数方法使用类题目1.Python里面如何生成随机数?
答:random模块
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值 。
随机实数:random.random( ):返回0到1之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数 。
2.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查
3.如何在一个function里面设置一个全局的变量?
答:解决方法是在function的开始插入一个global声明:
def f()global x4.单引号,双引号,三引号的区别
答:单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释
如果要表示Let’s go 这个字符串
单引号:s4 = ‘Let’s go’双引号:s5 = “Let’s go”s6 = ‘I realy like“python”!’这就是单引号和双引号都可以表示字符串的原因了
5.find和grep的区别?
grep命令是一种强大的文本搜索工具,grep搜索内容串可以是正则表达式,允许对文本文件进行模式查找 。如果找到匹配模式,grep打印包含模式的所有行 。
find通常用来在特定的目录下搜索符合条件的文件,也可以用来搜索特定用户属主的文件 。
6.使用 has 或 is 前缀命名布尔元素
is_connect = True
has_member = False
7.用复数形式命名序列
members = ['user_1', 'user_2']
8. 用显式名称命名字典
person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
9.python 中 yield 的用法?
答: yield简单说来就是一个生成器,这样函数它记住上次返 回时在函数体中的位置 。对生成器第 二次(或n 次)调用跳转至该函 次)调用跳转至该函 数 。
爬虫和数据库1.你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?
Python自带:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能 。
urllib2.:urllib2.urlopen可以接受一个Request对象或者url,(在接受Request对象时候,并以此可以来设置一个URL 的headers),urllib.urlopen只接收一个url
urllib 有urlencode,urllib2没有,因此总是urllib,urllib2常会一起使用的原因
scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程,twisted的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100个网站,并发及分布式处理方面,不够灵活,不便调整与括展 。
request 是一个HTTP库,它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现.
2.scrapy和scrapy-redis有什么区别?为什么选择redis数据库?
1) scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式 。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合 。


推荐阅读