python笔试题

1、常用的字符串格式化方法有哪些?并说明他们的区别

a. 使用%,语法糖

print("我叫%s,今年%d岁" % ("oxs", 18))    # 我叫oxs,今年18岁

b. 通过{}替代%,后面跟.forma()函数

print("我叫{},今年{}岁".format("oxs", 18))    # 我叫oxs,今年18岁
3、利用python打印前一天的本地时间,格式化为“2018-01-30”

先获取当前时间戳时间-(60*60*24),再转化为格式化时间strftime("%Y-%m-%d")【strftime("%Y-%m-%d %H:%M:%S")】

import time
print(time.strftime("%Y-%m-%d", time.localtime(time.time())))
4、python中re模块的search()和match()的区别

相同点:
都接收两个参数(正则表达式, 待匹配的字符串)
都只匹配一个符合条件的项
区别点:
search 根据所写的正则匹配符合条件的第一个
match 根据所写的正则 从头开始 匹配,相当于在正则表达式的开始位置加一个"^"
例子:匹配Hello
search 只要句中有Hello就能匹配上,aaasjhdHellokjasd
match Hello必须在句首才能匹配上,Helloaaasjhdkjasd

5、什么是lambda函数,有什么好处?

匿名函数:可以和内置函数合用,有效减少冗余代码

6、说明__init__和__new__的作用

__init__ :初始化方法 默认参数-self
__new__:构造方法 默认参数-cls 创建对象
__del__:析构方法 删除一个对象之前执行的方法

7、简述反射是怎么回事

用字符串数据类型的变量名或者是函数名来调用对应的属性
什么时候用反射:例--》A.b(A对象/模块/类.b属性/方法)==》getattr(A, 'b')

8、解释python中深浅拷贝的区别

深copy:不管一个数据类型有多少层,都另外开辟新的空间存储一份和原来一模一样的数据
浅copy:只是重新开辟一块空间来copy第一层的数据,涉及到容器类的数据类型,只存储它的内存地址

9、用最简洁的方式生成如题列表[4, 16, 32, 64, 128]
l = []
for i in range(2, 8):
    if i != 3:
        l.append(2**i)    # 或者是l.append(pow(2, 3))
10、python中如何实现随机数并打印,默认随机数范围是多少

random.random() 范围 0~1

11、新式类和经典类(旧式类)的区别

新式类(默认继承object):
- 在继承的过程中,寻找一个方法遵循广度优先
- 内置mro方法来标识广度优先的顺序
经典类:
- 在继承的过程中,寻找一个方法遵循深度优先

12、装饰器什么时候被执行

在被装饰的函数调用的时候(加载函数的时候被执行)
例子:用装饰器实现打印程序的运行时间

import time
def timmer(func):
    def inner(*args, **kwargs):
        start = time.time()
        ret = func(*args, **kwargs)
        print(time.time() - start)
        return ret
    return inner

# 相当于执行println = timmer(println)
@timmer
def println(): pass
13、什么是“并发”?什么是“并行”?

并发(多线程):在同一时间,只能有一个CPU在处理任务(看起来一起执行 GIL锁在同一时刻限制了多个线程只能有一个线程被CPU执行)
并行(多进程):是真正意义上的在同一时刻有多个CPU在处理任务(多线程在同一时刻可以占用多个CPU)

14、以个人理解描述Event的执行原理

有一个状态控制wait方法是否阻塞

15、什么是粘包,如何避免

TCP协议:面向连接的流传输,数据是无边界的。如何避免:自定义协议 struct模块
UDP协议:不存在粘包现象

16、什么是进程

运行中的程序 是最小的资源分配单位 为多个任务之间的数据安全和内存隔离做约束

17、什么是线程

cpu调度的最小单位 轻量级的进程 是进程的一部分 可以共享进程中的数据

18、简述你对管道、队列的理解

管道:双向通信的数据容器 多进程的IPC中用到了 数据不安全
队列:基于管道和锁实现的一个数据在线程/进程之间安全的容器 先进先出

21、使用python简单实现打印九九乘法表
# for循环的四种乘法表
print('=' * 33 + ' for 1' + '=' * 33)
for i in range(1, 10):
    for j in range(1, i + 1):
        print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
    print()
print('=' * 33 + ' for 1' + '=' * 33)

print('=' * 33 + ' for 2' + '=' * 33)
for i in range(9, 0, -1):
    for j in range(1, i + 1):
        print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
    print()
print('=' * 33 + ' for 2' + '=' * 33)

print('=' * 33 + ' for 3' + '=' * 33)
for i in range(1, 10):
    for j in range(9, 0, -1):
        if j <= i:
            print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        else:
            print('{:<6s}'.format(''), end='\t')
    print()
print('=' * 33 + ' for 3' + '=' * 33)

