python第三次考试

1.请写出[元祖,列表,字典,集合]的定义方法、新增方法、更改方法、删除方法(4 分)

注意答题顺序
元祖()  无
列表[]
    增:append ,(追加) insert(通过索引插入指定位置) ,extend(迭代着添加)
    改:通过索引修改,通过切片去改。
    删:pop ,remove,clear,del
    查:按照切片去查,循环去查
字典{}
    增:dic['k']='v'(没有增加,有的话覆盖) , setdefault(有责不变,没有添加)
    改:dic['k']='v'(没有增加,有的话覆盖),updete(dic2.update(dic)#有则覆盖,没有就添加  将dic里面的所有键值对 覆盖添加到dic2中,dic不变)
    删:,pop(有返回值),del,clear, popitem()(随机删除)
    查:print(dic.get('name1','没有此值'))#可以配置参数,循环
集合{}
    增:add
    改:update
    删:remove pop clear del
注意答题顺序

2.解释生成器(generator)与函数的不同,并实现且使用简单generator(3分)

生成器:本质就是迭代器,可以由自己创建,只有需要取值的时候,才会生成值,节省内存空间,yield
函数占内存 return

实现生成器的时候要注意写上yield才算完整
def g():
    yield 1
    yield 2
    yield 3

g1 = g()

print(next(g1))
print(next(g1))
print(next(g1))

li = (x ** 2 for x in range(1,11,2))
for i in li:
    print(i)
实例

3.如何理解lambda函数 / 表达式(2分)

匿名函数 一句话函数 简单明了 用来完成单一的功能,lambda x: x*x
f = lambda x:x+1
print(f(3))

print((lambda x:x+3)(6))

4.利用python打印前一天的本地时间,格式为"2018-01-30"(面试题)(3分)

import time
new_time=time.time()-24*60*60
print(time.strftime('%Y-%m-%d',time.localtime(new_time)))

5. python中search()和match() 的区别(面试题)(3 分)

match 是否开头由当前字符串进行匹配,不会直接返回结果,而是在正则表达式的开始加上一个^
search 是否包含当前字符串进行匹配,不会直接返回结果,而是返回第一个匹配的变量

6. 描述一下 @ property是做什么用的,简单写一个实例并执行(4分)

@property: 将被装饰的方法伪装成属性,常用于封装私有属性

实例1
class Person:
    def __init__(self,name):
        self.__name = name
    @property
    def name(self):
        return self.__name
a = Person('abc')
print(a.name)


实例2
作用:属性伪装

class A:
    @property
    def name(self):
        print('光头你行不行!')

a = A()
a.name
实例

7. 说明__init__和__new__的作用(2分)
__init__:初始化方法,实例化过程中自动调用
__new__:构造方法,在__init__方法之前自动调用

8.用最简洁的方式生成这样一个列表[4,16,32,64,128](3分)

print([2**i for i in [2,4,5,6,7]])

9.d = {'k1': 'v1', 'k2’:[1,2,3],(‘k’,’3’):{1,2,3}}
请用程序实现:
1)输出上述字典中value为列表的key(2分)
2)如果字典中的key是一个元祖,请输出对应的value值。(2分)

d = {'k1': 'v1', 'k2': [1, 2, 3], ('k', '3'): {1, 2, 3}}
for i in d:
    if type(d[i]) is list:
        print("value为列表的key:", i)
    elif type(i) is tuple:
        print("key是一个元组,对应的value:", d[i])

10.如果不使用 @ wrapper装饰器,请在a() 之前加入一句代码,达到相同的效果(2分)

def wrapper(func):
    def inner(*arg, **kwargs):
        func(*arg, **kwargs)

    return inner

def a(arg):
    print(arg)

a()

在a() 之前加入 a=wrapper(a),并且将a()改成a(6);
在a() 之前加入 a=wrapper(a),可以组成装饰器,def 函数需要传参数才能调用成功,所以需要在括号里面传个任意参数
注意出题陷阱

11.请处理文件7th_questions, 输出所有以'T'开头的行(5 分)

with open('7th_questions',encoding='utf-8',mode='r') as f:
    for line in f:
        line=line.strip()
        if line.startswith('T'):
            print(line)

12.读登陆文件夹中的代码,请为这段代码画流程图(8分)
见文件

