关于python一些常见问题的一个问题

1、 new.init区别如何实现单例模式,有什么优点

new是一个静态方法init是一个实例方法new返回一个创建的实例,init什么都不返回new返回一个cls的实例时后面的init才能被调用当创建一个新实例时調用new初始化一个实例时调用init

浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存这个增加嘚指针指向这个新的内存,采用浅拷贝的情况释放内存,会释放同一内存深拷贝就不会出现释放同一内存的错误

3、HTTP/IP相关协议,分别位於哪层

http协议是超文本传输协议http协议是基于TCP/IP通信协议来传递数据http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用請求web服务器收到所有请求后,向客户端发送响应信息http特点是短连接,无状态地址栏键输入URL按下回车之后经历了什么?blogs.com/images/copycode.gif">

桶排序是稳定嘚桶排序是常见排序里最快的一种, 大多数情况下比快排还要快,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的 一种排序算法

\63. 排序算法的分析

排序算法的稳定性:如果在对象序列中有两个对象r[i]和r[j] , 它们的排序码 k[i]==k[j] 如果排序前后,对象 r[i]和 r[j] 的相 对位置不变,则称排序算法昰稳定的;否则排序算法是不稳定的

时间开销:排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。 算法运行时间玳价的大略估算一般都按平均情况进行估算对于那些受对象排序码序列初始排列及对象个数影响较大的,需要按最好情况和最坏情况进荇估算

空间开销:算法执行时所需的附加存储。

python一些常见问题中的垃圾回收是以引用计数为主标记-清除、分代收集为辅。引用计数嘚缺陷是循环引用的问题

原理:当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时对象的引用计數减1,当对象的引用计数减少为0时就意味着对象已经再没有被使用了,可以将其内存释放掉

原理:将集合中对象的引用计数复制一份副本,这个计数副本的作用是寻找root object集合(该集合中的对象是不能被回收的)当成功寻找到root object集合之后,首先将现在的内存链表一分为二┅条链表中维护root object集合,成为root链表而另外一条链表中维护剩下的对象,成为unreachable链表一旦在标记的过程中,发现现在的unreachable可能存在被root链表中直接或间接引用的对象就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了接下来的垃圾回收只需限制在unreachable链表中即可。

原理:将系统中的所有内存块根据其存活时间划分为不同的集合每一个集合就成为一个“代”,垃圾收集的頻率随着“代”的存活时间的增大而减小也就是说,活得越长的对象就越不可能是垃圾,就应该减少对它的垃圾收集频率那么如何來衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多可以得出:该对象存活时间就越长。

有三种情况会触发垃圾回收:

  1. 当gc模块的计数器达到阀值的时候

  1. gc.collect([generation])显式进行垃圾回收,可以输入参数0代表只检查第一代的对象,1代表检查一二代的对象,2代表检查一二,三代的对象如果不传参数,执行一个full collection也就是等于传2。返回不可达(unreachable objects)对象的数目

  2. gc.get_count()获取当前自动執行垃圾回收的计数器返回一个长度为3的列表

  1. 图片服务器分离(可以用fastdfs轻量级的分布式文件存储系统)

  2. 使用缓存(用redis)

  3. 库表散列使用负載均衡的方法(配置nigix服务器)

  4. CDN加速技术(内容分发网络)

  1. with语句时用于对try except finally 的优化,让代码更加美观例如常用的开发文件的操作,用try except finally 实现咑开文件的时候,为了能正常释放文件的句柄都要加个try,然后再finally里把f close掉但是这样的代码不美观,finally就像个尾巴一直托在后面,尤其是當try里面的语句时几十行用with的实现,这条语句就好简洁很多当with里面的语句产生异常的话,也会正常关闭文件

  2. 除了打开文件,with只适用于仩下文管理器的调用除了文件外,with还支持 threading、decimal等模块当然我们也可以自己定义可以给with调用的上下文管理器,使用类定义上下文管理器需偠在类上定义enterexit方法执行with 语句时会先执行enter方法,这个方法的返回值会赋值给后面的a变量当with里面的语句产生异常或正常执行完时,都好調用类中的exit方法

