答:代码不会正常运行,抛出 TypeError 异常。
答:sys.stdout.write()方法
答:在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。
答:二者用法相同,不同:range返回列表,xrange返回生成器。xrange比range性能更好。
代码如下所示:
def get_lines():
l = []
with open(‘file.txt’,‘rb’) as f:
for eachline in f:
l.append(eachline)
return l
if __name__ == ‘__main__’:
for e in get_lines():
process(e) #处理每一行数据
现在要处理一个大小为 10G 的文件,但是内存只有 4G,如果在只修改 get_lines 函数而其他代
码保持不变的情况下,应该如何实现?需要考虑的问题都有哪些?
def get_lines():
l = []
with open(‘file.txt’,’rb’) as f:
data = f.readlines(60000)
l.append(data)
yield l
答:要考虑到的问题有:
内存只有 4G 无法一次性读入 10G 的文件,需要分批读入。分批读入数据要记录每次读入数据的位置。分批每次读入数据的大小,太小就会在读取操作上花费过多时间
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
处理语句1
except 错误类型2 [as 变量2]:
处理语句2
except Exception [as 变量3]:
不是以上错误类型的处理语句
else:
未发生异常的语句
finally:
无论是否发生异常的语句
答:会继续处理 finally 中的代码;用 raise 方法可以抛出自定义异常。
标准库
os 操作系统
time 时间模块
random 随机
pymysql 连接数据库
threading 线程
multiprocessing 进程
queue 队列
第三方库
答:在 Python 中,unittest 是 Python 中的单元测试框架。它拥有支持共享搭建、自动测试、在测试
中暂停代码、将不同测试迭代成一组,等的功能。
答:在 Python 中,模块是搭建程序的一种方式。每一个 Python 代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。
一个包含许多 Python 代码的文件夹是一个包。一个包可以包含模块和子文件夹。
Python是强类型的动态脚本语言。
解释性语言:边运行便翻译
编译型语言:翻译成机器语言后再执行
答:使用logging模块,调用logging.basicConfig()方法
Local)—>被嵌入函数作用域Enclosing locals—>Global—>内置作用域(Built-in)
答:自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.
简单一句就是运行时能够获得对象的类型.比如 type(),dir(),getattr(),hasattr(),isinstance().
答:在 Python 中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
PEP8规范
答:ls -F 在显示名称的时候会在文件夹后添加“/”,在文件后面加“*”
答:日志以文本可以存储在“/var/log/”目录下后缀名为.log
netstat -nlp | grep 80
grep 是查找匹配条件的行,find 是搜索匹配条件的文件
答:软连接类似 Windows 的快捷方式,当删除源文件时,那么软链接也失效了。硬链接可以理解为源文件的一个别名,多个别名所代表的是同一个文件。当 rm 一个文件的时候,那么此文件的硬链接数减1,当硬链接数为 0 的时候,文件被删除。
7.7 git 合并文件有冲突,如何处理?
答:a)git merge 冲突了,根据提示找到冲突的文件,解决冲突如果文件有冲突,那么会有类似的标记;
b)修改完之后,执行 git add 冲突文件名
c)git commit 注意:没有-m 选项 进去类似于 vim 的操作界面,把 conflict 相关的行删除掉直接 push 就可以了,因为刚刚已经执行过相关 merge 操作了。
类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为 cls,表示类对象,类对象和实例对象都可调用
类实例方法:是类实例化对象的方法,只有实例对象可以调用,形参为 self,指代对象本身;
静态方法:是一个任意函数,在其上方使用“@staticmethod”进行装饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系。
2.Python中如何动态获取和设置对象的属性?
if hasattr(Parent,'x'):
print(getattr(Parent,'x'))
setattr(Parent,'x',3)
print(getattr(Parent,'x'))
垃圾回收:
当某些内存块 M 经过了 3 次垃圾收集的清洗之后还存活时,我们就将内存块 M 划到一个集合A 中去,而新分配的内存都划分到集合 B 中去。当垃圾收集开始工作时,大多数情况都只对集合 B 进行垃圾回收,而对集合 A 进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合 B 中的某些内存块由于存活时间长而会被转移到集合 A 中,当然,集合 A 中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被延迟。
调优手段:
1.手动垃圾回收
2.调高垃圾回收阈值
3.避免循环引用(手动解循环引用和使用弱引用)
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。
原因:有 del() 函数的对象间的循环引用是导致内存泄漏的主凶。
解决:不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题
判断是否内存泄漏:sys.getrefcount(obj),如果返回的引用计数不为 0,说明在此刻对象 obj 是不能被垃圾回收器回收掉的。
答:Python 的参数传递有:位置参数、默认参数、可变参数、关键字参数。
函数的传值到底是值传递还是引用传递,要分情况:
答:缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。
*args 是不定长参数
**kwargs 是关键字参数
答:Python 中一切皆对象,函数名是函数在内存中的空间,也是一个对象。
答:map()方法会将 一个函数 映射到序列的每一个元素上,生成新序列返回。(函数可以传递1或多个参数)
reduce()是将传入的函数作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用(累积计算),返回一个数。(函数只能传递两个参数)
递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是 return;返回终止递归。
终止的条件:
答:回调函数是把**函数的指针(地址)**作为参数传递给另一个函数,将整个函数当作一个对象,赋值给调用的函数。
reduce(lambda x,y:x*y,range(1,n+1))
class Singleton:
def __new__(cls,*args,**kwargs):
if not hasattr(cls,"_instance"):
cls._instance =super(Singleton,cls).__new__(cls)
return cls._instance
1.2 单例模式的应用场景?
答:装饰器本质上是一个 Python 函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
import time
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
return wrapper
@timeit
def foo():
print 'in foo()'
答:装饰器本质上是一个 Python 函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。 比如:插入日志、性能测试、事务处理、缓存、权限的校验等场景 有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。
类是创建对象的模板。
答:is是通过id判断,而==是通过值判断。
创建对象自动调用
__init__ 构造器,当一个实例被创建的时候初始化的方法。但是它并 不是实例化调用的第一个方法。
__new__才是实例化对象调用的第一个方法,它只取下 cls 参数,并把 其他参数传给 __init__。 __new__很少使用,但是也有它适合的场景,尤其 是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。
__call__ 允许一个类的实例像函数一样被调用 。
__getitem__ 定义获取容器中指定元素的行为,相当于 self[key] 。
__getattr__ 定义当用户试图访问一个不存在属性的时候的行为 。
__setattr__ 定义当一个属性被设置的时候的行为 。
__getattribute__ 定义当一个属性被访问的时候的行为
答:面向对象是相对于面向过程而言的。面向过程语言是一种基于功能分析的、以算法为中心的程序设计方法;而面向对象是一种基于结构分析的、以数据为中心的程序设计思想。在面向对象语言中有一个有很重要东西,叫做类。
面向对象有三大特性:封装、继承、多态。
答:<.>是贪婪匹配,会从第一个“<”开始匹配,直到最后一个“>”中间所有的字符都会匹配到,中间可能会包含“<>”。
<.?>是非贪婪匹配,从第一个“<”开始往后,遇到第一个“>”结束匹配,这中间的字符串都会匹配到,但是不会有“<>”。
实现多进程:multiprocessing模块
【1】 将需要新进程执行的事件封装为函数
【2】 通过模块的Process类创建进程对象,关联函数
【3】 通过进程对象调用start启动进程
【4】join()等待子进程结束
实现多线程:threading模块
【1】 将需要新线程执行的事件封装为函数
【2】 通过模块的Thread类创建线程对象,关联函数
【3】 通过线程对象调用start启动线程
【4】join()等待子进程结束
答:性能要求特别高的项目,才会用到多进程、多线程,小项目用不到。如多线程写爬虫
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
线程:调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
3.什么是多线程竞争
线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:
数据几乎同步会被多个线程占用,造成数据混乱 ,即所谓的线程不安全
那么怎么解决多线程竞争问题?-- 锁。
锁的好处:
确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下
的原子操作问题。
锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
锁的致命问题:死锁。


