1 考试范围: 2 1.Python基础 3 2.数据类型 4 3.流程控制 5 4.⽂件处理 6 5.函数 7 6.⾯向对象 8 9 ############## 10 1.定义⼀个变量有三个特性,分别为? 等号⽐较的是什么? 11 is⽐较的是什么? 12 2.使⽤链式赋值的⽅式将10赋值给变量x、y、z 13 3. 有⼀个⼯资列表[3.1,2.1,4.3,2.2,1.3,9.3],请取出前两个⽉的⼯资,分别赋值给两个变量名,⽤⼀⾏代码实现 14 4.可变的数据类型有哪些,不可变的数据类型有哪些 15 5.容器类型有?序列类型有? 16 6.请说明python2与python3中的默认编码是什么? 17 7.如何保证程序不出现乱码问题? 18 8.unicode,utf-8,gbk,ascii⽤个⼏个字节表⽰英⽂,⽤⼏个字节表⽰中⽂#-*- coding:utf-8-*- 的作⽤是什么? 19 9.在python3中的str是什么编码的,如何把python3中的str转成utf-8格式的bytes 20 10.在python3中如何把utf-8格式的bytes解码成str 21 11.⽂本处理 22 r和rb的区别是什么? 23 24 解释⼀下以下三个参数的分别作⽤ 25 open(f_name,’r’,encoding="utf-8") 26 12.什么是名称空间?名称空间的加载顺序是?查找名字的顺序是? 27 13.下述结果为? 28 def f1(): x=1 29 def f2(): 30 def f3(): 31 print(x) return f3 32 return f2() func=f1() 33 def foo(): x=1000 34 func() 35 36 foo() 37 14.什么是可迭代对象,什么是迭代器对象? 38 15.迭代器对象有什么有点 39 16.简述for循环的原理 40 17.简述⾯向过程编程 41 18.⽐较两个值得⼤⼩,获得较⼤的⼀个值,⽤⼀⾏代码实现 42 19.使⽤列表⽣成式或⽣成器表达式解决下列问题 43 1、将names=[‘egon’,'alex_sb','wupeiqi','yuanhao']中的名字全部变⼤写 44 2、将names=[‘egon’,’alex_sb’,'wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度 45 3、求⽂件a.txt中最长的⾏的长度(长度按字符个数算,需要使⽤max函数 46 4、求⽂件a.txt中总共包含的字符个数?思考为何在第⼀次之后的n次sum求和得到的结果为0?(需要使⽤sum函数) 47 5、思考 48 with open('a.txt') as f: g=(len(line) for line in f) 49 print(sum(g)) #为何报错? 50 6、⽂件shopping.txt内容如下 51 mac,20000,3 52 lenovo,3000,10 tesla,1000000,10 chicken,200,1 53 54 求总共花了多少钱? 55 打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...] 求单价⼤于10000的商品信息,格式同上 56 20.有⼀个存放员⼯名与其⽉薪的字典如下 57 salaries={ 58 'egon':3000, 'alex':100000000, 59 'wupeiqi':10000, 'yuanhao':2000 60 } 61 请⽤⼀⾏代码实现 62 1、求薪资最⾼的那名员⼯姓名 63 2、将字典映射成⼀个列表,[(‘egon', 36000), ('alex', 1200000000), ('wupeiqi', 64 120000), ('yuanhao', 24000)],列表内每⼀个元素是员⼯姓名、员⼯的年薪 65 3、过滤出薪资⼤于10000的员⼯姓名 66 21.简述yield与return的相同点与不同点 67 22.简述⾯向对象与⾯向过程的以及区别? 68 23.定义OldboyTeacher、OldboyStudent、OldboyPeople、Course、Classes类,并基于继承与组合减少代码冗余 69 24.简述python继承的实现原理,什么是新式类?什么是经典类?以及新式类与经典类在属性查找上的区别? 70 25.定义⼀个People类,将⼈的bmi指数伪装成⼀个数据属性 71 26.定义⼀个People类,每个⼈有属性姓名、性别,定义打印对象的格式为[名字: 年龄] 72 27.简述多态以及鸭⼦类型? 73 28.什么是反射,如何实现反射? 74 29.⾃定义元类控制类名⾸字母必须⼤写 75 30.⾃定义元类来控制类产⽣对象的属性全部加上 开头,变为隐藏的属性 76 77 试题
1 上海Python2期周考 2 介绍 3 满分100分,90分及格 4 5 考试范围: 6 1.Python基础 7 2.数据类型 8 3.流程控制 9 4.文件处理 10 5.函数 11 6.面向对象 12 13 考试时间: 14 周五下午3:30-4:30笔试 15 4:30-6:30机试 16 基础题(40分) 17 1.什么是常量?在python中如何定义常量(1分) 18 2.*args,**kwargs的作用是什么?如何使用? (3分) 19 20 3.python中如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)(1分) 21 4.Python是如何进行bytes和str之间转换的(1分) 22 5.Python中re模块match()和search()的区别(1分) 23 6.简要描述Python的垃圾回收机制(garbage collection)(2分) 24 7.有如下列表,请使用匿名函数按照年龄排序(3分) 25 l=[ 26 {'name':'alex','age':84}, 27 {'name':'oldboy','age':73}, 28 {'name':'egon','age':18}, 29 ] 30 31 8.简述__new__和__init__的区别(1分) 32 9.多重继承的执行顺序,请解答以下输出结果是什么?(4分) 33 class A(object): 34 def __init__(self): 35 print('A') 36 super(A, self).__init__() 37 38 class B(object): 39 def __init__(self): 40 print('B') 41 super(B, self).__init__() 42 43 class C(A): 44 def __init__(self): 45 print('C') 46 super(C, self).__init__() 47 48 class D(A): 49 def __init__(self): 50 print('D') 51 super(D, self).__init__() 52 53 class E(B, C): 54 def __init__(self): 55 print('E') 56 super(E, self).__init__() 57 58 class F(C, B, D): 59 def __init__(self): 60 print('F') 61 super(F, self).__init__() 62 63 class G(D, B): 64 def __init__(self): 65 print('G') 66 super(G, self).__init__() 67 68 if __name__ == '__main__': 69 g = G() 70 f = F() 71 10.python中tuple和list的转换(1分) 72 73 11.交换变量三种方式:a=1,b=2(3分) 74 12.请使用随机模块生成4位验证码(验证码包含数字、小写字母(65~90为26个大写英文字母,97~122号为26个小写英文字母))(6分) 75 13.请回答结果(3分) 76 def extendList(val, list=[]): 77 list.append(val) 78 return list 79 80 81 list1 = extendList(10) 82 list2 = extendList(123, []) 83 list3 = extendList('a') 84 print(list1) 85 print(list2) 86 print(list3) 87 14.Python中如何动态获取和设置对象的属性。(1分) 88 15.下面这段代码的输出结果将是什么?(2分) 89 class Parent(object): 90 x = 1 91 92 class Child1(Parent): 93 pass 94 95 class Child2(Parent): 96 pass 97 98 print(Parent.x, Child1.x, Child2.x) 99 Child1.x = 2 100 print(Parent.x, Child1.x, Child2.x) 101 Parent.x = 3 102 print(Parent.x, Child1.x, Child2.x) 103 16.类的属性和对象的属性有什么区别?(1分) 104 17.什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?(1分) 105 18.什么是绑定到对象的方法,、如何定义,如何调用,给谁用?有什么特性(1分) 106 19.介绍一下except的用法和作用?(3分) 107 20.有字符串'email1:378533872@qq.com email2:333312312@163.com eamil3:alexsb123@gmail.com' 108 匹配出所有的邮箱地址:['378533872@qq.com', '333312312@163.com', 'alexsb123@gmail.com'](1分) 109 综合题(60分) 110 考试内容:从零开始编写选课系统所有功能 111 •新建项目,整个编程期间,pycharm窗口最大化,不允许切换窗口,再次强调!!!考试期间不允许切换窗口,不允许窗口最小化!!!! 112 •项目中用到的变量名,函数名,文件名,模块名都需要跟老师的不一样,可以考虑加入自己的名字作为前缀(非常丑陋,但为了防止作弊,egon非常拼) 113 •所有功能需要正常运行 114 115 试题
1 2期7月6日答案 2 不变的量或在程序运行过程中不变的量 3 python中没有专门的语法代表常量,约定俗成用变量名全大写表示 4 5 2. 6 *args和**kwargs通常使用在函数定义里,*args允许函数传入不定量个数的非关键字参数,**kwargs允许函数传入不定量个数的关键字参数 7 8 3. 9 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。 10 11 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数} 12 13 深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数} 14 15 4.encode、decode 16 17 5. 18 re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。 19 re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。 20 21 6. 22 https://www.jianshu.com/p/1e375fb40506 23 引用计数一旦为0 就回被回收 24 25 7. 26 l.sort(key=lambda item:item['age']) 27 print(l) 28 29 8. 30 __init__为初始化方法,__new__方法是真正的构造函数。 31 __new__是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法 32 __init__是实例创建之后被调用的,然后设置对象属性的一些初始值。 33 总结:__new__方法在__init__方法之前被调用,并且__new__方法的返回值将传递给__init__方法作为第一个参数,最后__init__给这个实例设置一些参数。 34 35 9. 36 G 37 D 38 A 39 B 40 F 41 C 42 B 43 D 44 A 45 46 10.list() tuple() 47 48 11. 49 a=1 50 b=2 51 #1. 方式一: 引入变量 52 c=a 53 a=b 54 b=c 55 #2. 方式二: 计算的方式 56 a = a+b 57 b = a-b 58 a = a-b 59 60 a +=1 61 b -= 1 62 #3. 方式三:交换赋值 63 a,b=b,a 64 65 12. 66 import random 67 def make_code(n): 68 res='' 69 for i in range(n): 70 s1=chr(random.randint(97,122)) 71 s2=str(random.randint(0,9)) 72 res+=random.choice([s1,s2]) 73 return res 74 75 print(make_code(4)) 76 77 13. 78 形参不能使用可变类型,会重复引用 79 [10, 'a'] 80 [123] 81 [10, 'a'] 82 83 14.setattr、getattr 84 85 15. 86 1 1 87 2 1 88 2 3 89 90 16. 91 类的数据属性是所有对象共享的,id都一样 92 类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样 93 对象的属性是对象自己独有的 94 17. 95 经典类与新式类 96 1.只有在python2中才分新式类和经典类,python3中统一都是新式类 97 2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类 98 3.在python2中,显式地声明继承object的类,以及该类的子类,都是新式类 99 3.在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类 100 101 Python中子类可以同时继承多个父类,如A(B,C,D) 102 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性 103 如果继承关系为菱形结构,那么属性的查找方式有两种,分别是:深度优先和广度优先 104 当类是经典类时,多继承情况下,在要查找属性不存在时,会按照深度优先的方式查找下去 105 当类是新式类时,多继承情况下,在要查找属性不存在时,会按照广度优先的方式查找下去 106 107 python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表 108 F.mro() #等同于F.__mro__ 109 为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。 110 而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则: 111 1.子类会先于父类被检查 112 2.多个父类会根据它们在列表中的顺序被检查 113 3.如果对下一个类存在两个合法的选择,选择第一个父类 114 115 116 117 18. 118 119 类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数 120 121 类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法 122 123 强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理) 124 125 注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。 126 127 python中一切皆为对象,且python3中类与类型是一个概念,类型就是类 128 129 130 131 19. 132 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。 133 134 20. 135 re.findall(r":(.*?@.*?com)",'email1:378533872@qq.com email2:333312312@163.com eamil3:alexsb123@gmail.com') 136 137 答案
1 (一)、这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们? 2 答:如果我们不确定往一个函数中传入多少参数,或者我们希望以元组(tuple)或者列表(list)的形式传参数的时候,我们可以使用*args(单星号)。如果我们不知道往函数中传递多少个关键词参数或者想传入字典的值作为关键词参数的时候我们可以使用**kwargs(双星号),args、kwargs两个标识符是约定俗成的用法。 3 另一种答法:当函数的参数前面有一个星号*号的时候表示这是一个可变的位置参数,两个星号**表示这个是一个可变的关键词参数。星号*把序列或者集合解包(unpack)成位置参数,两个星号**把字典解包成关键词参数。 4 5 6 (二)、谈一谈Python的装饰器(decorator) 7 装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。 8 9 有关于具体的装饰器的用法看这里:装饰器 - 廖雪峰的官方网站 10 11 12 (三)、简要描述Python的垃圾回收机制(garbage collection) 13 Python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。 14 引用计数:Python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。 15 标记-清除:一些容器对象,比如list、dict、tuple,instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。 16 分代收集:Python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。 17 如果你想要深入了解Python的GC机制,点击这里:[转载]Python垃圾回收机制--完美讲解! 18 19 (四)、Python多线程(multi-threading)。这是个好主意吗? 20 Python并不支持真正意义上的多线程,Python提供了多线程包。Python中有一个叫Global Interpreter Lock(GIL)的东西,它能确保你的代码中永远只有一个线程在执行。经过GIL的处理,会增加执行的开销。这就意味着如果你先要提高代码执行效率,使用threading不是一个明智的选择,当然如果你的代码是IO密集型,多线程可以明显提高效率,相反如果你的代码是CPU密集型的这种情况下多线程大部分是鸡肋。 21 想要深入详细了解多线程,点击这里:详解Python中的多线程编程_python 22 想了解一下IO密集和CPU密集可以点击这里:CPU-bound(计算密集型) 和I/O bound(I/O密集型) 23 24 25 (五)、 说明os,sys模块不同,并列举常用的模块方法? 26 官方文档: 27 os模板提供了一种方便的使用操作系统函数的方法 28 sys模板可供访问由解释器使用或维护的变量和与解释器交互的函数 29 另一种回答: 30 os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量用户操作Python运行时的环境。一些常用的方法: 31 一些常用的用法示例: 32 33 34 想要了解更详细的使用请访问:os和sys模块 - 君醉 35 36 (六)、什么是lambda表达式?它有什么好处? 37 简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。 38 lambda表达式一般的形式是:关键词lambda后面紧接一个或多个参数,紧接一个冒号“:”,紧接一个表达式。lambda表达式是一个表达式不是一个语句。 39 40 41 42 想更加详细的了解Python中的Lamdba表达式可以点击这里:Lambda 表达式有何用处?如何使用? - Python 43 44 (七)、Python中pass语句的作用是什么? 45 pass语句不会执行任何操作,一般作为占位符或者创建占位程序 46 (八)、Python是如何进行类型转换的? 47 Python提供了将变量或值从一种类型转换为另一种类型的内置方法。 48 49 (九)、Python里面如何拷贝一个对象? 50 Python中对象之间的赋值是按引用传递的,如果要拷贝对象需要使用标准模板中的copy 51 copy.copy:浅拷贝,只拷贝父对象,不拷贝父对象的子对象。 52 copy.deepcopy:深拷贝,拷贝父对象和子对象。 53 54 55 56 (十)、__new__和__init__的区别。 57 __init__为初始化方法,__new__方法是真正的构造函数。 58 __new__是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法 59 __init__是实例创建之后被调用的,然后设置对象属性的一些初始值。 60 总结:__new__方法在__init__方法之前被调用,并且__new__方法的返回值将传递给__init__方法作为第一个参数,最后__init__给这个实例设置一些参数。 61 62 63 想要更加详细的了解这两个方法,请点击:Python中的__new__及其用法 64 (十一)、Python中单下划线和双下划线分别是什么? 65 __name__:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突 66 _name:一种约定,用来指定变量私有 67 __name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名 68 想要更加详细的了解这两者的区别,请点击:Python中的下划线(译文) 69 70 (十二)、说一说Python自省。 71 自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型。简单一句话就是运行时能够获得对象的类型。比如:type()、dir()、getattr()、hasattr()、isinstance() 72 73 74 75 想要完整的理解Python自省,请点击:Python自省(反射)指南 76 有关于元类以及单例模式会在后面文章中做详细的解释说明。 77 78 扩展