Python面试必刷题系列(5)
本篇是【Python面试必刷题系列】的第5篇文章。通过收集、整理Python真实面试题,给大家讲解面试中的python高频考察点,希望能够引起读者的足够重视。
Python中 is 和 == 有什么区别?
(1)==是比较运算符,用来比较两个对象的value(值)是否相等。
(2)is也叫做同一性运算符,用来比较对象间的唯一身份标识(id)是否一致。
请看示例:
a = b = "abc"
X = "abc"
print a == b # True
print a == X # True
print a is b # True
print a is X # True
a = b = [1, 2, 3]
X = [1, 2, 3]
print a == b # True
print a == X # True
print a is b # True
print a is X # False
结论:只有数值型和字符串型比较,a is X才为True,当是tuple,list,dict或set型时,a is X为False。
原因:id(a) != id(X),感兴趣的同学可以试一下。
列举sort 和 sorted 的区别
- sort 只是应用在 list 上的方法,就地排序,无返回值。
- sorted 是内建函数,对所有可迭代的对象都可进行排序,返回新的list。
sorted 语法: sorted(iterable, key=None, reverse=False) 参数说明:
- iterable -- 可迭代对象。
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
什么是猴子补丁?
在运行期间动态修改一个类或模块,叫做猴子补丁(Monkey Patch)。
用法一:运行时动态替换模块的方法
class Person(object):
def speak(self):
print "oooooo"
def speak_patch(self):
print "eeeeee"
if __name__ == '__main__':
Person.speak = speak_patch
person = Person()
person.speak() # 输出是 “eeeee”,相当于临时替换了模块里的方法
用法二:运行时动态增加模块的方法
这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。
成员变量用单、双下划线修饰的区别?
(1)_xxx
: 保护型成员变量,只允许该类及其子类访问;不能用于from module import * 。
(2)__xxx
: 私有型成员变量,只允许该类本身进行访问,连子类也不允许。
(3)__xxx__
: python内置的专用特殊方法。像__init__()之类的。
说说lambda表达式的应用场景?
lambda 表达式的本质就是匿名的、函数体仅有一行的函数。
# lambda表达式
lambda x , y : x + y
# 改写成函数
def add(x, y):
return x+ y
虽然函数比 lambda 表达式的适应性更强,能够创建复杂的函数对象,但 lambda 表达式依然有如下两个优点:
- 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁。
- 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高了性能。
例子如下:
a = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
a_1 = list(map(lambda x: x[0], a))
copy 和 deepcopy 的区别是什么?
结论:
- 浅拷贝,只拷贝父对象,不会拷贝父对象内部的子对象。
- 深拷贝,既拷贝父对象,又拷贝各级子对象。
理解:
import copy
origin = [1, 2, [3, 4]] # origin 里边有三个元素:1, 2,[3, 4]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
print cop1 == cop2 # True
print cop1 is cop2 # False
# 说明: cop1 和 cop2 目前看上去还相同,但已不再是同一个object
origin[2][0] = "hey!"
origin[0] = "a"
print origin # ['a', 2, ['hey!', 4]]
print cop1 # [1, 2, ['hey!', 4]]
print cop2 # [1, 2, [3, 4]]
# 说明: origin第一层元素改变,对深浅拷贝都不会有影响;
# 但是子对象(origin[2] = [3, 4])发生改变后,浅拷贝会跟着变,深拷贝却不受影响
也就是说,如果父元素的第一层中存在可变对象,如list、dict以及普通类的实例对象等,使用浅拷贝只是传递了可变对象的引用,而深拷贝才是通俗理解上的完全复制。
下面是在普通类实例上做的一组测试,感兴趣的同学可以继续看,结论与上面一致。
import copy
class OBJ(object):
X = [1, 2, [1, 2]] # 类变量
def __init__(self):
self.x = [1, 2, [1, 2]] # 实例变量
# 深浅拷贝
origin = OBJ()
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
# 改变实例对象的属性
origin.x[0] = "**"
origin.x[2][1] = "##"
print cop1.x # ['**', 2, [1, '##']]
print cop2.x # [1, 2, [1, 2]]
# 改变类变量的属性
origin.X[0] = "**"
origin.X[2][1] = "##"
print cop1.X # ['**', 2, [1, '##']]
print cop2.X # ['**', 2, [1, '##']]
什么是断言?应用场景?
python的assert是用来检查一个条件,如果它为真,继续往下执行。如果它为假,则会抛出AssertError 错误信息,并终止执行程序。
例如:
x = 23
assert x > 0, "x is not positive"
assert x%2 == 0, "x is not an even number"
结果显示:
Traceback (most recent call last):
File "/Users/arrnos/PycharmProjects/wechat/interface.py", line 3, in <module>
assert x%2 == 0, "x is not an even number"
AssertionError: x is not an even number
断言是保证程序运行可靠性的一种方式,因为,在条件不符合我们预期时,程序会自动在断言处终止运行,同时会抛出错误所在的代码行和相关信息,也算是一种程序问题定位的手段。
具体应用场景:函数入参检查、运行时程序逻辑检查、约定检查、程序常量以及文档检查等。
详细可参考:https://www.cnblogs.com/zhuifeng-mayi/p/9248558.html
dir()是做什么的?
dir()是python的一种内置函数,dir(object)用于查看object内部的全部属性和方法。
比如查看list、字符串或者是os模块的全部内部函数和方法,可以这样:
print dir(os)
print dir(list)
print dir("")
print dir(str) # 和上面运行结果一致
*args和 * *kwargs 的含义及用法。
在函数定义中使用 *args
和**kwargs
传递可变长参数。 *args
用来将参数打包成 tuple 给函数体调用。** kwargs
用于将关键字参数打包成 dict 给函数体调用。
(1) *和**的用法:拆包
def fun1(a, b):
print a, b
def fun2(b, a):
print a, b
fun1(*[1, 2]) # *用于拆解list或元组,拆解结果作为位置参数
fun2(**{"a": 1, "b": 3}) # **用于拆解字典,并将其作为关键字参数
结果:
1 2
1 3
(2) *args 用法实例:
*args
用于接收元组作为位置参数。
def fun(a, *args):
print a
print "args:", args
print "type(args):", type(args)
for arg in args:
print arg
# 调用
fun(1, 2, 3)
结果:
1
args: (2, 3)
type(args): <type 'tuple'>
2
3
(3)**kwargs用于接收字典类型的参数
def fun(a, **kwargs):
print "a is ", a
print "kwargs:", kwargs
print "type(kwargs):", type(kwargs)
print "b is ", kwargs.get("b", None)
print "c is ", kwargs.get("c", None)
print "d is ", kwargs.get("d", None)
# 调用
fun(1, b=3, c=5)
结果:
a is 1
kwargs: {'c': 5, 'b': 3}
type(kwargs): <type 'dict'>
b is 3
c is 5
d is None
type、class和object之间的关系?
(1) type : 用来返回一个对象的类型
(2) object
由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点。type的基类是object,但是object也是由type生成的,他们之间形成了一个环路,这样设计的目的也就是为了方便对这些数据结构进行修改。
(3) class
class是用来描述一个类对象的,通过class可以实例化出一个对象。
(4) type,class,object三者之间的关系:
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- 基于Windows下python环境变量配置
- 【机器学习笔记之七】PCA 的数学原理和可视化效果
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
- 【专知-关关的刷题日记20】Leetcode 119. Pascal's Triangle II
- 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
- 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
- Java面向对象抽象类实例练习
- 经典JS闭包面试题
- Java面向对象接口的应用实例练习
- 【机器学习笔记之八】使用朴素贝叶斯进行文本的分类
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
- 扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi(续)
- Java面向对象抽象类案例分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-IntrinsicHeight篇
- Flutter基础widgets教程-Baseline篇
- springcloud本地开发的微服务如何调用远程k8s的微服务
- Flutter基础widgets教程-LimitedBox篇
- 算法:滑动窗口(二)
- Flutter基础widgets教程-LinearProgressIndicator篇
- Flutter基础widgets教程-ListTile篇
- 深入剖析 linux GCC 4.4 的 STL String
- Flutter基础widgets教程-MaterialApp篇
- 如何使用Visual Studio Code开发Django项目
- Flutter基础widgets教程-Padding篇
- Flutter基础widgets教程-Placeholder篇
- Flutter基础widgets教程-PopupMenuButton篇
- Python部署rad+xray自动化
- 2.建立第一个django项目与配置