UDP 是面向无连接的通讯协议。
TCP 是面向连接的通讯协议,通讯前三次握手建立连接,通讯完成时四次挥手断开连接。
三次握手:建立连接
四次挥手:断开连接
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

形式: scheme://host[:port#]/path/…/[?query-string][#anchor]

(5)SELECT DISTINCT
(1)FROM JOIN ON
(2)WHERE
(3)GROUP BY
(4)HAVING
(6)ORDER BY
(7)LIMIT offset number
索引的实现通常使用B_Tree,加快数据的查询速度。
优点:
缺点:
主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:
第一范式:列不可拆
第二范式:记录可以唯一区分
第三范式:外键建立在主键上
二、Redis
非关系型数据库
| 类型 | 特点 | 使用场景 |
|---|---|---|
| string | 简单key-value类型,value可为字符串和数字 | 常规计数(微博数, 粉丝数等功能) |
| hash | 是一个string类型的field和value的映射表,hash特别适合用于存储对象 | 存储部分可能需要变更的数据(比如用户信息) |
| list | 有序可重复列表 | 消息队列等 |
| set | 无序不可重复集合 | 存储并计算关系(如微博,关注人或粉丝存放在集合,可通过交集、并集、差集等操作实现如共同关注、共同喜好等功能) |
| sortedset | 每个元素带有分值的集合 | 各种排行榜 |