python面试常见问题

python面试常见问题

  • 1、“==”与is的区别
  • 2、list与tuple的区别
  • 3、python中list与dict
  • 4、局部变量和全局变量
  • 5、迭代器和生成器
  • 6、yield
  • 7、import过程
  • 8、python装饰器
  • 9、python特点(封装、继承、多态)
  • 10、垃圾回收()
  • 11、python内存管理机制、内存泄漏
  • 12、深拷贝/浅拷贝区别
  • 13、GIL全局解释器锁
  • 14、python2和python3的区别
  • 15、提高python运行效率的方法
  • 16、类:单例模式
  • 17、python常见异常
  • 18、列出几种魔法方法并介绍
  • 19、python进程、线程、协程
  • 20、python中的锁
  • 21、python传参数是传值还是传址

1、“==”与is的区别

python面试常见问题_第1张图片
对象=确定内存地址+存储在这块内存中的值

2、list与tuple的区别

python面试常见问题_第2张图片

3、python中list与dict

python面试常见问题_第3张图片
list实现原理
dict实现原理

4、局部变量和全局变量

python面试常见问题_第4张图片

5、迭代器和生成器

生成器、迭代器详解python面试常见问题_第5张图片
python面试常见问题_第6张图片

6、yield

python面试常见问题_第7张图片

7、import过程

python面试常见问题_第8张图片

8、python装饰器

python面试常见问题_第9张图片
python面试常见问题_第10张图片
python面试常见问题_第11张图片
python面试常见问题_第12张图片

9、python特点(封装、继承、多态)

python面试常见问题_第13张图片

10、垃圾回收()

完美详解
python采用的是引用计数机制为主,标记-清除分代收集机制为辅的策略
python面试常见问题_第14张图片
python面试常见问题_第15张图片
python面试常见问题_第16张图片
python面试常见问题_第17张图片
python面试常见问题_第18张图片

11、python内存管理机制、内存泄漏

python面试常见问题_第19张图片python内存管理优化方法:
在这里插入图片描述
python面试常见问题_第20张图片

12、深拷贝/浅拷贝区别

python面试常见问题_第21张图片

13、GIL全局解释器锁

python面试常见问题_第22张图片

14、python2和python3的区别

python面试常见问题_第23张图片

15、提高python运行效率的方法

python面试常见问题_第24张图片

16、类:单例模式

python面试常见问题_第25张图片
python面试常见问题_第26张图片

17、python常见异常

python面试常见问题_第27张图片

18、列出几种魔法方法并介绍

python面试常见问题_第28张图片

19、python进程、线程、协程

python面试常见问题_第29张图片
python面试常见问题_第30张图片
python面试常见问题_第31张图片

进程间通信:

import time
from multiprocessing import Process, Queue, current_process
# 进程间通信
class WriteProcess(Process):
    """写的进程"""
    def __init__(self, q, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.q = q
    def run(self):
        ls = ['qqqqqqqqq','wwwwwwwww','rrrrrrrrr']
        for l in ls:
            print('写的内容{}-----{}'.format(l, current_process().name))
            # 写入
            self.q.put(l)
            time.sleep(1)
class ReadProcess(Process):
    """读的进程"""
    def __init__(self, q, *args, **kwargs):
        self.q = q
        super().__init__(*args, **kwargs)
    def run(self):
        while True:
            content = self.q.get()
            print("读的内容{}---{}".format(content, self.name))
if __name__ == '__main__':
    q = Queue()
    w_process = WriteProcess(q, name='write')
    w_process.start()
    r_process = ReadProcess(q, name='read')
    r_process.start()
    w_process.join()
    # r_process.join()
    # 读的进程死循环,无法等待
    r_process.terminate()

进程池:

import time
from multiprocessing import current_process, Pool
def run(file_name, num):
    """写入文件"""
    with open(file_name, 'a+', encoding='utf-8') as f:
        # 获取当前进程对象
        now_process = current_process()
        content = '{}---{}-----{}\n'.format(now_process.name, now_process.pid, num)
        f.write(content)
        print(content)
        time.sleep(2)
    return 'ok'
if __name__ == '__main__':
    pool = Pool(2)
    file_name = 'pool_text.txt'
    # for i in range(3):
    #     # 同步添加进程
    #     pool.apply(run, args=(file_name, i))
    for i in range(3):
        # 异步添加进程
        r = pool.apply_async(run, args=(file_name, i))
        print(r)
    # pool.starmap(run, [(file_name, 1), (file_name, 3), (file_name, 6)])
    pool.close()
    pool.join()

线程创建:

# 实例的方式生成线程
import os
import threading
import time
def loop():
    """新线程的执行代码"""
    n = 0
    while n < 3:
        now_thread = threading.current_thread()
        print("线程名:", now_thread.name)
        print(n)
        print(os.getpid())
        time.sleep(1)
        n += 1
def use_thread():
    """使用线程来实现"""
    # 当前正在执行的线程名称
    now_thread = threading.current_thread()
    print("线程名:", now_thread.name)
    t = threading.Thread(target=loop, name='loop_thread')
    t.start()
    t.join()
if __name__ == '__main__':
    print(os.getpid())
    use_thread()

多线程:

import threading
import time
from concurrent.futures.thread import ThreadPoolExecutor
from multiprocessing.dummy import Pool

def run(n):
    """线程要做的事情"""
    time.sleep(1)
    print("-------name:{}---------n:{}--".format(threading.current_thread().name, n))
def main():
    """使用传统方式"""
    t1 = time.time()        # 获取当前时间
    for i in range(5):
        run(i)
    print("任务总时间:", time.time() - t1)

def main_use_thread():
    """使用多线程做
    方法1:
    """
    # 资源有限 假设最多跑10个线程
    t1 = time.time()
    ls = []
    for count in range(10):
        for i in range(10):
            t = threading.Thread(target=run, args=(i, ))         # 传入参数 是元组类型  一个参数末尾需要,
            ls.append(t)
            t.start()
        for l in ls:
            l.join()
    print(time.time() - t1)

def main_use_pool():
    """ 
    方法2:
    线程池优化"""
    t1 = time.time()
    n = range(100)
    pool = Pool(10)
    pool.map(run, n)
    pool.close()
    pool.join()
    print(time.time() - t1)

def main_use_executor():
    """
    方法3:
    使用ThreadPoolExecutor优化;最优方法
    """
    t1 = time.time()
    n = range(100)
    with ThreadPoolExecutor(max_workers=100) as executor:
        executor.map(run, n)
    print('==================', time.time() - t1)

if __name__ == '__main__':
    main_use_thread()

python面试常见问题_第32张图片
python面试常见问题_第33张图片

20、python中的锁

python面试常见问题_第34张图片

21、python传参数是传值还是传址

python面试常见问题_第35张图片

你可能感兴趣的:(python面试常见问题)