python有权威的考试_Python考试_第三次

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值