python 全栈 11 期月考题
1、常用字符串格式化有哪些?并说明他们的区别
2、请手写一个单例模式(面试题)
3、利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题)
4、python 中 search()和 match()的区别(面试题)
5、写一个闭包函数 clo,接收整数参数 n ,返回一个函数 foo,foo 函数的功能是把 foo 参数和 n 相乘并把结果返回。
6、# 取出 html 中的歌手名和歌名
提示:沧海一声笑
html = '''<div id="songs-list"><h2 class="title">经典老歌</h2><p class="introduction">经典老歌列表</p><ul id="list" class="list-group"><li data-view="2">一路上有你</li><li data-view="7"><a href="/2.mp3" singer="任贤齐">沧海一声笑</a></li><li data-view="4" class="active"><a href="/3.mp3" singer="齐秦">往事随风</a></li><li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li><li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li><li data-view="5"><a href="/6.mp3" singer="邓丽君">但愿人长久</a></li></ul></div>'''
7、请写出函数式编程 filter、map 的实例。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]过滤出列表的所有奇数(filter)
[1,2,3,4,5]计算出每个元素的平方(map)
8、简述 Python 垃圾回收机制
9、用最简洁的方式生成这样一个列表【4,16,32,64,128】
10、简述 python GIL 的概念, 以及它对 python 多线程的影响?。
11、写一段程序逐行读取一个文本,并在屏幕上输出
12、如何用 Python 删除一个文件,创建一个文件夹
13、什么是”并发“?什么是”并行“?
14、描述 Event 的执行机制
15、什么是粘包,如何避免?
16、叙述 TCP、UDP 的区别
17、叙述 OSI 七层协议是什么,三次握手,四次挥手分别是什么
18、简述你对管道、队列的理解;
19、编程题;写一个装饰器实现功能:打印程序的运行时间
20、写一个简单的 Python socket 服务端和客户端
21、使用 python 简单实现打印九九乘法表
优化版:使用一行代码实现九九乘法表
22、 请找出以下代码的问题。提示:5 处
#Python3 环境class dummyclass(object):def __init__(self):self.is_d = Truepassclass childdummyclass(dummyclass):def __init__(self, isman):self.isman = isman@classmethoddef can_speak(self): return True@propertydef man(self): return self.ismanif __name__ == "__main__":object = new childdummyclass(True)print object.can_speak()print object.man()print object.is_d
23、爬虫程序中有如下代理池,请随机选择一个代理。
PROXIES = [{'ip_port': '111,11,221,32:80', 'user_pass': ''},{'ip_port': '12.75.44.55:8120', 'user_pass': ''},{'ip_port': '64.34.11.22:3330', 'user_pass': ''},{'ip_port': '64.23.4.11:1025', 'user_pass': ''},{'ip_port': '55.31.121.11:80', 'user_pass': ''},]
24、编写程序输入一个字符串,返回倒叙的结果,如:’abcdef’,返回’fedcba’
25、编程题
“””
一:定义一个学生类。有下面的类属性:
1 姓名
2 年龄
3 成绩(语文,数学,英语)[每课成绩的类型为整数]
类方法:
1 获取学生的姓名:get_name() 返回类型:str
2 获取学生的年龄:get_age() 返回类型:int
3 返回 3 门科目中最高的分数。get_course() 返回类型:int
写好类以后,可以定义 2 个同学测试下:
zm = Student(‘zhangming’,20,[69,88,100])
返回结果:
zhangming
20
100
“””
26、描述多进程开发中 join 与 daemon。
27、什么是异步,什么是异步阻塞?
28、写一个程序,包含十个线程,子线程必须等待主线程 sleep 10 秒钟之后才执行,并打印当前时间
29、请解释以下代码的输出结果。
z = [lambda x:x*i for i in range(3)]x = [o(2) for o in z]print x
30、写出程序,实现 socket 聊天并发实例,包含服务端、客户端
31、叙述进程、线程、协程的区别
32、
class Foo:country = '中国'print(country)def __init__(self,name,country):self.name = nameself.country = countryalex = Foo('alex','印度')Foo.country = '泰国'print(Foo.country)print(alex.country)
说出打印顺序和内容,并解释原因
答案:
1、常用字符串格式化有哪些?并说明他们的区别
1.%s 表示一个字符串占位符,%d表示一个数字
举例:
name = ‘alex’
print(‘%s 在北京’%name)
2.format() 使用格式化函数,{}表示一个占位符
举例:
name = ‘alex’
print(‘{} 在北京’.format(name))
2、请手写一个单例模式(面试题)
class B:__instance = Nonedef __new__(cls, *args, **kwargs): # cls表示类if cls.__instance is None: # 判断类变量__instance是否为Noneobj = object.__new__(cls) # 创建一个实例对象cls.__instance = obj # 赋值return cls.__instance # 返回私有静态属性a = B()b = B()print(a)print(b)
3、利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题)
import datetimenow = datetime.datetime.now()d2 = now - datetime.timedelta(days=1)print(d2.strftime("%Y-%m-%d"))
4、python 中 search()和 match()的区别(面试题)
search() 从整个文本中去搜索,结果只会返回一次。如果有多个结果,只会返回第一个结果
match() 从左到右进行匹配,返回结果
5、写一个闭包函数 clo,接收整数参数 n ,返回一个函数 foo,foo 函数的功能是把 foo 参数和 n 相乘并把结果返回。
def clo(n):number = ndef foo(m):nonlocal numberret = m * numberreturn retreturn foon = 3m = 4ret = clo(n)print(ret(m))
6、# 取出 html 中的歌手名和歌名
提示:沧海一声笑
html = '''<div id="songs-list"><h2 class="title">经典老歌</h2><p class="introduction">经典老歌列表</p><ul id="list" class="list-group"><li data-view="2">一路上有你</li><li data-view="7"><a href="/2.mp3" singer="任贤齐">沧海一声笑</a></li><li data-view="4" class="active"><a href="/3.mp3" singer="齐秦">往事随风</a></li><li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li><li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li><li data-view="5"><a href="/6.mp3" singer="邓丽君">但愿人长久</a></li></ul></div>'''
import reret = re.findall('singer=(.*?)>(.*?)<',html)print(ret)
7、请写出函数式编程 filter、map 的实例。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]过滤出列表的所有奇数(filter)
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]li_new = []ret = filter(lambda x:x%2 !=1,li)#print(ret)for i in ret:li_new.append(i)#print(i)print(li_new)
[1,2,3,4,5]计算出每个元素的平方(map)
li_2 = [1,2,3,4,5]ret = map(lambda x:x**2,li_2)#print(ret)li_2_new = []for i in ret:li_2_new.append(i)#print(i)print(li_2_new)
8、简述 Python 垃圾回收机制
当一个变量在指定时间里面,如果没有被调用或者修改。那么python就会销毁这个变量,节约内存。
9、用最简洁的方式生成这样一个列表【4,16,32,64,128】
li_1 = [2]li_2 = [i for i in range(4,8)]li_3 = li_1+li_2li = []for i in li_3:li.append(2**i)print(li)
10、简述 python GIL 的概念, 以及它对 python 多线程的影响?
GIL是python解释器全局锁。针对一个进程中,有多个线程时,同一时间,只能有一个线程访问CPU
在多线程中会影响执行效率,为了避免这种问题,需要采用多进程。
11、写一段程序逐行读取一个文本,并在屏幕上输出
with open('gequ',encoding='utf-8') as f:for i in f:print(i)
12、如何用 Python 删除一个文件,创建一个文件夹
删除文件 os.remove()
创建文件夹 os.mkdir()
13、什么是”并发“?什么是”并行“?
并发是在一段时间内执行的
并行是在同一时刻执行的
14、描述 Event 的执行机制
事件用于主线程控制其他线程的执行
当状态为True,wait方法下面的代码直接执行,当状态为False,wait方法下面的代码就会阻塞
15、什么是粘包,如何避免?
1.当数据太大,一次性发不完时,就会出现粘包
2.指定一个协议,包含数据总大小以及每次接收的大小。客户端根据接收大小来接收
3.当最终接受的数据达到数据总大小就停止
16、叙述 TCP、UDP 的区别
- TCP是面向连接、可靠的字节流服务
UDP是面向数据包的
TCP可靠传输,UDP是不可靠的
TCP 连接时,双方之间必须建立一个TCP连接
UDP 双方不需要建立一个连接
17、叙述 OSI 七层协议是什么,三次握手,四次挥手分别是什么
七层协议: 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
三次握手:
第一次,客户端向服务器发送seq请求,
第二次,服务器收到seq请求,并发送seq+1数据包,再发送ack确认包
第三次,客户端收到ack+1数据包
四次挥手:
第一次:客户端发送fin数据包,表示断开
第二次:服务器收到fin数据包,回复fin+1,表示收到了
第三次:服务器发送fin,表示断开
第四次:客户端收到fin+1,断开连接。
18、简述你对管道、队列的理解;
管道: 支持双向通信,在进程之间通信的工具
队列:它是一个容器,内置了锁来保证队列中的每一个数据都不会被多个进程重复取
19、编程题;写一个装饰器实现功能:打印程序的运行时间
import timedef timmer(f):def inner(*args,**kwargs):start_time = time.time()ret = f(*args,**kwargs)end_time = time.time()print('函数运行花费了%s'%(end_time-start_time))return retreturn inner@timmerdef func():time.sleep(1)return 11ret = func()print(ret)
20、写一个简单的 Python socket 服务端和客户端
服务端:
import socketsk = socket.socket()sk.bind(('127.0.0.1',9000))sk.listen()conn, addr = sk.accept()msg = conn.recv(1024).decode('utf-8')print('收到一条消息:%s'%msg)
客户端:
import socketsk = socket.socket()sk.connect(('127.0.0.1', 9000))sk.send('hello'.encode('utf-8'))ret = sk.recv(1024).decode('utf-8')print('收到一条消息%s'%ret)sk.close()
21、使用 python 简单实现打印九九乘法表
优化版:使用一行代码实现九九乘法表
for i in range(1, 10):for j in range(1, i + 1):print('{}x{}={}\t'.format(j, i, i * j), end='')print('\n')
22、 请找出以下代码的问题。提示:5 处
#Python3 环境class dummyclass(object):def __init__(self):self.is_d = Truepassclass childdummyclass(dummyclass):def __init__(self, isman):self.isman = isman@classmethoddef can_speak(self): return True@propertydef man(self): return self.ismanif __name__ == "__main__":object = new childdummyclass(True) # 第一处,实例化语法不对print object.can_speak() # 第二处,print语法不对print object.man() # 第三处,print语法不对。第四处,调用man,不需要加括号。正确的应该是object.manprint object.is_d # 第五处,print语法不对
23、爬虫程序中有如下代理池,请随机选择一个代理。
PROXIES = [{'ip_port': '111,11,221,32:80', 'user_pass': ''},{'ip_port': '12.75.44.55:8120', 'user_pass': ''},{'ip_port': '64.34.11.22:3330', 'user_pass': ''},{'ip_port': '64.23.4.11:1025', 'user_pass': ''},{'ip_port': '55.31.121.11:80', 'user_pass': ''},]
代码如下:
import randomPROXIES = [{'ip_port': '111,11,221,32:80', 'user_pass': ''},{'ip_port': '12.75.44.55:8120', 'user_pass': ''},{'ip_port': '64.34.11.22:3330', 'user_pass': ''},{'ip_port': '64.23.4.11:1025', 'user_pass': ''},{'ip_port': '55.31.121.11:80', 'user_pass': ''},]print(PROXIES[random.randint(0,len(PROXIES)-1)])
24、编写程序输入一个字符串,返回倒叙的结果,如:’abcdef’,返回’fedcba’
str1 = 'abcdef'li = list(str1)li.reverse() # 翻转#print(li)str2 = ''.join(li)print(str2)
25、编程题
“””
一:定义一个学生类。有下面的类属性:
1 姓名
2 年龄
3 成绩(语文,数学,英语)[每课成绩的类型为整数]
类方法:
1 获取学生的姓名:get_name() 返回类型:str
2 获取学生的年龄:get_age() 返回类型:int
3 返回 3 门科目中最高的分数。get_course() 返回类型:int
写好类以后,可以定义 2 个同学测试下:
zm = Student(‘zhangming’,20,[69,88,100])
返回结果:
zhangming
20
100
“””
class Student(object):def __init__(self,name,age,score):self.name = nameself.age = ageself.score = scoredef get_name(self):return self.namedef get_age(self):return int(self.age)def get_course(self):return max(self.score)zm = Student('zhangming',20,[69,88,100])print(zm.get_name())print(zm.get_age())print(zm.get_course())
26、描述多进程开发中 join 与 daemon。
join 主线程等待子进程执行完
daemon 表示守护进程,它会随着主进程的结束而结束。
27、什么是异步,什么是异步阻塞?
异步:是不需要等待被依赖的任务完成
异步阻塞: 异步执行时,它依赖一个消息通知,才能执行下一步
28、写一个程序,包含十个线程,子线程必须等待主线程 sleep 10 秒钟之后才执行,并打印当前时间
import timefrom threading import Threaddef func():print(111)if __name__ == '__main__':print('执行之前',time.strftime('%Y-%m-%d %H:%I:%S'))time.sleep(10)t_lst = []for i in range(10):t = Thread(target=func)t.start()t_lst.append(t)for th in t_lst:th.join()print('执行之后', time.strftime('%Y-%m-%d %H:%I:%S'))
29、请解释以下代码的输出结果。
z = [lambda x:x*i for i in range(3)]x = [o(2) for o in z]print(x)
输出结果为:[4,4,4]
解释:
首先执行:
z = [lambda x:x*i for i in range(3)]
它内部执行了3次,因为range(3),表示3个数字,分别是0,1,2
第一次i=0,第二次i=1,第三次i=2
最终i=2
所以z是一个列表,列表的每一个元素都是lambda函数,也就是lambda x:x*2
类始于函数
def func(x):return x*2
再执行下面这句:
x = [o(2) for o in z]
o(2) 表示给lamba函数传参,参数为2
for o in z 表示遍历z列表,由于列表一个元素都是lambda函数
执行lambda函数时,x为2。相当于执行func函数,return 2*2,所以结果为4
由于z有3个元素,所以执行了3次
那么最终结果为[4,4,4]
30、写出程序,实现 socket 聊天并发实例,包含服务端、客户端
服务端:
import socketfrom threading import Threadsk=socket.socket()sk.bind(('127.0.0.1',9898))sk.listen(5)def action(conn,addr):while True:data=conn.recv(1024).decode('utf-8')print(data)conn.send('{}{}{}'.format('server->',addr,data).encode('utf-8'))if __name__ == '__main__':while True:conn,addr=sk.accept()p=Thread(target=action,args=(conn,addr))p.start()
客户端:
import socketsk=socket.socket()sk.connect(('127.0.0.1',9898))while True:msg=input('>>: ').strip()if not msg:continuesk.send('{}{}'.format('client:',msg).encode('utf-8'))data=sk.recv(1024).decode('utf-8')print(data)
31、叙述进程、线程、协程的区别
将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程
进程是资源分配的最小单位,
线程是CPU调度的最小单位.
每一个进程中至少有一个线程
线程是轻量级的进程
线程的创建和销毁所需要的时间开销都非常小
线程直接使用进程的内存
线程不能独立存在,要依赖于进程
进程是是CPU的
协程比线程更轻量级
协程是线程的一部分
在一个线程中可以开启很多协程
在执行过程中,遇到I/O操作就冻结当前位置
32、
class Foo:country = '中国'print(country)def __init__(self,name,country):self.name = nameself.country = countryalex = Foo('alex','印度')Foo.country = '泰国'print(Foo.country)print(alex.country)
说出打印顺序和内容,并解释原因
输出内容为:
中国
泰国
印度
1.在实例化时,输出中国
2.Foo.country = ‘泰国’修改了类的静态属性。
print(Foo.country)执行,输出泰国
3.print(alex.country),表示从alex对象中查找country属性。
由于在实例化时,alex对象的属性已经有了country,所以输出 印度
第 29 题讲解:
z = [lambda x:x*i for i in range(3)]x = [o(2) for o in z]print(x)
先来讲一个概念
生成器表达式和列表推导式的区别:
生成器表达式是要一个值计算一个值
列表表达式是一次把所有的值都拿出来
步骤分解:
i = None # 定义空变量,否则下面引用i会报错def func(x): # 模拟lambda表达式return x*iz = [] # 模拟列生成式for i in range(3):z.append(func) # 追加到列表中print(z) # 打印zfor o in z: # 遍历zprint(locals()) # 打印局部变量print('lambda结果',o(2)) # o(2)表示执行函数func,并传一个参数2
执行输出:
[
{‘z’: [
lambda 结果 4
{‘z’: [
lambda 结果 4
{‘z’: [
lambda 结果 4
从结果中,可以看出:每一个 lambda 里面的 i 都是 2
那么结果必然是 4,4,4
也就是说,
z = [lambda x:x*i for i in range(3)]
执行之后,i 已经固定死了。它就是 2
看 debug,就可以看出来。