13 新式类和金典类(旧式类)的区别(一种一分)(2 分)

新式类遵循广度优先算法,继承object
经典类遵循深度优先算法,默认不继承bject

14装饰器是什么时候被执行的(3分)

def wrapper(f):
    def inner(*args,**kwargs):
        '''执行被装饰函数之前的操作'''
        ret = f(*args,**kwargs)
        """执行被装饰函数之后的操作"""
        return ret
    return inner


def f(func):
    def g(*args,**kwargs):
        ret = func(*args,**kwargs)
        return ret
    return g

def a(age):
    print(age)

print(a)
装饰器的使用

15什么是粘包,如何避免?(3分)

只有tcp才会发生黏包,通过合包机制,接收端接收的数据和发送端发送的文件大小不一样,造成数据混乱
在发送文件时,分成多个部分,第一个部分写的定长的字符串,第二部分写文件内容等等,

16 叙述TCP、UDP的区别(2 分)
TCP:字节流,安全,面向连接
UDP:快,面向数据包

17简述你对管道、队列的理解;(3分)
管道有连两个口,多进程时数据不安全
队列:管道+锁

18.创建一个闭包函数需要满足哪几点?(2分)

至少有两层函数嵌套
内层函数对外层函数非全局变量的引用
将内部函数名返回给调用者

def f():
    x = 1
    def f1():
        print(x)
    return f1
f()()

19. 用什么模块能知道文件夹存不存在? 怎么获取这个文件夹的大小?(2分)

import os

print(os.path.exists(r'D:\untitled3\day35\test2.py'))  #True  传绝对路径就会存在
print(os.path.getsize(r'D:\untitled3\day35\test2.py'))  # 取这个文件的大小 139

20简单解释Python中staticmethod(静态方法)和class method(类方法)(2分)
static method  与类、实例无关,不需要传递self和cls
class method  通过类来引用,与实例无关,需要传递cls

21.有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?(编程题)(5分)

lst=[str(i)+str(j)+str(k) for i in [1,2,3,4] for j in[1,2,3,4] for k in [1,2,3,4] if j!=i and k!=i and k!=j ]
for i in lst:
    print(i)
print(len(lst))

22.有这个一个test2文件,文件中模拟一个网站的页面定义了多个函数,现在有个需求是不使用if,else条件语句,
进行判断然后调用我要使用的函数(5 分)

例如:请输入你要访问的url >> >:login
然后执行test2文件中的函数

第一种方法
def login():
    print('登录成功!')


def registered():
    print('欢迎注册!')


def index():
    print('成功访问主页!')


import sys

web_list = [login, registered, index]
choice = input("请输入你要访问的url>>>:")
getattr(sys.modules['__main__'], choice)()  # 在自己所在的文件夹中反射全局变量
View Code

第二种方法
import test2

str_input = input("请输入你要访问的url>>>:")
try:
    getattr(test2,str_input)()
except Exception:
    print('输入错误!')
View Code

23. 实现一个发红包的编程题(使用random)编程题(10)
import random

def red_packet(money, count):
    l = random.sample(range(0, 100 * money), count - 1)  # 列表元素任意count-1个组合
    l.extend([0, 100 * money])  # 迭代着添加两个数
    l1 = sorted(l, reverse=True)  # 从大到小排序
    for i in range(len(l1) - 1):  # 节省内存
        yield (l1[i] - l1[i + 1]) / 100

obj = red_packet(10, 10)
red_packet(10, 10)
print(obj.__next__())  # 一个一个输出
print(obj.__next__())
for i in obj:  # 剩下的一次性输出完
    print(i)
random的使用

24. 读以下代码,写出答案并简述原因(面试题建议不使用电脑)(5分)
下面代码会输出什么: 考的是默认参数和传参

def f(


    x, l = []):
for i in range(x):
l.append(i * i)
print
l

f(2)
f(3, [3, 2, 1])  # 将[3, 2, 1]传给l,会覆盖之前的列表 ,l = []是默认参数
f(3)