print('=' * 33 + ' for 4' + '=' * 33)
for i in range(9, 0, -1):
    for j in range(9, 0, -1):
        if j <= i:
            print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        else:
            print('{:<6s}'.format(''), end='\t')
    print()
print('=' * 33 + ' for 4' + '=' * 33)
# for循环的四种乘法表

# while循环的四种乘法表
print('=' * 32 + ' while 1' + '=' * 32)
i = 1
while i <= 9:
    j = 1
    while j <= i:
        print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        j += 1
    print()
    i += 1
print('=' * 32 + ' while 1' + '=' * 32)

print('=' * 32 + ' while 2' + '=' * 32)
i = 9
while i >= 1:
    j = 1
    while j <= i:
        print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        j += 1
    print()
    i -= 1
print('=' * 32 + ' while 2' + '=' * 32)

print('=' * 32 + ' while 3' + '=' * 32)
i = 1
while i <= 9:
    j = 9
    while j >= 1:
        if j <= i:
            print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        else:
            print('{:<6s}'.format(''), end='\t')
        j -= 1
    print()
    i += 1
print('=' * 32 + ' while 3' + '=' * 32)

print('=' * 32 + ' while 4' + '=' * 32)
i = 9
while i >= 1:
    j = 9
    while j >= 1:
        if j <= i:
            print('{}*{}={:<2}'.format(j, i, j * i), end='\t')
        else:
            print('{:<6s}'.format(''), end='\t')
        j -= 1
    print()
    i -= 1
print('=' * 32 + ' while 4' + '=' * 32)
# while循环的四种乘法表
22、简述python GIL的概念,以及它对python多线程的影响

GIL:全局解释器锁 属于Cpython解释器
用来在Cpython解释器解释一段多线程代码时,约束线程在同一时刻只能有一个线程访问CPU
它对python多线程的影响:在Cpython解释器下启动的多线程并不能真正实现并行

23、写一个单例模式
# ########### 单例类定义 ###########
class Foo(object):
 
    __instance = None
 
    @staticmethod
    def singleton():
        if Foo.__instance:
            return Foo.__instance
        else:
            Foo.__instance = Foo()
            return Foo.__instance
 
# ########### 获取实例 ###########
obj = Foo.singleton()
24、编程题:将以下list3的格式转换成list4格式

list3 = [
{"name": "alex", "hobby": "抽烟"}
{"name": "alex", "hobby": "喝酒"}
{"name": "alex", "hobby": "烫头"}
{"name": "alex", "hobby": "Massage"}
{"name": "egon", "hobby": "喊麦"}
{"name": "egon", "hobby": "街舞"}
]

如何把上面的列表转换成下方的列表

list4 = [
{"name": "alex", "hobby_list": ["抽烟", "喝酒", "烫头", "Massage"]}
{"name": "egon", "hobby_list": ["喊麦", "街舞"]}
]

list4 = []
for item in list3:
    for dic in list4:
        if item['name'] == dic['name']:
            dic['hobby'].append(item['hobby'])
            break
    else:
        list4.append({'name': item['name'], 'hobby_list': [item['hobby']]})
print(list4)
25、编程题

"""
一、定义一个学生类。有如下的类属性:
1 姓名
2 年龄
3 成绩(语文,数学,英语)[每科成绩的类型为整数]
类方法:
1 获取学生的姓名:get_name() 返回类型:str
2 获取学生的年龄:get_age() 返回类型:int
3 返回3门科目中最高分:get_course() 返回类型:int
写好类之后,可以定义2名学生测试
zm = Student('zhangming', 20, [69, 88, 100])
返回结果:
zhangming
20
100
"""

class Student():
    def __init__(self, name, age, score)
        self.name = name
        self.age = age
        self.score= score
    # isinstance函数判断一个对象是否是一个已知的类型,类似type
    def get_name(self):
        if isinstance(self.name, str):
            return self.name
    
    def get_age(self):
        if isinstance(self.age, int):
            return self.age
    
    def get_score(self):
        s = max(self.score)
        if isinstance(s, int):
            return s

zm = Student('zhangming', 20, [69, 88, 100])
print(zm.get_name())
print(zm.get_age())
print(zm.get_score())

"""
二、定义一个字典类:dictclass。完成下面的功能:
dict = dictclass({你需要操作的字典对象})
1 删除某个key,del_dict(key)
2 判断某个键是否在字典里,如果在返回键对应的值,不存在则返回"not found",get_dict(key)
3 返回键组成的列表:返回类型;(list),get_key()
4 合并字典,并且返回合并后字典的values组成的列表。返回类型:(list),update_dict({要合并的字典})
"""

