【纯干货!!!】花费了整整3天,整理出来的全网最实用Python面试大全,一共30道题目+答案的纯干货,希望大家多多支持,建议 点赞!!收藏!!长文警告,全文共12000+字,涵盖Python面试可能遇到的所有问题,希望对大家有帮助,不过大家最好不要硬背,实战大于理论。祝大家面试顺利!
对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔。
那么你了解过Python编程面试题吗?从Python基础到网页爬虫你是否能全方位Hold住?
本文主要从 Python 基础、高级语句、网页应用、数据库和测试等角度出发,
可只关注自己需要的领域。
答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。和Java相比:Python比Java要简单.Python是函数为一等公民的语言,而Java是类为一等公民的语言.Python是弱类型语言,而Java是强类型语言。和C相比:对于使用:Python的类库齐全并且使用简洁,很少代码实现的功能用C可能要很复杂。对于速度:Python的运行速度相较于C,绝对是很慢了.Python和CPython解释器都是C语言编写。
答:Python 是一门动态解释性的强类型定义语言:编写时无需定义变量类型;运行时变量类型强制固定;无需编译,在解释器环境直接运行。
答:Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码。
Python解释器主要有以下几个:
答:Python是一门面向对象的语言。面向对象都有三大特性:封装、继承、多态。
下面分别来说说这三大特性:
**封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。**在python中用双下划线开头的方式将属性设置成私有的 。好处:1. 将变化隔离;2. 便于使用;3. 提高复用性;4. 提高安全性。
继承:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。即一个派生类继承基类的字段和方法。
继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系 。python中类的继承分为:单继承和多继承
class ParentClass1: #定义父类
class ParentClass2: #定义父类
class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
多态:一种事物的多种体现形式,函数的重写其实就是多态的一种体现 。Python中,多态指的是父类的引用指向子类的对象 。实现多态的步骤:1、定义新的子类,2、重写对应的父类方法,3、使用子类的方法直接处理,不调用父类的方法。多态的好处:(1)增加了程序的灵活性(2)增加了程序可扩展性
答:Python 中主要有8种数据类型:number(数字)、string(字符串)、list(列表)、tuple(元组)、dict(字典)、set(集合)、Boolean(布尔值)、None(空值)。
答:range()和xrange()都是在循环中使用,输出结果一样。
答:
答:Python中看可变与不可变数据类型,主要是看变量所指向的内存地址处的值是否会改变 。
Python 的六种标准数据类型:数字、字符串、列表、元组、字典、集合。
答:Python中生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析,同时节省内存。除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。
答:字典是 Python 提供的一种常用的数据结构,主要用于存放具有映射关系的数据 。比如保存某班同学的成绩单数据,张三:95分,李四:70分,王五:100分 … ,因为姓名和成绩是有关联的,所以不能单独用两个列表来分别保存,这时候用字典来存储,再合适不过了 。
字典是一种可变的容器模型,它是通过一组键(key)值(value)对组成,这种结构类型通常也被称为映射,或者叫关联数组,也有叫哈希表的。每个key-value之间用“:”隔开,每组用“,”分割,整个字典用“{}”括起来 ,格式如下所示:
dictionary = {key1 : value1, key2 : value2 }
定义字典时,键前值后,键必须唯一性,值可以不唯一,如果键有相同,值则取最后一个;值可以是任何的数据类型,但是键必须是不可变的数据类型(数字、字符串、元组)。想要访问字典中的值,只需要将键放入方括号里,如果用字典里没有的键访问数据,会输出错误 。
答:Python字符串格式化主要有两种方式:分别为占位符(%)和format方式 。文末还有2种要介绍,所以总共有4种 。
其中,占位符(%)方式比较老,而format方式是比较先进的,目前两者共存。占位符方式在Python2.x中用的比较广泛,随着Python3.x的使用越来越广,format方式使用的更加广泛。
答:http协议是超文本传输协议,是用于从万维网服务器传输文本到本地浏览器的传送协议,是基于tcp/ip通信协议来传输数据的。
HTTP状态码(HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。
答:在Ruby、Python等动态编程语言中,猴子补丁仅指在运行时动态改变类或模块,为的是将第三方代码打补丁在不按预期运行的bug或者feature上 。在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷。猴子补丁在代码运行时内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效。因为猴子补丁破坏了封装,而且容易导致程序与补丁代码的实现细节紧密耦合,所以被视为临时的变通方案,不是集成代码的推荐方式。
答:垃圾回收机制(Garbage Collection:GC)基本是所有高级语言的标准配置之一了,在一定程度上,能优化编程语言的数据处理效率和提高编程软件开发软件的安全性能 。
在python中的垃圾回收机制主要是以引用****计数为主要手段以标记清除和隔代回收机制为辅的手段 。可以对内存中无效数据的自动管理!
答:交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的。
今天这个面试是问大家有几种办法来实现交换两个变量的值 。
def swap(a,b):
temp = a
a = b
b = temp
print(a,b)
def swap2(a,b):
a,b = b,a
print(a,b)
def swap3(a, b):
a = a + b
b = a - b
a = a - b
print(a, b)
def swap4(a,b):
a = a ^ b
b = a ^ b
a = a ^ b
print(a,b)
答:在Python中,按位运算符有左移运算符(<<)、右移运算符(>>)、按位与运算(&)、按位或运算(|)、按位取反运算(~)、异或运算符,其中按位取反运算符为单目运算符 。
答:在Python处理数据时,不可避免的要使用数据类型之间的转换。简单的诸如int、float、string之间的转换;更有数组array、列表list之间的转换。
以下是几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
答:在Python实现二分查找法有两种方法,分别用循环和递归方式。
二分查找法:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。注意如果要想使用二分查找,前提必须是元素有序排列 。
循环方式
def binary_search_2(alist,item):
"""二分查找---循环版本"""
n = len(alist)
first = 0
last = n-1
while first <= last:
mid = (first + last)//2
if alist[mid] ==item:
return True
elif item < alist[mid]:
last = mid - 1
else:
first = mid + 1
return False
if __name__ == "__main__":
a = [1,5,6,10,11,13,18,37,99]
sorted_list_21 = binary_search_2(a, 18)
print(sorted_list_21) //True
sorted_list_22 = binary_search_2(a, 77)
print(sorted_list_22) //False
递归方式
def binary_search(alist,item):
"""二分查找---递归实现"""
n = len(alist)
if n > 0:
mid = n//2 #数组长度的一半中间下标
if item == alist[mid] :
return True #查找成功
elif item < alist[mid]:
return binary_search(alist[:mid],item)
else:
return binary_search(alist[mid+1:], item)
else :
return False #失败
if __name__ == "__main__":
a = [1,5,6,10,11,13,18,37,99]
# print(a)
sorted_list_11 = binary_search(a,37)
print(sorted_list_11)//True
sorted_list_12= binary_search(a, 88)
print(sorted_list_12)//False
答:在Python中lambda表达式也叫匿名函数,即函数没有具体的名称。lambda表达式是Python中一类特殊的定义函数的形式,使用它可以定义一个匿名函数。与其它语言不同,Python的lambda表达式的函数体只能有单独的一条语句,也就是返回值表达式语句。
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用 。lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,就重新定义一个函数了。
lambda 表达式允许在一行代码中创建一个函数并传递。lambda表达式在Python中的优点和缺点: 一方面,Lambda函数的减少了代码的行数,方便又简洁。另一方面,Lambda表达式有诸多限制,不能使用复杂逻辑。
add = lambda x, y : x+y
num =add(1,2)
print("x+y=",num)
#结果为:x+y=3
答:在反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性、方法、导入模块,是一种基于字符串的事件驱动。通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员。Python是一门解释型语言,因此对于反射机制支持很好。
在Python中支持反射机制的函数有getattr()、setattr()、delattr()、exec()、eval()、import,这些函数都可以执行字符串。
23、说说Python删除list里的重复元素有几种方法?答:在Python中主要有5种方式,还没看答案,你能想起几种呢,面试笔试题经常碰到的一道题 。
使用set函数:set是定义集合的,无序,非重复numList =
[1,1,2,3,4,5,4]
print(list(set(numList)))
#[1, 2, 3, 4, 5]
先把list重新排序,然后从list的最后开始扫描
a = [1, 2, 4, 2, 4, 5,]
a.sort()
last = a[-1]
for i in range(len(a) - 2, -1, -1):
if last == a[i]:
del a[i]
else:
last = a[i]
print(a) #[1, 2, 4, 5]
使用字典函数
a=[1,2,4,2,4,]
b={}
b=b.fromkeys(a)
c=list(b.keys())
print(c) #[1, 2, 4]
append方式
def delList(L):
L1 = []
for i in L:
if i not in L1:
L1.append(i)
return L1
print(delList([1, 2, 2, 3, 3, 4, 5])) #[1, 2, 3, 4, 5]
count + remove方式
def delList(L):
for i in L:
if L.count(i) != 1:
for x in range((L.count(i) - 1)):
L.remove(i)
return L
print(delList([1, 2, 2, 3, 3, 4]))#[1, 2, 3, 4]
答:在Python中__new__和__init__具有不同的功能。并且对于Python的新类和旧类而言功能也不同。
答:在Python中help()和dir()这两个函数都可以从Python解释器直接访问,并用于查看内置函数的合并转储。
答:不喜欢Python的人经常会吐嘈Python运行太慢。下面给大家介绍几种种提高python执行效率的方法 。
答:单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。在 Python 中,你可以想出几种种方法来实现单例模式呢?笔试题中,手写单例模式,也是经常碰到的,所以都要掌握下!
1)使用模块实现:Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
#test1.py
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
#test2.py
from test1 import singleton
2)用__new__特殊方法实现class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
3)使用装饰器实现def singleton(cls):
_instance = {}
def inner(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return inner
@singleton
class Singleton:
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
4)类装饰器实现class Singleton:
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self, *args):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls(*args)
return self._instance[self._cls]
@Singleton
class Singleton:
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
5)使用元类实现方式class Singleton1(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super(Singleton1, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super(Singleton1, self).__call__(*args, **kwargs)
return self.__instance
class Singleton(metaclass=Singleton1):
def __init__(self, name):
self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True
答:自省是一种自我检查行为。在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。
说的更简单直白一点:自省就是面向对象的语言所写的程序在运行时,能够知道对象的类型。一句可以概况为:运行时能够获知对象的类型。
Python实现自省有很多方法,常用的有