python面试题大全

一、python基础面试题

1.Python的特点
  • Python是一种解释性语言【开发过程中没有了编译这个环节,类似于PHP或者Perl语言】
  • Python是交互式语言【可以在一个Python提示符,直接互动执行程序】
  • Python是面向对象语言【Python支持面向对象的风格或代码封装在对象的编程技术】
  • Python是初学者的语言【Python对于初级程序员而言,是一种伟大的语言,他支持广泛的应用程序开发,从简单的文字处理到浏览器再到游戏】
  • Python是跨平台的【它可以运行在Windows、Mac os或者Linux系统上,也就是说,在Windows上书写的Python程序,在Linux上也是可以运行的,类似于Java】
2.Python优缺点

优点:

  • 易于学习【Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单】

  • 易于阅读【Python代码定义的更清晰】

  • 易于维护【Python的成功在于它的源代码是相当容易维护的】

  • 一个广泛的标准库【Python的最大优势之一是丰富的库,跨平台的,在nuix、weindows和mac os上的兼容性很好】

  • 互动模式【互动模式的支持,可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片段】

  • 可移植性【基于其开发源代码的特性,Python已经被移植到许多平台】

  • 可扩展性【如果需要一段运行很快的关键代码,或者想要编写一些不愿开发的算法,可以使用C或者C++完成那部分程序,然后从你的Python程序中调用】

  • 数据库【Python提供所有主要的商业数据库的接口】

  • GUI编程(图形化界面)【Python支持GUI可以创建和移植到许多系统调用】

  • 可嵌入性【可以将Python嵌入到C或者C++程序,让你程序的用户获得“脚本化”的能力】

    点:

  • 运行速度慢【和C程序相比非常慢,因为Python是解释型语言,代码在执行时会一行一行的翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢,而C程序是运行前直接编译成CPU能执行的机器码,所以非常快】

  • 代码不能加密【如果要发布Python程序,实际上就是发布源代码,这一点跟C语言不通,C语言不用发布源代码,只需要把编译后的机器码(就是windows上常见的xxx.exe)发布出去,要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去】

3.Python应用场景
  • Web开发【通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的通信。一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发和管理复杂的Web程序】

  • 操作系统管理、服务器运维的自动化脚本【在很多操作系统里,Python是标准的系统组件。 大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本】

  • 网络爬虫【Python有大量的HTTP请求处理库和HTML解析库,并且有成熟高效的爬虫框架Scrapy和分布式解决方案scrapy-redis,在爬虫的应用方面非常广泛】

  • 科学计算(数据分析)【NumPy、SciPy、Pandas、Matplotlib可以让Python程序员编写科学计算程序】

  • 桌面软件【PyQt、PySide、wxPython、PyGTK是Python快速开发桌面应用程序的利器】

  • 服务器软件(网络软件)【Python对于各种网络协议的支持很完善,因此经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步网络编程和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件】

  • 游戏【很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单、体积更小;而Python则支持更多的特性和数据类型】

    搜狐、豆瓣、腾讯、网易、百度、阿里、淘宝、土豆、新浪等都在内部大量的使用Python

4.标识符

概念:计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系

合法标识符的命名规则:

  • 只能由数字,字母和下划线组成
  • 不可以是除了下划线之外的其他特殊字符
  • 开头不能是数字或者空格
  • 不能是Python的关键字
  • 严格区分大小写 age Age

标识符的命名规范:

  • 尽量做到见名知意【具有描述性】:尽量使用简单的英文单词表示
  • 遵守一定的命名规范
    • Python官方推荐的命名方式:变量名,函数名和文件名全小写,使用下划线连接,如:stu_name check_qq
    • 驼峰命名法:不同的单词之间使用首字母大写的方式进行分隔,又分为大驼峰和小驼峰,比如:stuName就是小驼峰,StuName就是大驼峰,小驼峰常用于变量或者函数的命名,大驼峰常用于类的命名
5.打包pack和拆包unpack
*:所有

m1,m2,*m3 = 34,56,2,56,56,67,68,8,89

print(m1,m2,m3)

m1,*m2,m3 = 34,56,2,56,56,67,68,8,89

print(m1,m2,m3)

*m1,m2,m3 = 34,56,2,56,56,67,68,8,89

print(m1,m2,m3)

m1,m2,*m3 = 34,56,2,56,56,67,68,8,89

print(m1,m2,*m3)

m1,*m2 = [34,5,6,7,8]

print(m1,m2)
6.变换两个变量的值
# 方式一:定义第三方变量
a = 10
b = 20
temp = a
a = b
b = temp
print(a,b)

# 方式二           ******
a = 10
b = 20
a,b = b,a
print(a,b)

# 方式三:加减法
a = 10
b = 20
a = a + b  # a = 30
b = a - b  # b = 10
a = a - b  # a = 20
print(a,b)

# 方式四:异或^
#原理:一个数异或另一个数两次,结果是该数本身
# print(56 ^ 3 ^ 3)
a = 10
b = 20
a = a ^ b  # a = 10 ^ 20
b = a ^ b  # b = 10 ^ 20 ^ 20   = 10
a = a ^ b  # a = 10 ^ 20 ^ 10 = 20
print(a,b)

# 7.常量:值不能发生改变的标识符
# 常量命名法:所有英文单词全部大写,不同单词之间使用下划线相连
PI = 3.1415
print(PI)
7.可变数据类型和不可变数据类型

​ 可变数据类型:list dict set
不可变数据类型:int float bool str tuple

8.说明is和==的区别和联系

​ a.==比较的是内容
b.is比较的是地址
c.如果两个变量的内容相同,他们的地址不一定相同,如果两个变量的地址相同,则他们的内容一定相同

9.切片特点

