python 全栈开发,Day30(第一次面向对象考试)

月考题:

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

  

猜你喜欢

转载自www.cnblogs.com/xiao987334176/p/8965112.html
今日推荐