博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python面试宝典(第三章 Python高级)
阅读量:2301 次
发布时间:2019-05-09

本文共 5626 字,大约阅读时间需要 18 分钟。

Python面试宝典(第三章 Python高级)

Python面试宝典(第三章 Python高级)

元类

问题:Python 中类方法、类实例方法、静态方法有何区别?

在这里插入图片描述

问题:Python 中如何动态获取和设置对象的属性?

在这里插入图片描述

内存管理与垃圾回收机制

问题:Python 的内存管理机制及调优手段?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
内存池:

  1. Python 的内存机制呈现金字塔形状,-1,-2 层主要有操作系统进行操作;

  2. 第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操作;

  3. 第 1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于

    256K 时有该层直接分配内存;

  4. 第 3 层是最上层,也就是我们对 Python 对象的直接操作;

    Python 在运行期间会大量地执行 malloc 和 free 的操作,频繁地在用户态和核心态之间进行切换,这将严重影响 Python 的执行效率。为了加速 Python 的执行效率,Python 引入了一个内存池 机制,用于管理对小块内存的申请和释放。

Python 内部默认的小块内存与大块内存的分界点定在 256 个字节,当申请的内存小于 256 字节 时,PyObject_Malloc 会在内存池中申请内存;当申请的内存大于 256 字节时,PyObject_Malloc 的 行为将蜕化为 malloc 的行为。当然,通过修改 Python 源代码,我们可以改变这个默认值,从而改 变 Python 的默认内存管理行为。

调优手段(了解)

1.手动垃圾回收

2.调高垃圾回收阈值

3.避免循环引用(手动解循环引用和使用弱引用)

问题:内存泄露是什么?如何避免?

在这里插入图片描述

函数

函数参数

问题:Python 函数调用的时候参数的传递方式是值传递还是引用传递?

Python 的参数传递有:位置参数、默认参数、可变参数、关键字参数。

函数的传值到底是值传递还是引用传递,要分情况:

不可变参数用值传递:

像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象

可变参数是引用传递的:

比如像列表,字典这样的对象是通过引用传递、和 C 语言里面的用指针传递数组很相似,可变对象能在函数内部改变。

问题:对缺省参数的理解 ?

在这里插入图片描述

问题:为什么函数名字可以当做参数用?

Python 中一切皆对象,函数名是函数在内存中的空间,也是一个对象。

问题:Python 中 pass 语句的作用是什么?

在编写代码时只写框架思路,具体实现还未编写就可以用 pass 进行占位,使程序不报错,不会进 行任何操作。

问题:有这样一段代码,print c 会输出什么,为什么?

在这里插入图片描述

在这里插入图片描述

问题:交换两个变量的值?

在这里插入图片描述

内建函数

问题:map 函数和 reduce 函数?

在这里插入图片描述

map()函数

# 传入一个参数 def one_p(x):     return x * x print 'map1.1:', map(one_p, range(1, 5))  #结果:map1.1: [1, 4, 9, 16] print 'map1.2:', map(one_p, [1, 2, 3, 4, 5, 6]) #结果:map1.2: [1, 4, 9, 16, 25, 36]    # 传入多个参数 a = [1, 2, 3, 4, 5] b = [1, 1, 6, 2, 3] c = [1, 2, 3, 4, 5] s = map(lambda (x, y, z): x * y * z, zip(a, b, c)) print 'map2:', s #结果:map2: [1, 4, 54, 32, 75]

reduce()函数

r1 = reduce(lambda x, y: x * y, (2, 2, 6, 2))  # 运算过程:(((2*2)*6)*2) r2 = reduce(lambda x, y: x * y, (2, 2, 6), 2)  # 运算过程:(((2*2)*6)*2)   print 'r1:', r1  # 结果:r1: 48 print 'r2:', r2  # 结果:r2: 48

问题:递归函数停止的条件?

在这里插入图片描述

问题:回调函数,如何通信的?

回调函数是把函数的指针(地址)作为参数传递给另一个函数,将整个函数当作一个对象,赋值给调 用的函数。

问题:Python 主要的内置数据类型都有哪些? print dir( ‘a ’) 的输出?

