1、请编写装饰器runtime计算方法执行时间

    @runtime
    def say_hello():
    print “hello!”

    实现方法:

    1. def runtime(func):
    2. from time import time
    3. def wrapper(*args, **kwargs):
    4. # 定义开始和结束时间,把func放中间取得返回值
    5. start = time()
    6. func_return = func(*args, **kwargs)
    7. end = time()
    8. # 打印方法名和执行时间
    9. print(f'{func.__name__}() execute time: {end - start}s')
    10. # 返回func的返回值
    11. return func_return
    12. # 返回嵌套的函数
    13. return wrapper
    14. @runtime
    15. def say_hello():
    16. print("hello!")
    17. print(say_hello())
    1. import datetime
    2. import functools
    3. def runtime(func):
    4. @functools.wraps(func)
    5. def wrapper():
    6. starttime = datetime.datetime.now()
    7. print(starttime)
    8. return func()
    9. return wrapper
    10. @runtime
    11. def say_hello():
    12. print("hello!")
    13. say_hello()

    2、补全代码

    class calculate:

    def sum(self, a, b):
    return a+b

    def minus(self, a, b):
    return a-b

    def sum2(self, a,b ,c):
    return a+b+c

    def multi(self, a, b):
    return a*b

    请为 calculate 添加一个新方法run,实现通过传入方法名和参数即可调用对应方法,如下

    1. class calculate:
    2. def run(self, value, *args):
    3. print(eval('self.{}(*args)'.format(value)))
    4. def sum(self, a, b):
    5. return a+b
    6. def minus(self, a, b):
    7. return a-b
    8. def sum2(self, a, b, c):
    9. return a+b+c
    10. def multi(self, a, b):
    11. return a*b
    12. calc = calculate()
    13. calc .run("sum", 1, 2)
    14. calc .run("sum2", 1, 2, 3)
    1. class Calculate:
    2. def sum(self, a, b):
    3. return a + b
    4. def minus(self, a, b):
    5. return a - b
    6. def sum2(self, a, b, c):
    7. return a + b + c
    8. def multi(self, a, b):
    9. return a * b
    10. def run(self, method, *args):
    11. if method in dir(Calculate):
    12. try:
    13. re = eval('self.{}(*args)'.format(method))
    14. except TypeError:
    15. print('参数错误')
    16. return
    17. return re
    18. else:
    19. print('没有该函数')
    20. return None
    21. if __name__ == '__main__':
    22. calc = Calculate()
    23. print(calc.run("sum", 1, 2))
    24. print(calc.run("sum2", 1, 2, 3))

    3、 列表推导式
    members = [(‘liming’, ‘man’), (‘zhaoli’, ‘woman’), (‘zhang3’, ‘unknow’), (‘humei’, ‘woman’)]
    编写代码列出所有的woman

    1. members = [('liming', 'man'), ('zhaoli', 'woman'), ('zhang3', 'unknow'), ('humei', 'woman')]
    2. a = []
    3. [a.append(members[i][0]) for i in range(4) if members[i][1] == 'woman']
    4. print(a)

    4、 使用python编写socket程序,实现两个机器间传输文件

    1. server_socket.py
    2. #!/usr/bin/python3
    3. import socket
    4. s = socket.socket() #默认走TCP协议、IPV4地址格式
    5. ip_port = ('172.27.144.28',9999)
    6. s.bind(ip_port)
    7. s.listen(2)
    8. conn, address = s.accept()
    9. print("开始接收文件")
    10. while True:
    11. with open('/root/sock/file','ab') as f:
    12. data = conn.recv(1024)
    13. if data == b'quit':
    14. break
    15. f.write(data)
    16. conn.send('success'.encode())
    17. print("文件接收完成")
    18. s.close()
    19. client_socket.py
    20. #!/usr/bin/python3
    21. import socket
    22. s = socket.socket()
    23. ip_port = ('172.27.144.28', 9999)
    24. s.connect(ip_port)
    25. with open('/root/sock/test.py') as f:
    26. for i in f:
    27. i = i.encode()
    28. s.send(i)
    29. data = s.recv(1024)
    30. if data != b'success':
    31. break
    32. s.send('quit'.encode())

    5、写一个能产生 100 个僵尸进程的程序
    https://www.cnblogs.com/lemon-le/p/8125201.html
    https://blog.csdn.net/Freshduke/article/details/111544319

    1. #/usr/bin/python3
    2. import os
    3. import logging
    4. import time
    5. from multiprocessing import Process, current_process
    6. logging.basicConfig(
    7. level=logging.DEBUG,
    8. format='%(asctime)- 15s - %(levelname)s -%(message)s'
    9. )
    10. def run():
    11. logging.info('exit son process %s', current_process().pid)
    12. os._exit(3)
    13. for i in range (1,100):
    14. p = Process(target=run)
    15. p.start()
    16. print("start subprocess %d", os.getpid())
    17. time.sleep(1)

    6、 使用python编写程序,获取机器上物理网卡的信息,包括ip、mac、网卡名,以json格式输出
    下面是一段网卡信息的输出

    2: enp125s0f0: mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether f4:e5:f2:c1:a9:3f brd ff:ff:ff:ff:ff:ff
    inet 172.27.142.201/24 brd 172.27.142.255 scope global noprefixroute enp125s0f0
    valid_lft forever preferred_lft forever
    inet6 fe80::ab91:9c11:82e0:e34e/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
    1. import netifaces
    2. import json
    3. for name in netifaces.interfaces():
    4. info = netifaces.ifaddresses(name)
    5. for key in info.keys():
    6. if key == 2:
    7. info['IPV4'] = info.pop(key)
    8. elif key == 10:
    9. info['IPV6'] = info.pop(key)
    10. elif key == 17:
    11. info['MAC'] = info.pop(key)
    12. new_dict = {}
    13. new_dict[name] = info
    14. new_info = json.dumps(new_dict, sort_keys=True, indent=4, separators=(',', ':'))
    15. print('--wait--')
    16. print(new_info)

    7、首先编写一个tcp套接字服务端程序,能监听在指定端口(如 889,可通过命令行参数指定),然后编写一个客户端程序连接该服务端程序(要求客户端能逐渐消耗掉其所在机器的端口,每 0.01 秒增加一个线程去连接服务端)
    服务器

    1. import socket
    2. import threading
    3. import time
    4. def thread_job():
    5. while True:
    6. print(threading.current_thread())
    7. print(threading.active_count())
    8. time.sleep(1000)
    9. def main():
    10. server = socket.socket()
    11. server.bind(('172.27.144.19', 10100))
    12. server.listen(10)
    13. print('wait for connection.')
    14. while True:
    15. conn,addr = server.accept()
    16. print(conn,addr)
    17. print('continue.')
    18. thread = threading.Thread(target=thread_job, )
    19. thread.start()
    20. server.close()
    21. if __name__ == '__main__':
    22. main()

    客户端

    1. def thread_job():
    2. print(threading.current_thread())
    3. def main():
    4. while 1:
    5. client = socket.socket()
    6. client.connect(('172.27.144.19', 10100))
    7. thread = threading.Thread(target=thread_job,)
    8. thread.start()
    9. time.sleep(2) // 0.1
    10. if __name__ == '__main__':
    11. main()

    解法2

    1. # !/usr/bin/python3
    2. from socket import *
    3. from threading import Thread
    4. import sys
    5. class Server:
    6. def __init__(self, address):
    7. self.address = address
    8. self.__create_socket()
    9. self.__bind()
    10. def __create_socket(self):
    11. self.sockfd = socket()
    12. self.sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    13. def __bind(self):
    14. self.sockfd.bind(self.address)
    15. self.ip = self.address[0]
    16. self.port = self.address[1]
    17. def serve_start(self):
    18. self.sockfd.listen(50)
    19. print('Now listen port %d' % self.port)
    20. while True:
    21. connfd, addr = self.sockfd.accept()
    22. print('connect ', addr)
    23. client = Thread(target=self.__handle, args=(connfd,), daemon=True)
    24. client.start()
    25. def __handle(self, connfd):
    26. pass
    27. if __name__ == '__main__':
    28. args = sys.argv[1:]
    29. host = args[args.index('--host') + 1] if '--host' in args else '172.27.144.19'
    30. port = int(args[args.index('--port') + 1]) if '--port' in args else 7408
    31. server = Server((host, port))
    32. server.serve_start()
    1. # !/usr/bin/python3
    2. from socket import *
    3. from threading import Thread
    4. import time
    5. ADDR = ('172.27.144.19', 7408)
    6. def consume(sockfd):
    7. sockfd.connect(ADDR)
    8. while True:
    9. try:
    10. sockfd = socket()
    11. t = Thread(target=consume, args=(sockfd,), daemon=True)
    12. t.start()
    13. time.sleep(0.1)
    14. except KeyboardInterrupt:
    15. print('Over.')
    16. break

    8、编写两个程序,第一个能从 /dev/random 中读取数据,第二个能接收第一个读取的数据然后写入到 /dev/null 中,要求这两段程序运行在不同的机器上,可通过命令行参数来决定是通过 tcp 还是 udp 来传输数据,并且能分别控制数据的读取和传输速度

    1. 控制速度
    2. from socket import *
    3. import sys
    4. import time
    5. def read(sock_type='tcp', read_spead=1):
    6. with open('/dev/random', 'rb') as f:
    7. data = ''.encode()
    8. for i in range(read_spead):
    9. data += f.read(1024)
    10. time.sleep(1/4)
    11. return data
    12. print(read())

    client.py

    1. # !/usr/bin/python3
    2. from socket import *
    3. import sys
    4. class Client:
    5. def __init__(self, host, port):
    6. self.host = host
    7. self.port = port
    8. def run(self, read_spead, transport_speed):
    9. raise NotImplementedError
    10. def recv_and_write(self, conn, sock_type='tcp', write_spead=1024, transport_speed=1024):
    11. while True:
    12. with open('/dev/null', 'wb') as f:
    13. data = conn.recvfrom(transport_speed)[0] if sock_type == 'udp' else conn.recv(transport_speed)
    14. if data:
    15. for i in range(0, len(data), write_spead):
    16. f.write(data[i:i+write_spead])
    17. print(data[i:i+write_spead])
    18. else:
    19. return
    20. def close(self):
    21. raise NotImplementedError
    22. class TCPClient(Client):
    23. def __init__(self, host, port):
    24. super().__init__(host, port)
    25. self.conn = socket()
    26. def run(self, write_speed, transport_speed):
    27. self.conn.connect((self.host, self.port))
    28. self.recv_and_write(self.conn, 'tcp', write_spead=write_speed, transport_speed=transport_speed)
    29. self.close()
    30. def close(self):
    31. self.conn.close()
    32. class UDPClient(Client):
    33. def __init__(self, host, port):
    34. super().__init__(host, port)
    35. self.conn = socket(type=SOCK_DGRAM)
    36. def run(self, write_speed, transport_speed):
    37. self.conn.sendto(b'nothing', (self.host, self.port))
    38. self.recv_and_write(self.conn, 'udp', write_spead=write_speed, transport_speed=transport_speed)
    39. self.close()
    40. def close(self):
    41. self.conn.close()
    42. if __name__ == '__main__':
    43. sock_type = 'udp' if len(sys.argv) > 1 and sys.argv[1].lower() == 'udp' else 'tcp'
    44. HOST = '172.27.144.19'
    45. PORT = 7074
    46. if sock_type == 'tcp':
    47. server = TCPClient(HOST, PORT)
    48. else:
    49. server = UDPClient(HOST, PORT)
    50. try:
    51. server.run(write_speed=10, transport_speed=1024)
    52. except KeyboardInterrupt:
    53. print('Over')

    server.py

    1. # !/usr/bin/python3
    2. from socket import *
    3. import sys
    4. class Server:
    5. def __init__(self, host, port):
    6. self.host = host
    7. self.port = port
    8. def run(self, read_spead, transport_speed):
    9. raise NotImplementedError
    10. def read_and_send(self, conn, sock_type='tcp', addr=None, read_spead=1024, transport_speed=1024):
    11. try:
    12. while True:
    13. with open('/dev/random', 'rb') as f:
    14. data = f.read(read_spead)
    15. for i in range(0, len(data), transport_speed):
    16. conn.sendto(data[i:transport_speed + i], addr) if sock_type == 'udp' else conn.send(
    17. data[i:transport_speed + i])
    18. except BrokenPipeError:
    19. print('The client disconnects and the program exits.')
    20. return
    21. except ConnectionResetError:
    22. print('The client disconnects and the program exits.')
    23. return
    24. def close(self):
    25. raise NotImplementedError
    26. class TCPServer(Server):
    27. def __init__(self, host, port):
    28. super().__init__(host, port)
    29. self.conn = socket()
    30. self.conn.bind((host, port))
    31. def run(self, read_spead, transport_speed):
    32. self.conn.listen(5)
    33. self.connfd, self.addr = self.conn.accept()
    34. self.read_and_send(self.connfd, 'tcp')
    35. self.close()
    36. def close(self):
    37. self.connfd.close()
    38. self.conn.close()
    39. class UDPServer(Server):
    40. def __init__(self, host, port):
    41. super().__init__(host, port)
    42. self.conn = socket(type=SOCK_DGRAM)
    43. self.conn.bind((host, port))
    44. def run(self, read_spead, transport_speed):
    45. recv_data, addr = self.conn.recvfrom(1024)
    46. self.read_and_send(self.conn, 'udp', addr=addr, read_spead=read_spead, transport_speed=transport_speed)
    47. self.close()
    48. def close(self):
    49. self.conn.close()
    50. if __name__ == '__main__':
    51. sock_type = 'udp' if len(sys.argv) > 1 and sys.argv[1].lower() == 'udp' else 'tcp'
    52. HOST = '172.27.144.19'
    53. PORT = 7074
    54. if sock_type == 'tcp':
    55. server = TCPServer(HOST, PORT)
    56. else:
    57. server = UDPServer(HOST, PORT)
    58. try:
    59. server.run(read_spead=1024, transport_speed=1024)
    60. except KeyboardInterrupt:
    61. print('Over')