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'] =evaprint(dic['name'])
dict是无序的,key必须唯一,key要求可哈希3.解释生成器(generator)与函数的不同,并实现且使用简单generator(3分)
生成器:生成器本质上是迭代器
函数中只要有yield 那他就不是一个函数,而是一个生成器
它需要使用__next__方法取值,占用内层空间小
函数跟generator相比,是调用的时候,才会执行里面的代码。根据return得到返回值
generator举例deffunc():print(1)yield
4.如何理解lambda函数/表达式(2分)
lambda是为了解决那些功能很简单的需求而设计的一句话函数。
它可以没有名字,一般和内置函数配合使用
格式:
函数名= lambda参数:返回值
参数可以有多个,用逗号隔开
它只能写一行,且逻辑执行结束后的内容就是返回值
返回值可以是任意数据类型
举例:lambda x:x*2相当于下面的函数deffunc(x):return x*2
5.a=10b=20
deftest(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,None6. 描述一下@property是做什么用的,简单写一个实例并执行(4分)
property是一种特殊的属性,它将一个方法伪装成属性,对象可以根据属性名调用
比如:classA():def __init__(self,name):
self.name=name
@propertydefage(self):return 20a= 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 ind: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 ind: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分)defwrapper(func):def inner(*arg, **kwargs):
func(*arg, **kwargs)returninner
@wrapperdefa(arg):print(arg)
a()
代码如下:defwrapper(func):def inner(*arg, **kwargs):
func(*arg, **kwargs)returninner#@wrapper
defa(arg):print(arg)
a=wrapper(a)
a('1')9.请处理文件7th_questions,输出所有以'T'开头的行(5分)
with open('7th_questions',encoding='utf-8') as f:for i inf:
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分)deff1():print('funcname is f1')deff2():print('funcname is f2')return 1
deff3(func1):
ll=func1()print('funcname is f3')returnllprint(f3(f2))
执行结果如下:
funcnameisf2
funcnameisf31
1.首先执行print(f3(f2)),执行f3函数,将f2函数以参数形式传进去2.执行ll = func1(),此时func1()为f2。执行f2函数,输出'funcname is f2',执行return 1,将1返回给函数调用者ll3.输出'funcname is f3',执行return ll,此时ll的值为1,将1返回给函数调用者 print(f3(f2))4.最后输出113. 创建一个闭包函数需要满足哪几点?(2分)1.必须是嵌套函数2.内部函数包含对外部作用域的变量引用,变量必须是非全局作用域14.将时间打印出成一个2017/10/01 18:08:15的格式(3)
将"2017-11-18" 17:43:43"转换为结构化时间
importtime
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
#转换为结构化时间
importtime
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获取这个文件夹的大小
比如:importos
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
他就提示我们----这是一个登陆页面!说明登陆成功了
使用反射,代码如下:importtest2importsys#test2模块表示模拟一个网站的页面
url = input('url>>>:').strip()if hasattr(sys.modules['test2'],url):
getattr(sys.modules['test2'],url)() #执行方法
20.实现一个发红包的编程题(使用random)编程题#完整写法
importrandomdefcontent(ss):
ss=int(ss)print('红包总金额为:{}'.format(ss))
count=0whileTrue:
suiji= random.randint(1, int(ss))
count+= 1
print('第{}次抢到{}'.format(count, suiji))
ss-=suijiif ss ==0:print('红包已发完!'.format(ss))break
else:passcontent(10)
二 面向对象(30分)1.请简述类、对象、实例化、实例这些名词的含义(2分)
类的概念 : 具有相同属性和技能的一类事物
对象 : 就是对一个类的具体的描述
类变成对象的过程,是实例化的 过程
实例化之后,就是一个实例2.面向对象的三大特性是什么?(3分)
封装,继承,多态3.有一个类定义:(5分)classPerson:def __init__(self,name,age):
self.name=name
self.age=age1)初始化10个不同的对象(2)classPerson: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)classPerson: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 inli:#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
每个匪徒都有自己独有名字,生命值,武器,性别
每个都可以开枪攻击敌人,切攻击目标不能是terroristclasspolice(object):def __init__(self,name,hp,weapon,sex):
self.name=name
self.hp=hp
self.weapon=weapon
self.sex=sex
self.role= 'police'
defattack(self,p):if p.role == 'police':print('不能攻击!都是自己人')classterrorist(object):def __init__(self,name,hp,weapon,sex):
self.name=name
self.hp=hp
self.weapon=weapon
self.sex=sex
self.role= 'terrorist'
defattack(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分)classpolice(object):def __init__(self,name,hp,weapon,sex):
self.name=name
self.hp=hp
self.weapon=weapon
self.sex=sex
self.role= 'police'
defattack(self,p):if p.role == 'police':print('不能攻击!都是自己人')else:print('{}攻击了{},{}掉血了!'.format(self.name,p.name,p.name))classterrorist(object):def __init__(self,name,hp,weapon,sex):
self.name=name
self.hp=hp
self.weapon=weapon
self.sex=sex
self.role= 'terrorist'
defattack(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=Nonedefattack(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)classBase:deff1(self):
self.f2()deff2(self):print('...')classFoo(Base):deff2(self):print('9999')
obj=Foo()
obj.f1()
问题1:面向对象中的self指的什么?(2分)
self表示实例本身
问题2:运行结果并简述原因(3分)
执行输出:9999原因:
实例化类Foo,执行对象的f1方法。由于对象没有f1方法,从父类Base中寻找。
找到f1方法,deff1(self): 此时self指向的是Foo类的对象。执行self.f2()
由于self是Foo类中的,从Foo类中寻找f2方法。找到了,执行输出99995(2)classJustCounter:__secretCount =0defcount(self):
self.__secretCount += 1
print(self.__secretCount)classBars(JustCounter):defcount(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方法如下:classPerson: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类重的两个内置方法classPerson:def __init__(self,name,age,sex,weight):
self.name=name
self.sex=sex
self.age=age
self.weight=weightdef __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是否相同
returnTrue
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