class Dictclass():
    # 构造函数
    # 对当前对象的实例的初始化
    def __init__(self, class1):
        self.classs = class1

    def del_dict(self, key):
        if key in self.classs.keys():
            del self.classs[key]
            return self.classs
        return "不存在这个值,无需删除"

    def get_dict(self, key):
        if key in self.classs.keys():
            return self.classs[key]
        return "not found"

    def get_key(self):
        return list(self.classs.keys())

    def update_dict(self, dict1):
        # 方法1
        # self.classs.update(dict1)
        # 方法2,对于重复的key,B会覆盖A
        a = dict(self.classs, **dict1)
        return a


a = Dictclass({"姓名": "张三", "年龄": "18", "性别": "男"})
print(a.del_dict("年龄"))
print(a.get_dict("姓名"))
print(a.get_key())
print(a.update_dict({"年薪": 0}))

"""
三、定义一个列表的操作类:Listinfo
包括的方法:
1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
2 列表元素取值:get_key(num) [num:整数类型]
3 列表合并:update_list(list) [list:列表类型]
4 删除并且返回最后一个元素:del_key()
a = Listinfo([44,222,111,333,454,'sss','333'])
"""

class Listinfo():
    def __init__(self, my_list):
        self.listt = my_list

    def add_key(self, keyname):
        if isinstance(keyname, (str, int)):
            self.listt.append(keyname)
            return self.listt
        return "error"

    def get_key(self, num):
        if num >= 0 and num < len(self.listt):
            a = self.listt[num]
            return a
        return "超出取值范围"

    def update_list(self, list1):
        if isinstance(list1, list):
            self.listt.extend(list1)
            return self.listt
        return "类型错误"

    def del_key(self):
        a = self.listt.pop(-1)
        return a


a = Listinfo([44, 222, 111, 333, 454, 'sss', '333'])
print(a.add_key(1))
print(a.get_key(1))
print(a.update_list([1, 2, 3]))
print(a.del_key())

"""
定义一个集合的操作类:Setinfo
包括的方法:
1 集合元素添加: add_setinfo(keyname) [keyname:字符串或者整数类型]
2 集合的交集:get_intersection(unioninfo) [unioninfo :集合类型]
3 集合的并集: get_union(unioninfo)[unioninfo :集合类型]
4 集合的差集:del_difference(unioninfo) [unioninfo :集合类型]
set_info = Setinfo(你要操作的集合)
"""

class Setinfo():
    def __init__(self, my_set):
        self.sett = my_set

    def add_setinfo(self, keyname):
        if isinstance(keyname, (str, int)):
            self.sett.add(keyname)
            return self.sett

    def get_intersection(self, unioninfo):
        if isinstance(unioninfo, set):
            a = self.sett & (unioninfo)
            return a

    def get_union(self, unioninfo):
        if isinstance(unioninfo, set):
            a = self.sett | (unioninfo)
            return a

    def del_difference(self, unioninfo):
        if isinstance(unioninfo, set):
            a = self.sett - (unioninfo)
            return a


a = Setinfo({1, "a", 2, "b", 3, "c"})
print(a.add_setinfo(4))
print(a.get_intersection({1, 2, "a"}))
print(a.get_union({2, 3, 4, "c", "d"}))
print(a.del_difference({1, 2, 3, 4}))
27、什么是异步?什么是异步阻塞?

异步:在同一时间 可以同时做两件事情(多线程、多进程)
异步阻塞:在同一时刻各自的线程或者进程中存在IO操作 而不影响其他线程或进程

28、写一个程序,包含十个线程,子线程必须等待主线程sleep10秒钟之后才执行,并打印当前时间
from threading import Timer
def func():pass
for i in range(10):
    Timer(10, func).start()
29、你所了解的锁有哪些

互斥锁 在同一线程或者进程之间,当有两个acquire的时候,就会产生阻塞,造成死锁
递归锁 在同一线程或者进程之间,无论acquire多少次都不会产生阻塞

30、threading.Rlock和threading.Lock的区别

Rlock是递归锁
Lock是互斥锁

31、简述 生成器、迭代器、可迭代对象 以及应用场景?

生成器(generator):列表元素可以按照某种算法推算出来(有规律的数组),则可以在循环的过程中不断推算出后续的元素。这种方式就不必创建完整的list,可以节省大量的空间。python中,这种一边循环一边计算的机制,称为生成器:generator。

迭代器(Iterator):可以被next()函数调用并不断返回下一个值得对象称为迭代器(Iterator)。

可迭代对象(Iterable):可以直接作用于for循环的对象(其中包含集合数据类型:list\tuple\dict\set\str;还包含生成器表达式和生成器函数)。可以使用isinstance()判断一个对象是否是Iterable对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,735评论 0 10
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,533评论 0 5
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 5,962评论 3 28
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,697评论 0 11
  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 1,635评论 0 6