一、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:步长,可以省略,默认为10 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"待查找元素{