在这里插入图片描述

问题:print(list(map(lambda x: x * x, [y for y in range(3)])))的输出?

在这里插入图片描述

问题:hasattr() getattr() setattr() 函数使用详解?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Lambda

问题:什么是 lambda 函数? 有什么好处?

在这里插入图片描述

问题:什么是 lambda 函数?它有什么好处?写一个匿名函数求两个数的和?

在这里插入图片描述

问题:下面这段代码的输出结果将是什么?请解释。

在这里插入图片描述

在这里插入图片描述

设计模式

单例

问题:请手写一个单例

在这里插入图片描述

在这里插入图片描述

问题:单例模式的应用场景有哪些?

在这里插入图片描述

工厂

装饰器

问题:对装饰器的理解 ,并写出一个计时器记录方法执行性能的装饰器?

在这里插入图片描述

问题:解释一下什么是闭包?

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为 闭包。

问题:函数装饰器有什么作用?

装饰器本质上是一个 Python 函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装 饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。 比如:插入日志、性能测试、事务处理、缓存、 权限的校验等场景 有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。

生成器

问题:生成器、迭代器的区别?

迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、 dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。在后台 for 语句对容器对象调用 iter()函数,iter() 是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next() 也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。

**生成器(Generator)**是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置 和所有的数据值)

**区别:**生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且 生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当 发生器终结时,还会自动抛出 StopIteration 异常。

问题:X 是什么类型?

在这里插入图片描述

问题:请尝试用“一行代码”实现将 1-N 的整数列表以 3 为单位分组,比如 1-100 分组后为?

在这里插入图片描述

问题:Python 中 yield 的用法?

在这里插入图片描述

面向对象

类与对象

问题:Python 中的可变对象和不可变对象?

在这里插入图片描述

问题:Python 中 is 和==的区别?

is 判断的是 a 对象是否就是 b 对象,是通过 id 来判断的。

==判断的是 a 对象的值是否和 b 对象的值相等,是通过 value 来判断的。

问题:Python 的魔法方法

在这里插入图片描述

在这里插入图片描述

问题:面向对象中怎么实现只读属性?

在这里插入图片描述

在这里插入图片描述

问题:谈谈你对面向对象的理解?

面向对象是相对于面向过程而言的。面向过程语言是一种基于功能分析的、以算法为中心的程序设计方法;而面 向对象是一种基于结构分析的、以数据为中心的程序设计思想。在面向对象语言中有一个有很重要东西,叫做类。

面向对象有三大特性:封装、继承、多态。

正则表达式

在这里插入图片描述

问题:Python里match与search的区别?

在这里插入图片描述

问题:请写出下列正则关键字的含义?

在这里插入图片描述

在这里插入图片描述

系统编程

问题:进程总结

在这里插入图片描述

在这里插入图片描述

Process 语法结构:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进程之间的通信-Queue
在这里插入图片描述
在这里插入图片描述

进程池 Pool

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:谈谈你对多进程,多线程,以及协程的理解,项目是否用?

在这里插入图片描述

问题:什么是多线程竞争?

在这里插入图片描述

问题:解释一下什么是锁,有哪几种锁?

锁(Lock)是 Python 提供的对线程控制的对象。有互斥锁、可重入锁、死锁。

问题:什么是死锁呢?

在这里插入图片描述

在这里插入图片描述

问题:什么是线程安全,什么是互斥锁?

每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

同一个进程中的多线程之间是共享系统资源的,多个线程同时对一个对象进行操作,一个线程操作 尚未结束,另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁, 保证每个线程对该对象的操作都得到正确的结果。

问题:说说下面几个概念:同步,异步,阻塞,非阻塞?

在这里插入图片描述

问题:什么是僵尸进程和孤儿进程?怎么避免僵尸进程?

在这里插入图片描述

问题:Python 中的进程与线程的使用场景?

多进程适合在 CPU 密集型操作(cpu 操作指令比较多,如位数多的浮点运算)。 多线程适

合在 IO 密集型操作(读写数据操作较多的,比如爬虫)。