[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
默认参数陷阱

25.写一个socket客户端和服务端并进行通讯(5分)
tcp实现通信
服务端
import socket
from multiprocessing import Process


def con(conn):
    while True:
        conn.send(b'hello')
        print(conn.recv(1024))
    conn.close()


if __name__ == '__main__':
    sk = socket.socket()

    sk.bind(('127.0.0.1', 8080))
    sk.listen(10)
    try:
        while True:
            conn, addr = sk.accept()
            Process(target=con, args=(conn,)).start()
            # 每过来一个客户端来连接,就开一个子进程来和客户沟通,可以实现同时和多个客户沟通
    finally:
        sk.close()  # 意外退出后可自动回收资源(端口等)
客户端
import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 8080))  # 一定要注意,里面是元祖形式
while True:
    ret = sk.recv(1024)
    print(ret)
    msg = input('>>>').encode('utf-8')
    sk.send(msg)
sk.close()
tcp实现通信

携程实现通信

from gevent import monkey

monkey.patch_all()
import socket
import gevent


def talk(conn):
    while True:
        conn.send(b'hello')
        msg = conn.recv(1024)
        print(msg)
    conn.close()


sk = socket.socket()
sk.bind(('127.0.0.1', 9000))
sk.lieten(5)

while True:
    conn, addr = sk.accept()
    gevent.spawn(talk, conn)
sk.close()

客户端
import socket
from threading import Thread
def client():
    sk=socket.socket()
    sk.connect(('127.0.0.1',9000))
    while True:
        msg=sk.recv(1024)
        print(msg)
        ret=input('>>>').encode('utf-8')
        sk.send(ret)
    sk.close()
if __name__ == '__main__':
    for i in range(500):
        Thread(target=client).start()
携程实现


面向对象(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)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
l1 = []
for i in range(1,11):
    l1.append(Person('name_high%d' % i, i*10))
print(max(l1,key=lambda x: x.age))  #打印的是年龄最大的函数的地址
print(max(l1,key=lambda x: x.age).name)

4.模拟cs游戏(15分)
1)人物角色分为警察和匪徒两种,定义成两个类(10分)

所有的警察的角色都是police
每个警察都有自己独有名字,生命值,武器,性别
每个都可以开枪攻击敌人,切攻击目标不能是police #改善项,给每个类添加一个属性

所有的匪徒的角色都是terrorist
每个匪徒都有自己独有名字,生命值,武器,性别
每个都可以开枪攻击敌人,切攻击目标不能是terrorist

2)实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血(2分)

3)提取警察类和匪徒类相似之处定义成一个父类,使用继承的方式减少代码重复(3 分)
简单版本
class Person:
    def __init__(self, name, hp, weapon, sex):
        self.name = name
        self.hp = hp
        self.weapon = weapon
        self.sex = sex

class Police(Person):
    role = 'police'
    def attack1(self,terrorist):
        terrorist.hp = self.hp - self.weapon
        if terrorist.hp <= 0:
            print(" %s被%s击杀!!" % ( terrorist.name, self.name))
        else:
            print(" %s遭到%s攻击,还剩%s血量!" % (terrorist.name, self.name, terrorist.hp))

class Terrorist(Person):
    role = 'terrorist'
    def attack2(self,police):
        police.hp = self.hp - self.weapon
        if police.hp <= 0:
            print(" %s被%s击杀!!" % ( police.name, self.name))
        else:
            print(" %s遭到%s攻击,还剩%s血量!" % (police.name, self.name, police.hp))


police = Police("police", 300, 120, "male")

terrorist = Terrorist("terrorist", 200, 80, "male")

police.attack1(terrorist)
terrorist.attack2(police)
实例

升级版本

class Person:
    def __init__(self,name,hp,weapon,gender):
        self.name = name
        self.hp = hp
        self.weapon = weapon
        self.gender = gender


    def tattack(self,tk):
        if self.juese == tk.juese:
            print('队长,别开枪!')
        else:
            print(f'{self.name }攻击了{tk.name }!')
            if self.weapon > tk.hp:
                tk.hp = 0
                print(f'{tk.name }死亡,剩余血量{tk.hp}')
            else:
                tk.hp -= self.weapon
                print(f'{tk.name }剩余血量{tk.hp}')


class Police(Person):
    juese = 'police'

class Terrorist(Person):
    juese = 'terrorist'

t1 = Terrorist('恶匪001',100,10,'male')
p1 = Police('捕快001',100,10,'male')

while True:
    t1.tattack(p1)
    if p1.hp == 0 :
        print('恶匪气焰嚣张!')
        break
    p1.tattack(t1)
    if t1.hp == 0 :
        print('恶匪被消灭!')
        break