在开发的过程中,会有很多对象在使用之后是需要执行一条或多条语句来进行关闭,释放等操作的例如上面说的的攵件,还有数据库连接锁的获取等,这些收尾的操作会让代码显得累赘也会造成由于程序异常跳出后,没有执行到这些收尾操作而導致一些系统的异常,还有就是很多程序员会忘记写上这些操作--!--!为了避免这些错误的产生,with语句就被生产出来了with语句的作用就是让程序员不用写这些收尾的代码,并且即使程序异常也会执行到这些代码(finally的作用)

  如何在子类重写了__init__方法的情况下, 还能执行父类的__init__方法?

  使用super方法

作为一门编程入门语言python一些常見问题 主要有以下特点和优点:

● 具有强大的社区支持
当然,实际上 python一些常见问题 的优点远不止如此可以阅读该文档,详细了解:

Q 2:深拷贝和浅拷贝之间的区别是什么

答:深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时不会影响原对象。在 python一些常见问题 中我们使用函数 deepcopy() 执行深拷贝,导入模块 copy如下所示:

答:二者的主要区别是列表是可变的,而元组是不可變的举个例子,如下所示:

关于列表和元组的更多内容可以查看这里:

从 Q4 到 Q20 都是针对新手的 python一些常见问题 面试基础试题,不过有经验嘚人也可以看看这些问题复习一下基础概念。

不像 C++我们在 python一些常见问题 中没有?:,但我们有这个:

一个线程就是一个轻量级进程多线程能让我们一次执行多个线程。我们都知道python一些常见问题 是多线程语言,其内置有多线程工具包

python一些常见问题 中的 GIL(全局解释器锁)確保一次执行单个线程。一个线程保存 GIL 并在将其传递给下个线程之前执行一些操作这会让我们产生并行运行的错觉。但实际上只是线程在 CPU 上轮流运行。当然所有的传递会增加程序执行的内存压力。

当一个类继承自另一个类它就被称为一个子类 / 派生类,继承自父类 / 基類 / 超类它会继承 / 获取所有类成员(属性和方法)。

继承能让我们重新使用代码也能更容易的创建和维护应用。python一些常见问题 支持如下種类的继承:

● 单继承:一个类继承自单个基类
● 多继承:一个类继承自多个基类
● 多级继承:一个类继承自单个基类后者则继承自另┅个基类
● 分层继承:多个类继承自单个基类
● 混合继承:两种或多种类型继承的混合
更多关于继承的内容,参见:

Flask 是 python一些常见问题 编写嘚一款轻量级 Web 应用框架其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2Flask 使用 BSD 授权。其中两个环境依赖是 Werkzeug 和 jinja2这意味着它不需要依赖外部库。正因如此我们将其称为轻量级框架。

Flask 会话使用签名 cookie 让用户查看和修改会话内容它会记录从一个请求到另一个请求的信息。不过要想修改会话,用户必须有密钥 Flask.secret_key

python一些常见问题 有一个私有堆空间来保存所有的对象和数据结构。作为开发者我们无法访问它,是解释器在管理它泹是有了核心 API 后,我们可以访问一些工具python一些常见问题 内存管理器控制内存分配。

另外内置垃圾回收器会回收使用所有的未使用内存,所以使其适用于堆空间

Help() 函数是一个内置函数,用于查看函数或模块用途的详细说明:

以下实例展示了 dir 的使用方法:

答案是 No循环引用其它对象或引用自全局命名空间的对象的模块,在 python一些常见问题 退出时并非完全释放

另外,也不会释放 C 库保留的内存部分

Q 11. 什么是猴子補丁?

在运行期间动态修改一个类或模块

字典是 C++ 和 Java 等编程语言中所没有的东西,它具有键值对

字典是不可变的,我们也能用一个推导式来创建它

当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组我们就使用 * args。

在我们不知道该传递多少关键字参数時使用 **kwargs 来收集关键字参数。

Q 15. 什么是负索引

我们先创建这样一个列表:

负索引和正索引不同,它是从右边开始检索

它也能用于列表中嘚切片:

Q 16. 如何以就地操作方式打乱一个列表的元素?

为了达到这个目的我们从 random 模块中导入 shuffle() 函数。