切片:根据指定的区间,通过某种规律在列表,元组或者字符串中进行截取,形成一个新的列表,元组或字符串
语法:列表[start🔚step]
start:开始索引,可以省略,默认为0,不省略的情况下包含在内
end:结束索引,可以省略,默认为最后一个【正数或负数】,不省略的情况下不包含在内
step:步长,可以省略,默认为1

0 1 2 3 4 5 6 7 8
-9 -8 -7 -6 -5 -4 -3 -2 -1

注意:
a.只要切片的语法正确,哪怕获取不到元素,都不会报错
b.切片之后会得到一个新的列表,对原列表没有任何影响

10.append和extend的区别

append和extend都作为向列表中添加元素的功能,有什么区别和联系
相同点:
a.元素都会出现在列表的末尾
b.都可以添加单个或多个元素
c.都是在原列表的基础直接操作的
不同点:
a.append可以追加任意类型的数据,而extend只能添加可迭代对象
b.如果向列表中添加一个可迭代对象,append会将可迭代对象整体添加,而extend只会添加可迭代对象中的元素

11.列表拷贝
1.引用赋值
	结论:列表使用引用赋值,两个列表指向同一份内存空间,
	不管是几维列表,只要其中一个列表中的元素发生修改,则访问另一个列表,其中的元素会随着修改
2.浅拷贝
	浅拷贝结论:
    一维列表:会将拷贝的列表开辟一份新的内存空间,所以其中一个列表中的元素修改,对另一个列表没有影响
    多维列表:本质是一个浅拷贝,只会拷贝最外层的地址,所以如果一个列表修改内层列表的元素,另一个列表会随着修改
3.深拷贝
	深拷贝结论:两个列表指向不同的内存空间,
	不管是几维列表,所有的内容都会被重新拷贝,其中一个列表中的元素发生修改,则访问另一个列表,没有任何影响
11.1列表拷贝面一
a = [1,2,3]
b = [4,5]
c = [a,b]
d = c
e = c.copy()
a.append(6)
print(c,d,e)
"""
c:[[1,2,3,6],[4,5]]
d:[[1,2,3,6],[4,5]]
e:[[1,2,3,6],[4,5]]
"""

a = [1,2,3]
b = [4,5]
c = [a,b]
d = c
e = c.copy()
c.append(6)
print(c,d,e)
"""
c:[[1,2,3],[4,5],6]
d:[[1,2,3],[4,5],6]
e:[[1,2,3],[4,5]]
"""
11.2列表拷贝面二
a = [1,2,['a','b']]
b = a
c = copy.deepcopy(a)
a[-1].append(3)
print(a,b,c)
"""
a:[1,2,['a','b',3]]
b:[1,2,['a','b',3]]
c:[1,2,['a','b']]
"""
11.3列表拷贝面三
a = [1,2,['a','b']]
b = a
c = copy.copy(a)
a.append(3)
print(a,b,c)
"""
a:[1,2,['a','b'],3]
b:[1,2,['a','b'],3]
c:[1,2,['a','b']]
"""
12.冒泡排序

排序思路:比较两个相邻的下标对应的元素,如果符合条件就交换位置

# 冒泡排序
# 以升序为例
list1 = [45,6,8,9,2,56,68,98,100,56,4,19]
# 外层循环:控制比较的轮数
for i in range(len(list1) - 1):
    # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标
    for j in range(len(list1) - 1 - i):
        # 相邻两个元素比较大小
        # 如果下标小的元素  > 下标大的元素,则交换位置
        if list1[j] > list1[j + 1]:
            list1[j],list1[j + 1] = list1[j + 1],list1[j]
print(list1)

# 以降序为例
list1 = [45,6,8,9,2,56,68,98,100,56,4,19]
# 外层循环:控制比较的轮数
for i in range(len(list1) - 1):
    # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标
    for j in range(len(list1) - 1 - i):
        # 相邻两个元素比较大小
        # 如果下标小的元素  < 下标大的元素,则交换位置
        if list1[j] < list1[j + 1]:
            list1[j],list1[j + 1] = list1[j + 1],list1[j]
print(list1)
13.选择排序

排序思路:固定一个下标,然后拿这个下标对应的值依次和后面的元素进行比较,最值出现在头角标位置上

# 选择排序
# 以升序为例
list1 = [45,6,8,9,2,56,68,98,100,56,4,19]
# 外层循环:控制比较的轮数
for i in range(len(list1) - 1):
    # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标
    for j in range(i + 1,len(list1)):
        # 相邻两个元素比较大小
        # 如果下标小的元素  > 下标大的元素,则交换位置
        if list1[i] > list1[j]:
            list1[i],list1[j] = list1[j],list1[i]
print(list1)


# 以降序为例
list1 = [45,6,8,9,2,56,68,98,100,56,4,19]
# 外层循环:控制比较的轮数
for i in range(len(list1) - 1):
    # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标
    for j in range(i + 1,len(list1)):
        # 相邻两个元素比较大小
        # 如果下标小的元素  < 下标大的元素,则交换位置
        if list1[i] < list1[j]:
            list1[i],list1[j] = list1[j],list1[i]
print(list1)
14.顺序查找
# 顺序查找:将待查找元素和列表中的每个元素进行依次的比对,如果相等,则表示查找成功
# 1.
list1 = [34,6,7,7,8,7,45,76,8]
key = 7
for i in range(len(list1)):
    if list1[i] == key:
        print(f"待查找元素{
      key},在列表中的索引为:{
      i}")

print("*" *30)

# 2.index()
list1 = [34,6,7,7,8,7,45,76,8]
key = 10
for i in range(len(list1)):
    if list1[i] == key:
        print(f"待查找元素{
      
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值