类的妙用

5读代码(10分)

5(1)

class Base:
def f1(self): # 2找到f1
print(self) # <__main__.Foo object at 0x000001E2A3507F98>
self.f2() # 3 找不到f2

def f2(self):
print('...')

class Foo(Base): # 1 找不到f1
def f2(self): # 4 找到f2
print(self) #<__main__.Foo object at 0x000001E2A3507F98>
print('9999') # 5 打印

obj = Foo()
obj.f1()

问题1: 面向对象中的self指的什么?(2分)
self指的是实例本身,在这里指obj

问题2: 写出运行结果并简述原因(3分)
运行结果 9999
原因:如图注释,1,执行函数Foo,在Foo中寻找f1
                2,找不到f1,就去父类中找
                3,找到f1后找f2,
                4,父类中没有,在子类中找到f2
                5,打印 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分)
1.在JustCounter中调用count方法,并将counter1传递给self
2.执行self.__secretCount += 1
3.打印self.__secretCount的值
执行count1.count() 时:
 1. 在实例对象count1的名称空间里寻找count名字,没有找到
2. 然后去count1的所属类JustCounter的名称空间里找count名字,找到了一个方法名,可以调用
3.调用类JustCounter的count方法,首先将self.__secretCoun变形为self._JustCounter__secretCount, 寻找改名字
4.在类中找到了改名字,为静态变量,值为1;尝试做操作self._JustCounter__secretCount = self._JustCounter__secretCount + 15.赋值等式右边计算结果为1,由于对象没有权利对类静态变量做修改,所以对象自动在自己的名称空间内添加了该属性,并得到右边的赋值1
6.寻找对象count1的__JustCounter__secretCount名字,由于上步操作在自己名称空间内添加了该属性,所以打印该属性值,即打印1

问题2: 运行结果并简述原因(3 分)
先打印1,然后报错
报错:
    1.python解释器会把self.__secretCount变形为self._当前类的类名__secretCount
    2.counter1.count()能找到count方法,所以打印1
    3.counter2.count()中找不到_Bars__secretCount属性,所以报错
    4.print(counter1.__secretCount),同理,在函数外部也找不到_JustCounter__secretCount属性。
 
结果:1先打印1,然后报错AttributeError
原因:
1.依问题1中所述,count1实例化时,会打印1
2.count2实例化时,print(counter1.__secretCount),首先将__secretCount变形为_Bars__secretCount。
3.按照顺序:对象count2本身名称空间—》类Bars名称空间—》父类JustCounter名称空间—》object基类名称空间查找_Bars__secretCount.
4. 找不到_Bars__secretCount报错属性错误AttributeError

附加思考题(20分):
有一个数据结构如下所示,请编写一个函数从该结构数据中返回由指定的字段和对应的值组成的字
典。如果指定字段不存在,则跳过该字段。(10分)

data = {"time": "2016-08-05T13:13:05",
"some_id": "ID1234",
"grp1": {"fld1": 1,"fld2": {'name':'xiaoming',"fld2":111}},
"xxx2": {"fld3": 0,
"fld5": 0.4},
"fld6": 11,
"fld7": 7,
"fld46": 8}

fields: 由"|"连接的以"fld"开头的字符串, 如: fld2 | fld3 | fld7 | fld19

def select(data, fields):
# TODO:implementation
return result


def select(data, fields):
fields_lst = fields.split(‘ | ’)
for key in data:
if type(data[key]) == dict:
pass
return result

data = {"time": "2016-08-05T13:13:05",
        "some_id": "ID1234",
        "grp1": {"fld1": 1,"fld2": {'name':'xiaoming',"fld2":111}},
        "xxx2": {"fld3": 0,
                 "fld5": 0.4},
        "fld6": 11,
        "fld7": 7,
        "fld46": 8}
fields='fld2|fld3|fld7|fld19'

dic={}
def search(data,fields):
    # l1=fields.split('|')

    for k,v in data.items():
        if k in fields:
            dic[k]=v
        if type(v) == dict:
            search(v, fields)  # 递归
    return dic
print(search(data,fields))
递归的妙用

123

猜你喜欢

转载自www.cnblogs.com/daofaziran/p/9258816.html