测试秋招八股文集锦——Python高频考点
一、前言:周末愉快吖~
周六闺蜜来玩,中午我亲手做了韭菜炒鸡蛋、牛肉酱炒东北大拉皮、煮玉米、毛豆、烧卖,由于我不会做肉类的菜,外卖点了红烧排骨。还做了双皮奶、银耳红枣羹。
晚上带闺蜜出去吃了韩餐,被韩式凉面的酸甜口惊艳到了,炸鸡套餐、还有一种韩式汤也超鲜美。
闺蜜今天就返程回去了,买的整个西瓜、冰淇淋还没来得及和她一起吃呢
二、Python高频考点目录
-
Python基本数据结构有哪四种?区别是什么
-
Pyhton数据类型
-
Break和Continuous区别
-
Python return和yield的区别,以及return的作用
-
Python深拷贝和浅拷贝区别
-
range和xrange的区别
-
.is和==的区别
-
什么是lambda函数
-
字符串拆分方法有哪些
-
单引号、双引号、三引号区别
-
python传参时需要注意什么
-
装饰器
-
函数或变量的作用域
-
解释型和编译型语言的区别
-
inti和new的区别
-
常用的模块
-
python的list和numpy.array(数组)的区别
-
类中self的概念及其三种应用
-
python的几种变量,按照作用域划分
-
python的面向对象特征
三、Pyhton高频考点解答
3.1 Python基本数据结构及其区别,应用场景分别是什么,代码展现
3.1.1 Python基本数据结构有哪四种?区别是什么
- list:有序可修改。通过索引进行查找、切片。使用方括号[ ]表示;
- tuple:有序不可修改。可查询、切片操作。元组将多样的对象集合到一起,通过索引进行查找。用小括号( )表示;
- set:集合,无序可修改,无重复,无索引,不能跟列表一样切片。自动去重。使用set([ ])表示;
- dict:字典是一组key-value,通过key查找,无顺序,用{ }表示。
3.1.2 应用场景分别是什么
- list:简单的数据集合,可用索引;
- tuple:把一些数据当作整体去用,不能修改;
- dict:使用key,value进行关联的数据;
- set:数据无重复,只关心数据是否出现,不关心位置。
3.1.3 代码展现
mylist = [1,2,3,4,'oh'] mytuple = (1,2,'Hello',(4,5)) mydict = {'wang':1,'Hu':2,'Liu':3} myset = set(['wang','Hu','Liu',4,'wa'])
3.2 Python数据类型
1、String(字符串)2、Number(数字型)
- int(整型)
- float(浮点型)
- complex(复数)
- long(长整数)
3.3 Break和Continuous区别
- break用于结束整个循环。
- continuous不执行当前循环的statement,运行下一个循环。
3.4 Python return和yield的区别,以及print和return的作用
3.4.1 Python return和yield的区别
- 相同点:都是返回函数执行的结果。
- 不同点:return在返回结果后结束函数的运行,返回到调用处继续执行。而yield则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
3.4.2 yield生成器相比return一次返回所有结果的优势
- 反应更迅速
- 更节省空间
- 使用更灵活
3.4.3print和return作用
- print的作用是输出数据到控制端,就是打印在你能看到的界面上。
- return的作用之一是返回计算的值。
3.5 Python深拷贝和浅拷贝区别
浅拷贝:是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素(新瓶装旧酒)。
深拷贝:完全拷贝了一个副本,容器内部元素地址都不一样。
3.6 range和xrange的区别,Range函数用法
3.6.1 range和xrange的区别
python2中分range()和xrange() 其中range()是生成一个list,是一个列表生成式 而xrange()是一个生成器
python3中取消了xrange() 内置的range()实际就是python2里的xrange() 返回生成器
3.6.2 Range函数用法
- 返回一系列连续增加的整数
- 工作方式类似于分片
- 可生成一个列表对象
3.6.3 range代码
alist = range(0,101) #range生成0-100列表 print(alist) #输出结果[0,1,2,....100] blist = range(2,101,2)#设置步长为2 print(blist)#输出结果[2,4,6,.....100]
3.7 .is和==的区别
is判断两个对象的内存地址是否相同 ==判断两个对象的值是否相同
3.8 什么是lambda函数
- 匿名函数形式 f=lambda x : x表达式
- 调用时可采用f(x)的形式 或者直接使用(可以用于return语句)
- 优点:没有名字,无需担心函数冲突
- 缺点:只能有一个表达式,没有return,返回值就是该表达式的结果
3.9 字符串拆分方法有哪些
- 方法一:String对象的Split方法,不允许有多个分隔符
- 方法二:函数re.split(),允许为分隔符指定多个正则模式
line = "I am super man!" #String的split方法 print(line.split(" ")) #以空格拆分 输出['I','am','super','man!'] #re.split方法 import re print(re.split("[m]",line)) 输出['I','a','','super','','an!']
3.10 单引号、双引号、三引号区别
- 单引号双引号没有区别,都可以用来表示字符串;
- 三引号,字符串内可直接换行,且可包含注释。
若要表示 Let's go 这个字符串 单引号:s1 = 'Let's go' 双引号:s2 = "Let's go" 三引号:s3 = 'I realy like "Python"!'
3.11python传参时需要注意什么
3.11.1 传入参数是否可以被修改
- 如果没有将外部变量传递到函数来(参数定义种包含该外部变量),则函数内部虽然可以使用,但是不能对该变量进行修改(会报错)——未传参的变量可使用但不可修改
- 将外部变量作为实参传递到函数中来的话,如果外部变量是不可变对象的话不可以修改该变量的原始值——相当于"传值"的方式来传递变量,可以通过改变引用指向的方式,在函数内部获取新的不可变对象,但是对函数外部没有影响(除非加了global)
python函数传入的是原变量引用的一个副本,这两个引用(副本及原引用)在内外均指向同一个内存区(具体存值的地方)。如果在函数内部改变了引用指向的话,只是副本引用指向了一个新的内存区,函数外面的引用仍然指向原内存堆区,不会改变原变量的值(不可变对象的操作、可变对象的赋值操作)。而如果在内部通过append、remove函数改变了堆区的值的话,外部的引用仍然会改变。
3.11.2 传入参数的顺序和类型
参数顺序:必选参数,默认参数,可变参数,命名关键字参数,关键字参数
可变参数必须在关键字参数之前
- 默认参数 必须指向不可变对象
- 可变参数 形式def func(可变参数) 传入参数的个数可以是0个或者多个,其实是传入一个list或者tuple,函数接收的是个tuple。如果有个list或者tuple想直接传入func的话,可以直接用func(list)实现(即把想要传入的可变参数封装成list/tuple传入)
- 关键字参数 形式def func(关键字参数) 允许传入0个或多个含参数名的参数,在函数内部组装成字典。传入的时候用参数名=参数值的形式。如果传入dict的话可以直接func(dict)
- 命名关键字参数 形式def func(,city,job) 限制某几种参数名的输入,传入的时候必须只有,后面的这几种参数名可以选择,传入用fun(city=xxx,job=xxx)的形式
3.11.3 补充:可变对象与不可变对象总结
可变对象:list、dict、set 可变对象是指对象的内存值可以改变
不可变对象:int、tuple、str、bool 不可变对象是指对象的内存值不可以被改变。改变变量时,其实质是变量指向新的地址,即变量引用新的对象
3.12 装饰器
装饰器可以在不改变函数代码和调用方式的情况下给函数添加新的功能。
本质上是一个嵌套函数,接收被装饰的函数(func)作为参数,并返回一个包装过的函数,以实现不影响函数的情况下添加新的功能。抽离出大量与函数主体功能无关的代码,增加一个函数的重用性。
应用场景:性能测试(统计程序运行时间)、插入日志、权限校验
3.13 函数或变量的作用域
-
正常的函数/变量是public的,可以被直接引用,如x123、 PI 等
-
xxx__变量/函数是特殊变量,虽可以被直接引用,但是有特殊的用途,比如说__init ,new 等
-
_xxx 表示半私有的变量,只能在类或者子类内使用
-
__xxx表示私有的变量,只能在类内使用
这两种私有变量都是应当私有,而不是一定不能访问的
3.14 解释型和编译型语言的区别
3.14.1编译型语言
在程序执行前,需要把源代码编译成机器语言的文件,再执行时可以直接使用该编译结果,以后不需要再次编译。
优点:运行效率高
缺点:难以移植
3.14.2 解释型语言:
代码执行时才一行行动态翻译执行
优点:无需翻译器,方便程序移植;可以交互式运行
缺点:运行效率较低
3.15 inti和new的区别
相同点:两者都是类中的private函数
不同点:
- new是在实例创建之前被调用的,任务是创建实例然后返回该实例对象,是个静态方法,至少要有一个参数cls(代表当前类),必须有返回值(即该实例对象)
- init是在实例创建完成后被调用的,设置对象属性的一些初始值,通常用在初始化一个类实例的时候,是一个实例方法,至少有一个参数self(代表当前的实例),无需返回值。
即init在new之后被调用,new的返回值(实例)传递给init的第一个参数,然后由init设置一些实例的参数。
此外,继承自object的类才有 new,如果定义子类的时候没有定义new,则会追溯到父类的new方法来构造该类实例,如果父类也未定义,则一直可以向上追溯到object的new方法
3.16 常用的模块
- os 与操作系统交互
- sys
- random 生成伪随机数
- time 可以读取时间戳或程序暂停
- collections 提供常见的数据结构如双向队列deque、计数器Counter、默认字典defaultdict
3.17 python的list和numpy.array(数组)的区别
-
list可以存放不同类型的数据,比如int,str,bool,float,list,set等,但是numpy数组中存放的数据类型必须全部相同,必须全为int或全为float
-
list中每个元素的大小可以相同,也可以不同,因此不支持一次性读取一列,而numpy数组中每个元素大小相同,支持一次性读取一列。numpy对二维数组的操作更为便捷
-
list中数据类型保存的是数据存放的地址,即指针而非数据,比如一个有四个数据的列表a=[1,2,3,4]需要4个指针和4个数据,增加了存储空间,消耗CPU,但是a=np.array([1,2,3,4])只需要存放4个数据,节省内存,方便读取和计算
-
一个numpy的array是内存中的一个连续块,array中的元素都是同一类型的,所以一旦确定了一个array,它的内存就确定了,每个元素的内存大小都确定了。而list的每个元素是一个地址的引用,这个地址又指向了另一个元素,这些元素在内存里不一定是连续的,因此每当加入新元素,其实只是把这个元素的地址添加到list中
3.18 类中self的概念及其三种应用
self代表实例本身,具体来说是该实例的内存地址
3.18.1 self的三种应用
- self为类中函数的第一个参数
在调用实例方法时,python解释器会自己把实例变量传递给函数中的self。如果类的实例方法的第一个参数不是代表实例的self,则调用实例方法时,该方法没有参数来接收自动传入的实例变量,程序会产生异常。
- 在类中,引用实例的属性 self.变量名
引用实例的属性目的是为实例绑定属性,写入或读取实例的属性
- 在类中,调用实例的方法 self.方法名()
3.19 python的几种变量,按照作用域划分
-
全局变量:在模块内、在所有函数之外、在class外
-
局部变量 :在函数内、在class的方法内(但未加self修饰)
-
静态变量/类属性 在class内,但是不在class的方法内的。
类的所有实例均可以访问到该类属性,用类名.变量名()的方式
- 实例变量/实例属性 在class的方法内,用self修饰的变量
实例属性的优先级高于类属性,所以若是同名,实例属性会覆盖类属性,有限输出实例属性
3.20 python的面向对象特性
1.封装
2.继承
3.多态
3.20.1 面向对象和面向过程语言的区别
-
面向对象是把问题抽象成一个个对象,给这些对象绑上属性和方法,即以功能而非步骤划分问题。优点:更易低耦合、易维护、易复用;缺点:因为需要实例化所以开销较大,性能比面向过程要低
- 面向过程是把问题拆分成一个个函数和数据,按照一定的顺序来执行这些方法。优点:性能较高;缺点:不易维护,不易复用