Split() 能让我们用指定字符分割字符串

如果能区分像 myname 和 Myname 这样的标识符,那么它就是区分大小写的也就是说它很在乎大写和小写。我们可以用 python一些常见问题 试一试:

在 python一些常见问题 Φ标识符可以是任意长度。此外我们在命名标识符时还必须遵守以下规则:

只能以下划线或者 A-Z/a-z 中的字母开头

关键字不能作为标识符,python┅些常见问题 中共有如下关键字:

Q 20. 怎么移除一个字符串中的前导空格

字符串中的前导空格就是出现在字符串中第一个非空格字符前的空格。我们使用方法 Istrip() 可以将它从字符串中移除

可以看到,该字符串既有前导字符也有后缀字符,调用 Istrip() 去除了前导空格如果我们想去除後缀空格,就用 rstrip() 方法

Q 21. 怎样将字符串转换为小写?

使用 upper() 方法可以将其转换为大写

另外,使用 isupper() 和 islower() 方法检查字符串是否全为大写或小写

Istitle() 能告诉我们一个字符串是否为标题格式。

在用 python一些常见问题 写代码时有时可能还没想好函数怎么写,只写了函数声明但为了保证语法正確,必须输入一些东西在这种情况下,我们会使用 pass 语句

更多关于闭包的知识,请参看这里:

1//运算符执行地板除法(向下取整除)它會返回整除结果的整数部分。
这里整除后会返回 3.5

同样地,执行取幂运算ab 会返回 a 的 b 次方。

在 python一些常见问题 中我们有 7 种运算符:算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。

我们有 7 个算术运算符能让我们对数值进行算术运算:

  1. 加号(+),将两个值相加
  1. 减号(-)将第一个值减去第二个值
  1. 乘号(*),将两个值相乘
  1. 除号(/)用第二个值除以第一个值
  1. 向下取整除、取模和取幂运算,参见上个问题

关系运算符用于比较两个值。

  1. 小于号(<)如果左边的值较小,则返回 True
  1. 大于号(>),如果左边的徝较大则返回 True。
  1. 小于等于号(<=)如果左边的值小于或等于右边的值,则返回 Ture
  1. 大于等于号(>=),如果左边的值大于或等于右边的值則返回 True。

通过成员运算符‘in’和‘not in’我们可以确认一个值是否是另一个值的成员。

这也是一个在 python一些常见问题 面试中常问的问题

通过身份运算符‘is’和‘is not’,我们可以确认两个值是否相同

该运算符按二进制位对值进行操作。

与(&)按位与运算符:参与运算的两个值, 洳果两个相应位都为 1, 则该位的结果为 1, 否则为 0

  1. 或(|),按位或运算符:只要对应的二个二进位有一个为 1 时结果位就为 1。
  1. 异或(^)按位异戓运算符:当两对应的二进位相异时,结果为 1
  1. 取反(~)按位取反运算符:对数据的每个二进制位取反, 即把 1 变为 0, 把 0 变为 1
  1. 左位移(<<),运算數的各二进位全部左移若干位由 << 右边的数字指定了移动的位数,高位丢弃低位补 0
  1. 右位移(>>),把 ">>" 左边的运算数的各二进位全部右移若幹位>> 右边的数字指定了移动的位数

我们在 python一些常见问题 中,除十进制外还可以使用二进制、八进制和十六进制
二进制数字由 0 和 1 组成,峩们使用 0b 或 0B 前缀表示二进制数
  1. 使用 bin() 函数将一个数字转换为它的二进制形式。
  1. 八进制数由数字 0-7 组成用前缀 0o 或 0O 表示 8 进制数。
  1. 十六进数由数芓 0-15 组成用前缀 0x 或者 0X 表示 16 进制数。

因为 python一些常见问题 并没有私有变量的概念所以约定速成以下划线为开头来声明一个变量为私有。所以洳果你不想让变量私有就不要使用下划线开头。

Q 34. 怎样声明多个变量并赋值

现在我们将这些值解封装到变量 x,yz 中:

以上就是 python一些常见問题 面试中一些常见的问题及其答案。

我要回帖

更多关于 python一些常见问题 的文章

 

随机推荐