s10_python_examination

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @author: Wu
# @date:18-9-25

def paper():
    pass
    """
复习:6,12,13,19,20,23
Python10期考试题
1、常用字符串格式化有哪些?并说明他们的区别(6)  
2、请写出【元祖,列表,字典,集合】的定义方法、新增方法、更改方法、删除方法(4)
3、利用 python打印前一天的本地时间,格式为‘2018-01-30’(面试题)(5)
4、python中search和match的区别(面试题)(5)
5、什么是1ambda函数,有什么好处(2)
6、说明__init__和__new__的作用(2)  
7、简述反射是怎么回事?(3)
8、解释python中深拷贝和浅拷贝的区别(3)
9、用最简洁的方式生成这样一个列表【4,16,32,64,128】③)
10、python中如何实现随机数并打印,默认的随机数范围是多少?(2)
11、新式类和经典类(旧式类)的区别(一种一分)(2)
12、装饰器什么时候被执行的(3)
13、什么是"并发"?什么是"并行"?(2)
14、以个人理解描述 Event 的执行原理(2)
15、什么是粘包,如何避免?(3)
16、什么是进程?(2)
17、什么是线程?(2)
18、简述你对管道、队列的理解;(3)
19、编程题;写一个装饰器实现功能:打印程序的运行时间(5)
20、读以下代码,写出答案并简述原因(面试题建议不用电脑)(5)
下面代码会输出什么:
def f(x,l=[]):
    for i in range(x):
        l.append(i * i)
    print(l)


f(2)
f(3, [3, 2, 1])
f(3)

21、使用 python简单实现打印九九乘法表(3)
22、简述 python GIL的概念,以及它对 python多线程的影响?(2)
23、写一个单例模式(4)
24、编程题:将以下1ist3的格式转换成1ist4格式(8)

  list3 = [
        {"name": "alex", "hobby": "smoking"},
        {"name": "alex", "hobby": "drinking"},
        {"name": "alex", "hobby": "perm"},
        {"name": "alex", "hobby": "Massage"},
        {"name": "egon", "hobby": "singing"},
        {"name": "egon", "hobby": "dancing"},
        ]

    list4=[
        {"name":"alex" hobby_list":["smoking","drinking","perm"," Massage"]},
        {"name":"egon"," hobby_list":["singing","dancing"]}
        ]



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


"""
26、写一个 socket客户端和服务端兵进行通讯(4
27、什么是异步,什么是异步阻塞?(2)
28、写一个程序,包含十个线程,子线程必须等待主线程s1eep10秒钟之后才执行,并打印当前时间(5)
29、你所了解的锁都有哪些?(2)
30、 threading.RLock和 threading.Lock的区别

"""


def test1():
    print("%s %d  #语法糖")
    print("format #直接调用函数")


def test3(p=1):
    """
    important

    :return:
    """
    if p == 1:
        import time
        import datetime

        print(datetime.date.fromtimestamp(time.time() - 3600 * 24))
    elif p == 2:
        import time
        print(time.strftime("%Y-%m-%d", time.localtime(time.time() - 3600 * 24)))


def test4():
    """
    important

    :return:
    """
    # answer

    """
    match()函数只检测RE是不是在string的开始位置匹配, 
    search()会扫描整个string查找匹配, 
    也就是说match()只有在0位置匹配成功的话才有返回,
    如果不是开始位置匹配成功的话,match()就返回none
    """
    import re
    print(re.match('super', 'superstition').span())
    print(re.match('super', 'isuperstition'))
    print(re.search('super', 'isuperstition').span())
    pass


def test5():
    print("5、什么是1ambda函数,有什么好处(2)")
    print("匿名函数,简洁明了;可以和内置函数合用,有效减少冗余代码")


def test6():
    print("6、说明__init__和__new__的作用(2)")
    print("__init__#是初始化方法;对象初始化时执行的方法 ")
    print("__new__ #是构造方法; 继承自object的新式类才有__new__方法,"
          "__new__至少要有一个参数cls,代表要实例化的类"
          "__new__() 方法会返回cls(cls指代当前类)的实例,然后该类的__init__()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数")
    print("__del__ #是析构方法,删除一个对象之前执行的方法")


def test7():
    print("7、简述反射是怎么回事?")
    print("用字符串类型的变更名或函数名来调用对应的属性")


def test8():
    print("8、解释python中深拷贝和浅拷贝的区别")
    print("深拷贝:不管数据类型有多少层,都开僻新的内存空间来存储一份与原来数据一样的数据")
    print("浅拷贝:只新开僻一块空间来存第一层数据")


def test9(p=1):
    if p == 1:

        def f(x):
            return 4 if x < 4 else 2 ** x

        print("1st answer:", [f(i) for i in range(3, 8)])

    elif p == 2:
        print("2nd answer:", list(map(lambda x: 4 if x < 4 else 2 ** x, [i for i in range(3, 8)])))

    elif p == 3:
        print("3rd answer:", [4 if i < 4 else 2 ** i for i in range(3, 8)])
    elif p == 4:

        print("4th answer:", [4 if i == 3 else 2 ** i for i in range(3, 8)])

    elif p == 5:

        print("5th answer:", [4 if i == 3 else pow(2, i) for i in range(3, 8)])


def test10():
    print("10、python中如何实现随机数并打印, 默认的随机数范围是多少?(2)")
    print("import random")
    print("random.random() #默范围是在0-1之间的数")


def test11():
    print("11、新式类和经典类(旧式类)的区别")
    print("新式类:默认继承object,在继承过程中寻找一个方法时默认遵循广度优先,内置mro方法来标识广度优先的顺序")
    print("经典类:在继承过程中寻找一个方法时默认遵循深度优先")


def test12():
    print("12、装饰器什么时候被执行的")
    print("加载函数的时候被执行")
    print("for example:")

    def time_log(f):
        def wrapper(*args, **kwargs):
            print("in time log func")
            res = f(*args, **kwargs)
            return res

        return wrapper

    @time_log
    def func(strings):
        print("hello", strings)

    func("test")


def test13():
    print('13、什么是"并发"?什么是"并行"?')
    print("并发:在同一时候,只有一个CPU在处理任务")
    print("并行:真正意义上的在同一时刻,有多个CPU在处理任务,即同时在运行")
    print("在python中:多线程是并发,多进程是并行")
    print("在python中:多进程在同一时刻可以占用多个CPU执行")
    print("在python中:多线程看起来是在同时执行,但是GIL的限制,在同一时刻只有一个线程给到CPU执行")


def test14():
    print("以个人理解描述 Event 的执行原理")
    print("在多进程或多线程中,Event对像有True和False两个状态,分别控制wait方法是否阻塞,如果状态是True,wait()就非阻塞状态,如果是False,则阻塞")
    print("在多进程中,Event之所以能通信,是因为基于IPC")
    print("在多线程中,Event之所以能通信,是因为主线程与子线程本身就是可以通信的")


def test15():
    print("15、什么是粘包,如何避免?")
    print("粘包:TCP协议是面向流连接的数据传输协议,传输数据是无边界的")
    print("避免粘包:自定义协议;python中可以使用struct模块;UDP没有粘包问题")


def test16():
    print("16、什么是进程?")
    print("运行中的程序")
    print("是最小的资源分配单位")
    print("是多个任务之间数据安全和内存隔离的约束")


def test17():
    print("17、什么是线程?")
    print("CPU调度的最小单位")
    print("是进程的一部份,可以共享进程中的数据")


def test18():
    print("18、简述你对管道、队列的理解;")
    print("管道:python中,双向通信的数据容器,多进程中的IPC中用到,数据不安全")
    print("队列:python中,先进先出,基于管理和锁实现的一个可以在进程/线程中传递数据的容器,数据安全")


def test19():
    import time

    def log_time(fun):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            res = fun(*args, **kwargs)
            print(time.time() - start_time)
            return res

        return wrapper

    @log_time
    def func():
        print("hello")

    func()


def test20():
    """

    20、读以下代码,写出答案并简述原因(面试题建议不用电脑)(5)
下面代码会输出什么:
def f(x,l=[]):
    for i in range(x):
        l.append(i * i)
    print(l)


f(2)
f(3, [3, 2, 1])
f(3)


    :return:
    """

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

    f(2)
    f(3, [3, 2, 1])
    f(3)
    print("因为经过第一次f(2)之后,默认参数l的值已经是[0,1]")


def test21(p=1):
    if p == 2:
        for i in range(1, 10):
            for k in range(1, i):
                print(end="        ")
            for j in range(i, 10):
                print("%d*%d=%2d" % (i, j, i * j), end="  ")
            print("")

    elif p == 1:

        for i in range(1, 10):
            for j in range(i, 10):
                print("%d*%d=%2d" % (i, j, i * j), end="  ")
            print("")

    elif p == 3:
        for i in range(1, 10):
            for j in range(1, i + 1):
                print("%d*%d=%2d" % (j, i, i * j), end="  ")
            print("")

    elif p == 4:

        for i in range(1, 10):
            for k in range(1, 10 - i):
                print(end="        ")
            for j in range(1, i + 1):
                print("%d*%d=%2d" % (j, i, i * j), end="  ")
            print("")


def test22():
    print("22、简述 python GIL的概念,以及它对 python多线程的影响?(2)")
    print("python GIL即python全局解释器锁")
    print("用来在Cpython解释器解释一段多线程代码时,约束线程在同一时刻只能有一个线程访问CPU")
    print("对python多线程的影响:在Cpython解释器下启动的多线程并不能真正的实现并行")


def test23():
    print("23、写一个单例模式(4)")
    print("")


def test24(p=1):
    list3 = [
        {"name": "alex", "hobby": "smoking"},
        {"name": "alex", "hobby": "drinking"},
        {"name": "alex", "hobby": "perm"},
        {"name": "alex", "hobby": "Massage"},
        {"name": "egon", "hobby": "singing"},
        {"name": "egon", "hobby": "dancing"},

    ]

    list4 = []

    if p == 1:  # 方法一:
        tmp_dic = {}

        for item in list3:
            if not tmp_dic.get(item["name"]):
                tmp_dic[item["name"]] = []
            tmp_dic[item["name"]].append(item["hobby"])
        for key in tmp_dic:
            list4.append({"name": key, "hobby_list": tmp_dic[key]})
        print(list4)

    elif p == 2:  # 方法二
        for item in list3:
            for dic in list4:
                if dic["name"] == item["name"]:
                    dic["hobby_list"].append(item["hobby"])
                    break
            else:
                list4.append({"name": item["name"], "hobby_list": [item["hobby"]]})
        print(list4)


def test25():
    class Student(object):
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score

        def get_name(self):
            pass

        def get_age(self):
            pass

        def get_course(self):
            return '{name}\n{age}\n{max_score}\n"""'.format(name=self.name, age=self.age, max_score=max(self.score))

    zm = Student("zhangming", 20, [69, 88, 100])
    print(zm.get_course())


def test28(p=1):
    if p == 1:  #使用非阻塞式的timer计时器的解法

        from threading import Timer
        import datetime

        def func():
            print(datetime.datetime.now())

        for i in range(10):
            Timer(10, func).start()    #非阻塞式的计时器

        print(datetime.datetime.now())

    elif p == 2:  #不符合题要求的解法,主线程是阻塞的,相当于主线程等待,而非子线程等待

        from threading import Thread
        import datetime
        import time

        def func():
            print(datetime.datetime.now())

        t_list = []
        for i in range(10):
            t = Thread(target=func)
            t_list.append(t)
        print(datetime.datetime.now())
        time.sleep(10)
        for t in t_list:
            t.start()
            t.join()

def test29():
    print("29、你所了解的锁都有哪些?(2)")
    print("互斥锁:from multiprocessing/threading import Lock")
    print("递归锁:from multiprocessing/threading import RLock")

def test30():
    print("30、threading.RLock和 threading.Lock的区别?(2)")
    print("互斥锁:在同一个线程或进程之间,当有两个acquire的时候,就会产生死锁")
    print("递归锁:在同一个线程或进程之间,无论acquire多少次,也不会产生死锁,但要注意的是acquire多少次,就需要release多少次后,其它线程或进程才能使用锁的数据")

  

posted @ 2018-09-27 18:03  rootid  阅读(414)  评论(0编辑  收藏  举报