问题:线程是并发还是并行,进程是并发还是并行?

线程是并发,进程是并行;

进程之间相互独立,是系统分配资源的最小单位,同一个线程中的所有线程共享资源。

问题:并行(parallel)和并发(concurrency)?

并行:同一时刻多个任务同时在运行。

并发:在同一时间间隔内多个任务都在运行,但是并不会在同一时刻同时运行,存在交替执行的情

况。

实现并行的库有:multiprocessing

实现并发的库有:threading
程序需要执行较多的读写、请求和回复任务的需要大量的 IO 操作,IO 密集型操作使用并发更好。 CPU 运算量大的程序程序,使用并行会更好。

问题:IO 密集型和 CPU 密集型区别?

IO 密集型:系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存)的读/写。

CPU 密集型:大部份时间用来做计算、逻辑判断等 CPU 动作的程序称之 CPU 密集型。

网络编程

UDP总结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TCP 总结

在这里插入图片描述

TCP 客户端的创建流程:
1.创建 TCP 的 socket 套接字
2.连接服务器 3.发送数据给服务器端
4.接收服务器端发送来的消息
5.关闭套接字
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:怎么实现强行关闭客户端和服务器之间的连接?

在 socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则 调 用 socket 的 close 方法,循环结束,从而达到关闭连接的目的。

问题:简述 TCP 和 UDP 的区别以及优缺点?

UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。

优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数 据是否会正确接收,也不重复发送,不可靠。

TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手

优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP 相对于 UDP 速度慢一点,要求系统资源较多。

问题:简述浏览器通过 WSGI 请求动态资源的过程?

在这里插入图片描述

问题:描述用浏览器访问 www.baidu.com 的过程

在这里插入图片描述

在这里插入图片描述

问题:Post 和 Get 请求的区别?

在这里插入图片描述

在这里插入图片描述

问题:cookie 和 session 的区别?

在这里插入图片描述

在这里插入图片描述

HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,然后讲出他们都 表示什么意思?

在这里插入图片描述

问题:请简单说一下三次握手和四次挥手?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:说一下什么是 tcp 的 2MSL?

在这里插入图片描述

问题:为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?

在这里插入图片描述

问题:说说 HTTP 和 HTTPS 区别?

HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安 全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于 对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL+HTTP 协 议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全。

HTTPS 和 HTTP 的区别主要如下:

1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。

2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。

3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。

4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。

问题:谈一下 HTTP 协议以及协议头部中表示数据类型的字段?

在这里插入图片描述

问题:HTTP 请求方法都有什么?

在这里插入图片描述

在这里插入图片描述

问题:使用 Socket 套接字需要传入哪些参数 ?

在这里插入图片描述

问题:HTTP 常见请求头?

在这里插入图片描述

问题:七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?

在这里插入图片描述

问题:url 的形式?

在这里插入图片描述

在这里插入图片描述

转载地址:http://bluib.baihongyu.com/

你可能感兴趣的文章
计算最大公因数的欧几里德算法
查看>>
在驱动程序中改变进程状态并调用schedule()
查看>>
C语言中的-------结构
查看>>
栈的应用---平衡符号
查看>>
用栈计算逆波兰式
查看>>
利用数组栈将中缀表达式转换成后缀表达式
查看>>
SpringBoot + Mybatis-plus实战之Mybatis-plus的一级缓存、二级缓存
查看>>
Java 字符串型的日期对比大小
查看>>
Java常见异常类型
查看>>
aviator 实现 List 的求和、排序、最大、最小值
查看>>
android内存碎片问题优化梳理
查看>>
android相机场景下整机内存分析
查看>>
armcm3权威指南笔记----arm编程中地址未对齐方面的影响
查看>>
MMU,cache,裸机嵌入式C编程还有带操作系统的编程
查看>>
软件工程式工作—NQS组历程
查看>>
iOS 网络编程4-发布异步请求
查看>>
iOS开发何如在调试的时候轻松找到程序在哪里崩溃
查看>>
iOS模拟器问题: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)
查看>>
iOS8 模拟器键盘输入中文
查看>>
表格视图
查看>>