1、__init__和__new__的区别:
__init__方法发生在__new__方法之后,是初始化一个新实例,控制整个实例初始化过程;__new__方法属于控制新实例生成的过程,属于类级别的方法。
__new__方法需要有返回值,返回类的实例,它的作用可以修改父类的一些不可更改的参数。
2、简述with方法打开处理文件帮我我们做了什么?
open方法没有做异常判断,需要写try,except以及finally;而with方法帮我们实现了这些。
3、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
l = [1, 2, 3, 4, 5]
def f(x):
return x**2
res = map(f, l)
res = [i for i in res if i > 10]
4、python中生成随机整数、随机小数、0--1之间小数方法
随机整数:random.randint(a, b)
随机小数:np.random.randn(5)
0-1之间小数:random.random()
5、避免转义给字符串加哪个字母表示原始字符串?
字符串前面加r表示普通字符串。
6、python中断言方法举例
直接用assert(expression)
7、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student
8、10个Linux常用命令
ls cp pwd cp rm mkdir mv touch echo grep cat
9、pyhon2 和 python3区别?
(1)print 函数,python2可以带小括号,也可以不用;python3需要带小括号
(2)python2 range(1, 10)返回列表,python3返回迭代器
(3)python2使用ascii编码,python3使用utf-8编码
(4)python2中unicode表示字符串序列,str表示字节序列
python3中str表示字符串序列,byte表示字节序列
(5)python2为了正常显示中文,引入coding声明,python3中不需要
(6)python2中是raw_input()函数,python3是input()函数
10、python中is和==的区别:
python中元素包含三个要素,分别是id(身份标识)、type(数据类型)和value(值)。
“==”比较的是value的值
“is”比较的id的值
11、简述read、readline、readlines的区别:
read读取整个文本
readline读取下一行数据
readlines读取整个文件到迭代器以便我们遍历
12、举例说明创建字典的至少两种方法:
第一种方法:
dict1 = {key1:v1, key2:v2}
第二种方法:
dict2 = {}
dict2[key1] = v1
dict2[key2] = v2
第三种方法:
dict3 = {key1=v1, key2=v2}
13、*args,**kwargs的作用是什么?如何使用?
*args,**kwargs在函数的定义里,
*args可以传入不定量个数的非关键字参数用元组的形式,**kwargs可以传入不定量个数的关键字参数用字典的形式
14、python中match()和search()的区别?
math是从字符串头开始匹配,search是从字符串中查找。
15、一个函数接收文件夹的名称作为参数,返回该文件中所有文件的全路径,请补全缺失的代码。
def print_directry_contents(spath):
import os
files_list = os.listdir(spath)
for file in files_list:
print(os.path.realpath(file))
16、阅读下面的代码,写出A0,A1至An的最终值:
A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A0 = {'a':1,'b':2,'c':3,'d':4,'e':5}
A1 = range(10)
A1 = [0,1,2,3,4,5,6,7,8,9]
A2 = [i for i in A1 if i in A0]
A2 = [] # 当对字典进行in判断是,判断的是key
A3 = [A0[s] for s in A0]
A3 = [1,2,3,4,5]
A4 = [i for i in A1 if i in A3]
A4 = [1,2,3,4,5]
17、请写一段代码实现Python中list去重。
list1 = [1, 1, 2, 2, 3]
set1 = set(list1)
list1 = list(set1)
print list1
18、创建一个装饰器将下面函数输入的字符串首字母大写。
def decoration(func):
def wrapper(*args, **kwargs):
msg = func(*args, **kwargs)
msg = msg.capitalize()
return msg
return wrapper
@decoration
def greetings(word="Hi There"):
return word.lower()
if __name__ == '__main__':
print(greetings(word='HELLO, WORLD! '))
19、描述yield作用。
yield在python中是生成器,不能直接调用,只能通过next()方法调用;每次返回一个迭代值,可以避免存list循环内存过大。
20、装饰器。
装饰器本质上python函数,它可以让其他函数在没有任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。
21、你对多线程和多进程的理解。
进程是指系统中正在运行的一个应用程序;专业的说它是程序执行的一个实例,既它是程序已经执行到各种程度的数据结构汇合;从内核的角度看,进程的目的就是担任分配资源(CPU时间、内存等)的基本单元。
进程的五个方面:
动态性:进程的实质是一次执行,进程是动态产生,动态消亡的。
并发性:任何进程都可以和其他进程一起并发。
独立性: 进程是一个能够独立运行的基本单位,同时也是系统分配资源和调度的独立单元。
异步性:由于系进程的相互制约,使进程具有执行的间断性。
结构特性:进程由程序、数据和进程控制三部分组成。
线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。
线程有四个特点:
1、线程有独立的堆栈段,共享地址空间,开销较小,切换速度较快。
2、线程间的通信机制比较方便。
3、线程数不大于CPU数时,不同线程可以运行在不同CPU上,使得CPU使用更加有效。
4、线程改善了程序结构,避免了一些嵌套循环。
使用线程的两点注意事项:
1、当多线程访问同一全局变量时,一定要加互斥量,也就是上锁,当然使用完后需要解锁。
2、线程的终止,线程资源不会释放,需要调用join()函数使其释放。
22、线程中start方法和run方法的区别?
若调用start,则先执行主进程,后执行子进程;
若调用run,相当于正常的函数调用,将按照程序的顺序执行;
23、linux命令 grep awk sed是怎么用的?
grep是查找
awk根据内容分析处理
sed编辑
24、python是怎么进行内存管理的?
(1)引用计数:Python内部记录有多少个对象就有多少个引用计数,当对象被创建时就创建时就创造一个引用计数,当对象不需要时,引用计数清0。
引用计数加1:1、对象被创建:x=4,2、另外的别人被创建:y=x,3、被作为参数传递给函数:foo(x),4、作为一个容器对象的一个元素:a=[1,x,'33']
引用计数减1:1、一个本地引用离开了它的作用域,2、对象的别名被销毁,3、对象的一个别名被赋值给其他的对象:x=789,4、对象从一个窗口中移除:myList.remove(x),5、窗口对象本身被销毁:del myList,或者窗口对象离开了它的作用域。
(2)垃圾回收:当内存中有不使用的部分,垃圾收集器也会把他们清理掉;它会去检查那些引用计数为0的对象,然后清除其在内存的空间;两个对象互相引用时,他们本身其他的引用也全部为0;清理掉循环引用的两个对象。
(3)内存池机制:Python中很多小块的内存,这些内存很快又会被释放,为了提高程序执行速度,Python引入了内存池机制。小于256个字节的对象用pymalloc实现分配,而大的对象使用系统的malloc。Python对象都有私有内存池,对象间不共享内存池,也就是分配或释放大量整数,用于缓存这些整数的内存就不能存浮点数。
25、什么是lambda函数?他有什么好处?
lambda函数是匿名函数;使用lambda函数能够创建小型匿名函数。
f = lambda x,y: x + y
26、python中tuple和list的转换:
tuple ----> list:
tuple1 = (1, 2, 3)
list1 = list(tuple1)
list -----> tuple:
list1 = [1, 2, 3]
tuple1 = tuple(list1)
27、python中如何拷贝一个对象?
赋值(=):创建了对象的一个新的引用,修改其中任一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含了原始对象中包含项的引用。
深拷贝:创建一个新的对象,并递归复制它所包含的对象。
28、介绍下except的用法和作用:
try:
pass
except Exception as e:
print(e)
finally:
pass
捕获try except中间发生异常的代码;如果发生异常执行except代码,不管是否异常都执行finally代码。
29、用python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
<.*>是贪心匹配,返回所有匹配项;<.*?>是非贪心匹配,返回单一匹配项。
30、有没有一个工具可以帮助查找Python的bug和进行静态的代码分析?
pychecker 是一个python的静态代码分析工具,可以帮助查找python代码的bug,会对python代码的复杂度和格式提出警告。
pylink是另外一个python分析工具,
31、请写一段脚本,查找/data/test 目录下3天前的文件,从中挑选出大小超过10M的删除掉。
32、请写一段python代码,替换掉目标字符串中的[北京市,技术,有限,公司]等字符,比如:目标字符串:北京市麦达技术数字有限公司,要求替换输出 麦达数字。
str1 = "北京市麦达技术数字有限公司"
str2 = str1.replace("北京市","").replace("技术","").replace("有限","").replace("公司","")
33、有三张表分别存放省市(province),地市(city)和县区(area)的名称和编码,表名如下表格:
34、有一个纯字符串,编写一段代码,列出其所有字符的大小写组合:
def word_group(word):
word = word.lower()
list1 = []
list2 = []
for letter in word:
if not list1:
list1.append(letter)
list1.append(letter.upper())
else:
list2 = copy.deepcopy(list1)
for i in range(len(list1)):
list1[i] = list1[i] + letter
list2.append(list2[i] + letter.upper())
list2[i] = list2[i] + letter
return list2
26、简述一下你熟悉的NOSQL,它有什么优点和缺点?
27、使用一个正则表达式设计一个程序,将字符串"正则表达式题库"的www.baidu.com和www.cdtest.cn同时匹配出来。
import re
str = "\<a href=www.baidu.com\>正则表达式题库\</a>\<a href=www.cdtest.cn\>\</a>"
regex = r"href=(.*?)>"
ret_list = re.findall(regex, str)
print ret_list
28、设计一个程序,求出1+3!+5!+7!+9!+50!的和。
m = 0
for i in range(1, 6):
n = 1
for j in range(1, 2 * i):
n = n * j
m += n
l = 1
for k in range(1, 51):
l = l * k
m += l
print(m)
29、把字符串“HELLO PYTHON”从大写字母全部转换成小写字母并换行显示,然后输出到计算机c盘的hello.txt文件中保存。
str = 'HELLO PYTHON'
with open('c:/hello.txt', 'a') as f:
for letter in str:
f.write(letter.lower())
f.write('\n')
30、设计一个小程序,采用任意数据结构方法,输入年、月、日后能判定当前日期在本年是第几天。
def judge_dayth(y=None,m=None,d=None):
if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:
m_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
else:
m_list = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if m == 1:
return d
else:
m_days = 0
for i in range(m - 1):
m_days += m_list[i]
return m_days + d
31、给定一个值为整数的数组int_array,找出int_array中第二大的整数。
sorted_nums = sorted(nums)
print sorted_nums[-2]
32、使用python将字符串“1.2.3.4.5”转换为字符串“5|4|3|2|1”。
str = "1.2.3.4.5"
li = str.split(".")
li = sorted(li, reverse=True)
str = "|".join(li)
33、请分别描述python2.x和python3.x中import包时的路径搜索顺序。
(1)、当前目录
(2)、PYTHONPATH下的每个目录
(3)、如果都找不到,Python会查看默认路径。
34、用Python的正则表达式匹配时间信息。
import re
data_info = "现在的时间是:2018-3-10 11:52"
regex = r"\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{2}"
ret = re.search(regex, data_info).group()
35、使用python编写一个装饰器,打印被装饰函数的输入与输出。
from functools import wraps
def print_io(func):
@wraps(func)
def inner(*args, **kwargs):
print("函数的输入:{}".format(*args, **kwargs))
ret = func(*args, **kwargs)
print("函数的输出:{}".format(ret))
return ret
return inner
36、阐述range和xrange的区别,并且用Python仿写xrange函数。
range()生成一个数组,xrange()生成一个迭代器。
def xrange(*args,**kwargs):
for i in range(*args, **kwargs):
yield i
37、列举几种你曾经常用的python包并且解释其功能及用法:
os模块:os模块包含了函数不同操作系统的通用接口,获得路径
sys:给命令行传参
re:正则匹配
38、合并列表a=[1,2,3,4]和b=[5,6,7,8] :
a.extend(b)
39、列表a,请写出实现正序排列,倒序排列,逆序排列的内置方法。
a.sort()
a.sort(reverse=True)
a.reverse()
40、字典d={"k":1,"v":2},请写出d.items()的结果。
[('k', 1), ('v', 2)]
41、复杂列表[{"k":1,"v":2},{"k":12,"v":22},{"k":13,"v":32}],请用内置方法写出k的倒序排列的代码。
li = [{"k":1,"v":2},{"k":12,"v":22},{"k":13,"v":32}]
li.sort(key=lambda dict:dict["k"], reverse=True)
42、集合s = set([1,2,3,4]),d = set([2,4,9,0,3]),请用内置方法写出它们的并集,交集,对称公差。
交集s|d、并集s&d、对称公差s^d
43、请随机输出一个大于0小于1的数;请随机输出一个100以内的整数。
random.random()
random.randint(1,100)
44、长度未知的元组a=(1,3,4,5,6,...),请随机输出n项 。
import random a=(1,3,4,5,6,...)
a = list(a)
for i in range(n):
b = a[random.randint(0, len(a)) - 1]
a.remove(b)
45、代码a=[{i:j} for i,j in enumerate(range(5))],请写出a的最终结果。
enumerate返回index和对应的值。
46、分别说说cmp,map,filter的作用?
cmp就是compare比较两数大小。
map表示映射,(function, iterable)将function作用与iterable,返回一个list。
filter结构和map类似(function, iterable)将function作用于iterable每个元素,如果返回True,则保留该元素;如果返回False,则删除该元素。
47、写一段代码实现单例模式。
48、用yield写出一个生成器。
for i in range(5):
yield i
49、说明os、sys模块不同,并列举常用的模块方法。
os: 提供一种方便的使用操作系统的函数。
sys:提供访问解释器使用或维护的变量和在解释器交互使用的函数。
50、@classmethod、@staticmethod、@property都是啥意思?
@classmethod:类方法,需要把类本身当作参数当作该方法的第一个参数,python内置了函数把类中的函数定义成类方法。
@staticmethod:静态方法
@property:属性方法,一般将实例方法提升为有setter功能的方法
51、请解释一下Gevent和threading/multiprocessing的关系。
分别是协程、线程和多进程。
进程是具有一定独立功能的程序关于某个数据集合上的运行活动,进程是系统分配资源和独立调度的一个独立单元。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比线程更小的独立运行的基本单位。
协程是一种用户态的轻量级线程,协程的调度完全由用户控制;协程拥有自己的寄存器上下文和栈,协程切换时把寄存器上下文和栈保存在其他地方,切回来的时候恢复以前的保存的寄存器上下文和栈,直接操作栈则没有任何内核切换的开销,可以不加锁的访问全局变量,所以上下文切换速度非常快。
52、请解释一下cookie和session的关系,以及csrf的攻击和防范方法。
53、描述对super,pass,yield,lambda关键字修饰的理解。
super调用父类的一个方法
pass是一个占位符,用于保证格式和语义的完整性
yield 生成器,yield后面表达式可以通过next()方法返回
lambda是定义的匿名函数
54、进程间通讯的五种方式:
管道:速度慢、容量有限、只有父子进程能通讯;
FIFO:任何进程间都能通讯,但速度慢;
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
信号量:不能传递复杂数据,只能用来同步;
共享内存区: 能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存;