s10_python_examination
#!/usr/bin/env python # -*- coding: utf-8 -*- # @author: Wu # @date:18-9-25 def paper(): pass """ 复习:6,12,13,19,20,23 Python10期考试题 1、常用字符串格式化有哪些?并说明他们的区别(6) 2、请写出【元祖,列表,字典,集合】的定义方法、新增方法、更改方法、删除方法(4) 3、利用 python打印前一天的本地时间,格式为‘2018-01-30’(面试题)(5) 4、python中search和match的区别(面试题)(5) 5、什么是1ambda函数,有什么好处(2) 6、说明__init__和__new__的作用(2) 7、简述反射是怎么回事?(3) 8、解释python中深拷贝和浅拷贝的区别(3) 9、用最简洁的方式生成这样一个列表【4,16,32,64,128】③) 10、python中如何实现随机数并打印,默认的随机数范围是多少?(2) 11、新式类和经典类(旧式类)的区别(一种一分)(2) 12、装饰器什么时候被执行的(3) 13、什么是"并发"?什么是"并行"?(2) 14、以个人理解描述 Event 的执行原理(2) 15、什么是粘包,如何避免?(3) 16、什么是进程?(2) 17、什么是线程?(2) 18、简述你对管道、队列的理解;(3) 19、编程题;写一个装饰器实现功能:打印程序的运行时间(5) 20、读以下代码,写出答案并简述原因(面试题建议不用电脑)(5) 下面代码会输出什么: def f(x,l=[]): for i in range(x): l.append(i * i) print(l) f(2) f(3, [3, 2, 1]) f(3) 21、使用 python简单实现打印九九乘法表(3) 22、简述 python GIL的概念,以及它对 python多线程的影响?(2) 23、写一个单例模式(4) 24、编程题:将以下1ist3的格式转换成1ist4格式(8) list3 = [ {"name": "alex", "hobby": "smoking"}, {"name": "alex", "hobby": "drinking"}, {"name": "alex", "hobby": "perm"}, {"name": "alex", "hobby": "Massage"}, {"name": "egon", "hobby": "singing"}, {"name": "egon", "hobby": "dancing"}, ] list4=[ {"name":"alex" hobby_list":["smoking","drinking","perm"," Massage"]}, {"name":"egon"," hobby_list":["singing","dancing"]} ] 25、编程题(7) 定义一个学生类。有下面的类属性 1姓名 2年龄 3成绩(语文,数学,英语)[每课成绩的类型为整数] 类方法 1获取学生的姓名: get_name()返回类型:str 2获取学生的年龄: get_age()返回类型:int 3返回3门科目中最高的分数。 get_course()返回类型:int 写好类以后,可以定义2个同学测试下 zm=Student("zhangming",20,[69, 88, 100J) 返回结果 zhangming 20 100 """ """ 26、写一个 socket客户端和服务端兵进行通讯(4 27、什么是异步,什么是异步阻塞?(2) 28、写一个程序,包含十个线程,子线程必须等待主线程s1eep10秒钟之后才执行,并打印当前时间(5) 29、你所了解的锁都有哪些?(2) 30、 threading.RLock和 threading.Lock的区别 """ def test1(): print("%s %d #语法糖") print("format #直接调用函数") def test3(p=1): """ important :return: """ if p == 1: import time import datetime print(datetime.date.fromtimestamp(time.time() - 3600 * 24)) elif p == 2: import time print(time.strftime("%Y-%m-%d", time.localtime(time.time() - 3600 * 24))) def test4(): """ important :return: """ # answer """ match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回, 如果不是开始位置匹配成功的话,match()就返回none """ import re print(re.match('super', 'superstition').span()) print(re.match('super', 'isuperstition')) print(re.search('super', 'isuperstition').span()) pass def test5(): print("5、什么是1ambda函数,有什么好处(2)") print("匿名函数,简洁明了;可以和内置函数合用,有效减少冗余代码") def test6(): print("6、说明__init__和__new__的作用(2)") print("__init__#是初始化方法;对象初始化时执行的方法 ") print("__new__ #是构造方法; 继承自object的新式类才有__new__方法," "__new__至少要有一个参数cls,代表要实例化的类" "__new__() 方法会返回cls(cls指代当前类)的实例,然后该类的__init__()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数") print("__del__ #是析构方法,删除一个对象之前执行的方法") def test7(): print("7、简述反射是怎么回事?") print("用字符串类型的变更名或函数名来调用对应的属性") def test8(): print("8、解释python中深拷贝和浅拷贝的区别") print("深拷贝:不管数据类型有多少层,都开僻新的内存空间来存储一份与原来数据一样的数据") print("浅拷贝:只新开僻一块空间来存第一层数据") def test9(p=1): if p == 1: def f(x): return 4 if x < 4 else 2 ** x print("1st answer:", [f(i) for i in range(3, 8)]) elif p == 2: print("2nd answer:", list(map(lambda x: 4 if x < 4 else 2 ** x, [i for i in range(3, 8)]))) elif p == 3: print("3rd answer:", [4 if i < 4 else 2 ** i for i in range(3, 8)]) elif p == 4: print("4th answer:", [4 if i == 3 else 2 ** i for i in range(3, 8)]) elif p == 5: print("5th answer:", [4 if i == 3 else pow(2, i) for i in range(3, 8)]) def test10(): print("10、python中如何实现随机数并打印, 默认的随机数范围是多少?(2)") print("import random") print("random.random() #默范围是在0-1之间的数") def test11(): print("11、新式类和经典类(旧式类)的区别") print("新式类:默认继承object,在继承过程中寻找一个方法时默认遵循广度优先,内置mro方法来标识广度优先的顺序") print("经典类:在继承过程中寻找一个方法时默认遵循深度优先") def test12(): print("12、装饰器什么时候被执行的") print("加载函数的时候被执行") print("for example:") def time_log(f): def wrapper(*args, **kwargs): print("in time log func") res = f(*args, **kwargs) return res return wrapper @time_log def func(strings): print("hello", strings) func("test") def test13(): print('13、什么是"并发"?什么是"并行"?') print("并发:在同一时候,只有一个CPU在处理任务") print("并行:真正意义上的在同一时刻,有多个CPU在处理任务,即同时在运行") print("在python中:多线程是并发,多进程是并行") print("在python中:多进程在同一时刻可以占用多个CPU执行") print("在python中:多线程看起来是在同时执行,但是GIL的限制,在同一时刻只有一个线程给到CPU执行") def test14(): print("以个人理解描述 Event 的执行原理") print("在多进程或多线程中,Event对像有True和False两个状态,分别控制wait方法是否阻塞,如果状态是True,wait()就非阻塞状态,如果是False,则阻塞") print("在多进程中,Event之所以能通信,是因为基于IPC") print("在多线程中,Event之所以能通信,是因为主线程与子线程本身就是可以通信的") def test15(): print("15、什么是粘包,如何避免?") print("粘包:TCP协议是面向流连接的数据传输协议,传输数据是无边界的") print("避免粘包:自定义协议;python中可以使用struct模块;UDP没有粘包问题") def test16(): print("16、什么是进程?") print("运行中的程序") print("是最小的资源分配单位") print("是多个任务之间数据安全和内存隔离的约束") def test17(): print("17、什么是线程?") print("CPU调度的最小单位") print("是进程的一部份,可以共享进程中的数据") def test18(): print("18、简述你对管道、队列的理解;") print("管道:python中,双向通信的数据容器,多进程中的IPC中用到,数据不安全") print("队列:python中,先进先出,基于管理和锁实现的一个可以在进程/线程中传递数据的容器,数据安全") def test19(): import time def log_time(fun): def wrapper(*args, **kwargs): start_time = time.time() res = fun(*args, **kwargs) print(time.time() - start_time) return res return wrapper @log_time def func(): print("hello") func() def test20(): """ 20、读以下代码,写出答案并简述原因(面试题建议不用电脑)(5) 下面代码会输出什么: def f(x,l=[]): for i in range(x): l.append(i * i) print(l) f(2) f(3, [3, 2, 1]) f(3) :return: """ def f(x, l=[]): for i in range(x): l.append(i * i) print(l) f(2) f(3, [3, 2, 1]) f(3) print("因为经过第一次f(2)之后,默认参数l的值已经是[0,1]") def test21(p=1): if p == 2: for i in range(1, 10): for k in range(1, i): print(end=" ") for j in range(i, 10): print("%d*%d=%2d" % (i, j, i * j), end=" ") print("") elif p == 1: for i in range(1, 10): for j in range(i, 10): print("%d*%d=%2d" % (i, j, i * j), end=" ") print("") elif p == 3: for i in range(1, 10): for j in range(1, i + 1): print("%d*%d=%2d" % (j, i, i * j), end=" ") print("") elif p == 4: for i in range(1, 10): for k in range(1, 10 - i): print(end=" ") for j in range(1, i + 1): print("%d*%d=%2d" % (j, i, i * j), end=" ") print("") def test22(): print("22、简述 python GIL的概念,以及它对 python多线程的影响?(2)") print("python GIL即python全局解释器锁") print("用来在Cpython解释器解释一段多线程代码时,约束线程在同一时刻只能有一个线程访问CPU") print("对python多线程的影响:在Cpython解释器下启动的多线程并不能真正的实现并行") def test23(): print("23、写一个单例模式(4)") print("") def test24(p=1): list3 = [ {"name": "alex", "hobby": "smoking"}, {"name": "alex", "hobby": "drinking"}, {"name": "alex", "hobby": "perm"}, {"name": "alex", "hobby": "Massage"}, {"name": "egon", "hobby": "singing"}, {"name": "egon", "hobby": "dancing"}, ] list4 = [] if p == 1: # 方法一: tmp_dic = {} for item in list3: if not tmp_dic.get(item["name"]): tmp_dic[item["name"]] = [] tmp_dic[item["name"]].append(item["hobby"]) for key in tmp_dic: list4.append({"name": key, "hobby_list": tmp_dic[key]}) print(list4) elif p == 2: # 方法二 for item in list3: for dic in list4: if dic["name"] == item["name"]: dic["hobby_list"].append(item["hobby"]) break else: list4.append({"name": item["name"], "hobby_list": [item["hobby"]]}) print(list4) def test25(): class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score def get_name(self): pass def get_age(self): pass def get_course(self): return '{name}\n{age}\n{max_score}\n"""'.format(name=self.name, age=self.age, max_score=max(self.score)) zm = Student("zhangming", 20, [69, 88, 100]) print(zm.get_course()) def test28(p=1): if p == 1: #使用非阻塞式的timer计时器的解法 from threading import Timer import datetime def func(): print(datetime.datetime.now()) for i in range(10): Timer(10, func).start() #非阻塞式的计时器 print(datetime.datetime.now()) elif p == 2: #不符合题要求的解法,主线程是阻塞的,相当于主线程等待,而非子线程等待 from threading import Thread import datetime import time def func(): print(datetime.datetime.now()) t_list = [] for i in range(10): t = Thread(target=func) t_list.append(t) print(datetime.datetime.now()) time.sleep(10) for t in t_list: t.start() t.join() def test29(): print("29、你所了解的锁都有哪些?(2)") print("互斥锁:from multiprocessing/threading import Lock") print("递归锁:from multiprocessing/threading import RLock") def test30(): print("30、threading.RLock和 threading.Lock的区别?(2)") print("互斥锁:在同一个线程或进程之间,当有两个acquire的时候,就会产生死锁") print("递归锁:在同一个线程或进程之间,无论acquire多少次,也不会产生死锁,但要注意的是acquire多少次,就需要release多少次后,其它线程或进程才能使用锁的数据")