月考题:
python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple、list、dict的用法,以及它们的特点(3分) 3.解释生成器(generator)与函数的不同,并实现且使用简单generator(3分) 4.如何理解lambda函数/表达式(2分) 5.a=10 b=20 def test(a,b): print(a,b) c = test(b,a) print(c) 上述代码中,打印出来的值a,b,c分别是什么?为什么?(4分) 6. 描述一下@property是做什么用的,简单写一个实例并执行(4分) 7.d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}}(4分) 请用程序实现: 1)输出上述字典中value为列表的key(2分) 2)如果字典中的key是一个元祖,请输出对应的value值。(2分) 3)d[('k','3')]对应的value是一个什么数据类型(1分) 8.如果不使用@wrapper装饰器,请在a()之前加入一句代码,达到相同的效果(2分) def wrapper(func): def inner(*arg, **kwargs): func(*arg, **kwargs) return inner @wrapper def a(arg): print(arg) a() 9.请处理文件7th_questions,输出所有以'T'开头的行(5分) 10.读登陆文件夹中的代码,请为这段代码画流程图(8分) 11 默写10个字符串对象的内置方法,描述它的作用(5分) 12.有如下代码,写出调用的顺序以及结果(5分) def f1(): print('funcname is f1') def f2(): print('funcname is f2') return 1 def f3(func1): ll = func1() print('funcname is f3') return ll print(f3(f2)) 13. 创建一个闭包函数需要满足哪几点?(2分) 14.将时间打印出成一个2017/10/01 18:08:15的格式(3) 将 "2017-11-18 17:43:43" 转换为结构化时间 15.用什么模块能知道文件夹存不存在?(1) 怎么获取这个文件夹的大小?(2) 16 简单解释Python中static method(静态方法)和class method(类方法)(2) 17.请描述一下__new__方法和__init__的区别以及是做什么的(2) 18. 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?(编程题)(5) 19.有这个一个test2文件,文件中模拟一个网站的页面定义了多个函数,现在有个需求是不使用if,else条件语句,进行判断我想访问那个页面 例如: 请输入你要访问的url>>>:login 他就提示我们 ---- 这是一个登陆页面!说明登陆成功了 20.实现一个发红包的编程题(使用random)编程题 二 面向对象(30分) 1.请简述类、对象、实例化、实例这些名词的含义(2分) 2.面向对象的三大特性是什么?(3分) 3.有一个类定义:(5分) class Person: def __init__(self,name,age): self.name = name self.age = age 1)初始化10个不同的对象(2) 2)求最高age的对象的name(3) 4. 模拟cs游戏(15分) 1)人物角色分为警察和匪徒两种,定义成两个类(10分) 所有的警察的角色都是police 每个警察都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击敌人,切攻击目标不能是police 所有的警察的角色都是terrorist 每个匪徒都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击敌人,切攻击目标不能是terrorist 2)实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血(2分) 3)提取警察类和匪徒类相似之处定义成一个父类,使用继承的方式减少代码重复(3分) 5 读代码(10分) 5(1) class Base: def f1(self): self.f2() def f2(self): print('...') class Foo(Base): def f2(self): print('9999') obj = Foo() obj.f1() 问题1:面向对象中的self指的什么?(2分) 问题2:运行结果并简述原因(3分) 5(2) class JustCounter: __secretCount = 0 def count(self): self.__secretCount += 1 print(self.__secretCount) class Bars(JustCounter): def count(self): print(self.__secretCount) counter1 = JustCounter() counter2 = Bars() counter1.count() counter2.count() print (counter1.__secretCount) 问题1:简述counter1.count()执行流程?(2分) 问题2:运行结果并简述原因(3分) 附加思考题(20分): 有一个类的init方法如下: class Person: def __init__(self,name,age,sex,weight): self.name = name self.sex = sex self.age = age self.weight = weight 假设有100个person的对象, 若两个对象的obj1,obj2的name和sex属性相同 即obj1.name==obj2.name and obj1.sex==obj2.sex 我们认为两个对象为同一个对象,已知一个列表中的100个对象,对这100个对象进行去重。 提示: 重写Person类重的两个内置方法
答案:
python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 文本模式 主要操作字符串 r,只读模式 w,只写模式 a, 只追加写模式 用b模式 主要操作二进制 rb 只读模式 wb 只写模式 ab 只追加写模式 2.详细说明tuple、list、dict的用法,以及它们的特点(3分) tuple 有index,len,count方法,可以切片 tuple是只读的,有索引 list 有增删改查,比如li = [], li.append('name') li.pop['name'] li['name'] = 'eva' print(li['name']) list是有序的,可以增删改查 dict 也有增删改查,比如dic = {} dic['name'] = 'alex' dic.pop('name') dic['name'] = eva print(dic['name']) dict是无序的,key必须唯一,key要求可哈希 3.解释生成器(generator)与函数的不同,并实现且使用简单generator(3分) 生成器:生成器本质上是迭代器 函数中只要有yield 那他就不是一个函数,而是一个生成器 它需要使用__next__方法取值,占用内层空间小 函数跟generator相比,是调用的时候,才会执行里面的代码。根据return得到返回值 generator举例 def func(): print(1) yield 4.如何理解lambda函数/表达式(2分) lambda是为了解决那些功能很简单的需求而设计的一句话函数。 它可以没有名字,一般和内置函数配合使用 格式: 函数名 = lambda 参数:返回值 参数可以有多个,用逗号隔开 它只能写一行,且逻辑执行结束后的内容就是返回值 返回值可以是任意数据类型 举例: lambda x:x*2 相当于下面的函数 def func(x): return x*2 5.a=10 b=20 def test(a,b): print(a,b) c = test(b,a) print(c) 上述代码中,打印出来的值a,b,c分别是什么?为什么?(4分) a, b, c分别是 20,10,None 因为根据位置传参test(b,a) 此时实参a,b分别为20,10 在函数形参时,a,b分别为20,10,打印出20,10 由于函数没有return,所以c为None 最终结果为20,10,None 6. 描述一下@property是做什么用的,简单写一个实例并执行(4分) property是一种特殊的属性,它将一个方法伪装成属性,对象可以根据属性名调用 比如: class A(): def __init__(self,name): self.name = name @property def age(self): return 20 a = A('alex') print(a.name,a.age) #访问name和age #执行输出alex 20 7.d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}}(4分) 请用程序实现: 1)输出上述字典中value为列表的key(2分) d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}} for i in d: if type(d[i]) == list: print(i) 2)如果字典中的key是一个元祖,请输出对应的value值。(2分) d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}} for i in d: if type(i) == tuple: print(d[i]) 3)d[('k','3')]对应的value是一个什么数据类型(1分) d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}} print(type(d[('k','3')])) 是一个集合类型 8.如果不使用@wrapper装饰器,请在a()之前加入一句代码,达到相同的效果(2分) def wrapper(func): def inner(*arg, **kwargs): func(*arg, **kwargs) return inner @wrapper def a(arg): print(arg) a() 代码如下: def wrapper(func): def inner(*arg, **kwargs): func(*arg, **kwargs) return inner #@wrapper def a(arg): print(arg) a = wrapper(a) a('1') 9.请处理文件7th_questions,输出所有以'T'开头的行(5分) with open('7th_questions',encoding='utf-8') as f: for i in f: i = i.strip() if i.startswith('T'): print(i) 10.读登陆文件夹中的代码,请为这段代码画流程图(8分) 11 默写10个字符串对象的内置方法,描述它的作用(5分) capitalize() 首字母大写,其他字母小写 upper() 全部大写 lower() 全部小写 center() 居中 title() 每个单词的首字母大写(非字母隔开) startswith() 判断以什么为开头 endswith() 以什么为结尾 strip() 去除首尾的空格,换行符(\n),tab键(4个空格 用\t表示) lstrip() 去除左边的空格、换行符、tab键 rstrip() 去除右边的空格、换行符、tab键 12.有如下代码,写出调用的顺序以及结果(5分) def f1(): print('funcname is f1') def f2(): print('funcname is f2') return 1 def f3(func1): ll = func1() print('funcname is f3') return ll print(f3(f2)) 执行结果如下: funcname is f2 funcname is f3 1 1.首先执行print(f3(f2)),执行f3函数,将f2函数以参数形式传进去 2.执行ll = func1(),此时func1()为f2。执行f2函数,输出'funcname is f2',执行return 1,将1返回给函数调用者ll 3.输出'funcname is f3',执行return ll,此时ll的值为1,将1返回给函数调用者 print(f3(f2)) 4.最后输出1 13. 创建一个闭包函数需要满足哪几点?(2分) 1.必须是嵌套函数 2.内部函数包含对外部作用域的变量引用,变量必须是非全局作用域 14.将时间打印出成一个2017/10/01 18:08:15的格式(3) 将 "2017-11-18" 17:43:43" 转换为结构化时间 import time str1 = '2017-10-01 18:08:15' p = time.strptime(str1,'%Y-%m-%d %H:%M:%S') #print(p) b = time.strftime('%Y/%m/%d %H:%M:%S',p) print(b) # 2017/10/01 18:08:15 #转换为结构化时间 import time str2 = "2017-11-18 17:43:43" p = time.strptime(str2,'%Y-%m-%d %H:%M:%S') print(p) 执行输出: time.struct_time(tm_year=2017, tm_mon=11, tm_mday=18, tm_hour=17, tm_min=43, tm_sec=43, tm_wday=5, tm_yday=322, tm_isdst=-1) 15.用什么模块能知道文件夹存不存在?(1) 怎么获取这个文件夹的大小?(2) 用os模块能知道文件夹存不存在 使用os.path.getsize获取这个文件夹的大小 比如: import os f = '7th_questions' print(os.path.getsize(f)) 16 简单解释Python中static method(静态方法)和classmethod(类方法)(2) staticmethod(静态方法) 静态方法没有默认参数 可以当成普通的函数使用。它不能使用self classmethod(类方法) 它在类中调用方法, 而不是在实例中调用方法 不依赖对象的方法 类方法可以任意的操作类中的静态变量 17.请描述一下__new__方法和__init__的区别以及是做什么的(2) __new__方法 用来创建一个对象 __init__方法 用来初始化一个对象 区别就是__new__方法比__init__要先执行。如果没有__new__方法创建对象,__init__无法正常执行。 18. 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?(编程题)(5) 能组成 24个互不相同且无重复数字的三位数 n_list = [] for a in range(1,5): for b in range(1,5): for c in range(1,5): if a != b and b != c and c != a : number = '{}{}{}'.format(a,b,c) n_list.append(number) print(number) n_count = len(set(n_list)) print(n_count) #执行输出: 123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 19.有这个一个test2文件,文件中模拟一个网站的页面定义了多个函数,现在有个需求是不使用if,else条件语句,进行判断我想访问那个页面 例如: 请输入你要访问的url>>>:login 他就提示我们 ---- 这是一个登陆页面!说明登陆成功了 使用反射,代码如下: import test2 import sys #test2模块表示模拟一个网站的页面 url = input('url>>>:').strip() if hasattr(sys.modules['test2'],url): getattr(sys.modules['test2'],url)() # 执行方法 20.实现一个发红包的编程题(使用random)编程题 #完整写法 import random def content(ss): ss = int(ss) print('红包总金额为:{}'.format(ss)) count = 0 while True: suiji = random.randint(1, int(ss)) count += 1 print('第{}次抢到{}'.format(count, suiji)) ss -= suiji if ss == 0: print('红包已发完!'.format(ss)) break else: pass content(10) 二 面向对象(30分) 1.请简述类、对象、实例化、实例这些名词的含义(2分) 类的概念 : 具有相同属性和技能的一类事物 对象 : 就是对一个类的具体的描述 类变成对象的过程,是实例化的 过程 实例化之后,就是一个实例 2.面向对象的三大特性是什么?(3分) 封装,继承,多态 3.有一个类定义:(5分) class Person: def __init__(self,name,age): self.name = name self.age = age 1)初始化10个不同的对象(2) class Person: def __init__(self, name, age): self.name = name self.age = age li = [] # 定义一个列表 for i in range(1, 11): li.append(Person('eva' + str(i), i)) # 初始化10个不同的对象 2)求最高age的对象的name(3) class Person: def __init__(self, name, age): self.name = name self.age = age li = [] # 定义一个列表 for i in range(1, 11): li.append(Person('eva' + str(i), i)) # 实例化10个对象 p_list = [] for i in li: # print(i.__dict__) p_list.append(i.__dict__) a = sorted(p_list, reverse=True, key=lambda x: x['age']) print(a[0]['name']) # 最高age的对象的name #执行输出eva10 4. 模拟cs游戏(15分) 1)人物角色分为警察和匪徒两种,定义成两个类(10分) 所有的警察的角色都是police 每个警察都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击敌人,切攻击目标不能是police 所有的警察的角色都是terrorist 每个匪徒都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击敌人,切攻击目标不能是terrorist class police(object): def __init__(self,name,hp,weapon,sex): self.name = name self.hp = hp self.weapon = weapon self.sex = sex self.role = 'police' def attack(self,p): if p.role == 'police': print('不能攻击!都是自己人') class terrorist(object): def __init__(self,name,hp,weapon,sex): self.name = name self.hp = hp self.weapon = weapon self.sex = sex self.role = 'terrorist' def attack(self,p): if p.role == 'terrorist': print('不能攻击!都是自己人') tom = police('tom',10,'gun','M') tom2 = police('tom2',10,'gun','M') jack = terrorist('jack',10,'gun','M') jack2 = terrorist('jack2',10,'gun','M') tom.attack(tom2) # 不能攻击警察 jack.attack(jack2) # 不能攻击匪徒 2)实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血(2分) class police(object): def __init__(self,name,hp,weapon,sex): self.name = name self.hp = hp self.weapon = weapon self.sex = sex self.role = 'police' def attack(self,p): if p.role == 'police': print('不能攻击!都是自己人') else: print('{}攻击了{},{}掉血了!'.format(self.name,p.name,p.name)) class terrorist(object): def __init__(self,name,hp,weapon,sex): self.name = name self.hp = hp self.weapon = weapon self.sex = sex self.role = 'terrorist' def attack(self,p): if p.role == 'terrorist': print('不能攻击!都是自己人') else: print('{}攻击了{},{}掉血了!'.format(self.name, p.name,p.name)) tom = police('tom',20,'gun','M') jack = terrorist('jack',10,'gun','M') tom.attack(jack) # 警察攻击匪徒 执行输出: tom攻击了jack,jack掉血了! 3)提取警察类和匪徒类相似之处定义成一个父类,使用继承的方式减少代码重复(3分) class Person(object): # 人类 def __init__(self,name,hp,weapon,sex): self.name = name self.hp = hp self.weapon = weapon self.sex = sex self.role = None def attack(self, p): if self.role == p.role: print('不能攻击!都是自己人') else: print('{}攻击了{},{}掉血了!'.format(self.name,p.name,p.name)) class police(Person): # 警察 def __init__(self,name,hp,weapon,sex): super().__init__(name,hp,weapon,sex) self.role = 'police' class terrorist(Person): # 匪徒 def __init__(self,name,hp,weapon,sex): super().__init__(name, hp, weapon, sex) self.role = 'terrorist' tom = police('tom',20,'gun','M') tom2 = police('tom2',20,'gun','M') jack = terrorist('jack',10,'gun','M') tom.attack(jack) # 警察攻击匪徒 tom.attack(tom2) # 警察不能攻击警察 5 读代码(10分) 5(1) class Base: def f1(self): self.f2() def f2(self): print('...') class Foo(Base): def f2(self): print('9999') obj = Foo() obj.f1() 问题1:面向对象中的self指的什么?(2分) self表示实例本身 问题2:运行结果并简述原因(3分) 执行输出:9999 原因: 实例化类Foo,执行对象的f1方法。由于对象没有f1方法,从父类Base中寻找。 找到f1方法,def f1(self): 此时self指向的是Foo类的对象。执行self.f2() 由于self是Foo类中的,从Foo类中寻找f2方法。找到了,执行输出9999 5(2) class JustCounter: __secretCount = 0 def count(self): self.__secretCount += 1 print(self.__secretCount) class Bars(JustCounter): def count(self): print(self.__secretCount) counter1 = JustCounter() counter2 = Bars() counter1.count() counter2.count() print (counter1.__secretCount) 问题1:简述counter1.count()执行流程?(2分) 首先实例化JustCounter()和Bars(),执行counter1对象的count()方法 找到count方法,将私有属性__secretCount 加1,此时的属性,还在实例对象空间里面,不是类对象空间 执行print,输出1 问题2:运行结果并简述原因(3分) 执行报错 原因: 执行counter1.count(),是正常的,输出1 执行counter2.count()时,由于类中有count方法,直接count方法 此时的self是指向自己所在的类以及父类,需要获取私有属性__secretCount, Bars继承了JustCounter类,但是私有属性,是不会继承的。 那么自己所在的类,找不到。而父类的私有属性,又没有继承。最终找不到,提示报错 附加思考题(20分): 有一个类的init方法如下: class Person: def __init__(self,name,age,sex,weight): self.name = name self.sex = sex self.age = age self.weight = weight 假设有100个person的对象, 若两个对象的obj1,obj2的name和sex属性相同 即obj1.name==obj2.name and obj1.sex==obj2.sex 我们认为两个对象为同一个对象,已知一个列表中的100个对象,对这100个对象进行去重。 提示: 重写Person类重的两个内置方法 class Person: def __init__(self,name,age,sex,weight): self.name = name self.sex = sex self.age = age self.weight = weight def __hash__(self): # 实例化时,执行此方法 return hash(self.name + self.sex) # 对name和sex做hash,因为有2个对象name和sex一样,age不同 def __eq__(self, other): # 实例化时,执行此方法 if self.name == other.name and self.sex == other.sex: # 判断每一个对象的name和sex是否相同 return True p_list = [] #定义一个列表 #生成98个实例对象 #count= 0 for i in range(1,99): #count += 1 p_list.append(Person('eva' + str(i),i,'M',17.5)) #print('eva' + str(i),i,'M','17.5') # print(count) # exit() #手动增加2个重复的,name和sex值是一样的,age不同 p_list.append(Person('eva49',99,'M',17.5)) #print('eva'+'99',99,'M',17.5) p_list.append(Person('eva50',100,'M',17.5)) #查看p_lst1的长度 #print(len(p_list)) #使用集合去重,查看p_lst1的长度 print(len(set(p_list))) # 输出98