Python面试总结复习(三)
基本数据类型
整型int 不可变
字符串str 不可变
列表list 有序,可变
元组tuple 有序,不可变
字典dict:key是唯一的 无序,可变
集合set 无序,可变
布尔:bool
单个等号是赋值,两个等号是比较值,is是比较两个变量的id
基本运算符
/ 结果保留小数部分,正常运算结果 // 取模,只保留整数部分 % 取余数
可变类型和不可变类型
可变:列表,集合,字典
不可变:整型,浮点型,字符串,元组
可变类型:在值改变的情况下,id不改变,说明你是在原值的基础上进行修改 不可hash
不可变类型:在值改变的情况下,id改变,说明产生了新值 可hash
1.列表与元组区别
1.相同点 列表和元祖都是序列类型的容器对象,可以存放任何类型的数据 2.不同点 除了字面上的区别(括号与方括号),列表是可变的数据类型,元祖是不可变的数据类型 元祖用于存储异构数据,就是一些没有什么关联的数据,比如用元祖记录一个人的身高,体重,年龄。 列表一般用于存储同构数据,就是一些就有相同意义的数据,比如都是字符串类型。
2.向列表内添加元素?两个列表使用“+”号的结果,与append区别?
a=[1,2,3] b=[4,5,6] print(a+b) #[1, 2, 3, 4, 5, 6] a.append(b) print(a) #[1, 2, 3, [4, 5, 6]]
使用"+"号把列表元素每个都拆开放进去,当成一个个元素
使用append把加入的列表当成一个元素加入在最后
3.
全局变量和局部变量的区别在于作用域,全局变量在整个py文件中声明,全局范围内可以使用;
局部变量是在某个函数内部声明的,只能在函数内部使用,如果超出使用范围(函数外部),则会报错
__name__是内置变量
1.如果在函数中,变量前加了global,很显然该变量是全局变量 (global在局部修改成全局的不可变数据)
2.如果函数中的一个变量和全局变量的名称相同,但是函数没有给这个变量赋值,那么这个变量是全局变量
3.如果函数中的一个变量和全局变量的名称相同,但是函数给该变量赋值了,这个变量就是局部变量
4.如果函数中的变量没有与之同名的全局变量,那么该变量显然是一个局部变量
4.Python垃圾回收机制
1.引用计数:当内存中的数据没有与任何变量名有绑定关系,就会被自动回收 2.标记清除:当内存快要被某个应用程序占满的时候,会自动触发清除 3.分代回收:根据值存活的时间不同,划分不同的等级,等级越高垃圾回收机制扫描的概率越低
5.运算符重载 (简单来说就是自定义类,重写魔法方式实现运算符)
https://blog.csdn.net/zhangshuaijun123/article/details/82149056
什么是运算符重载:让自定义的类生成的对象(实例)能够使用运算符进行操作 算术运算符的重载:(主要就是使用魔法方法实现运算) 方法名 运算符和表达式 说明 __add__(self,rhs) self + rhs 加法 __sub__(self,rhs) self - rhs 减法 __mul__(self,rhs) self * rhs 乘法 __truediv__(self,rhs) self / rhs 除法 __floordiv__(self,rhs) self //rhs 地板除 __mod__(self,rhs) self % rhs 取模(求余) __pow__(self,rhs) self **rhs 幂运算
示例
class Mynumber: def __init__(self,v): self.data=v def __add__(self, other): #other是一个对象 x=self.data+other.data return x def __sub__(self, other): x=self.data-other.data return x n1=Mynumber(100) n2=Mynumber(200) n3=n1+n2 #n3=n1.__add__(n2) 加号触发__add__魔法方法 print(n3) #300 n4=n2-n1 #n4=n2.__sub__(n1) 减号触发__sub__魔法方法 print(n4) #100
6.Django ORM 中F查询与Q查询
F查询:本质就是从数据库中直接获取某个字段的值
查询数据库大于卖出量的书籍
from django.db.models import F res = models.Book.objects.filter(kucun__gt=F('maichu')) #kucun和maichu都是Book表的字段
将书籍价格都增加10
model.Book.objects.update(price=F('price')+10) #所有书籍价格都增加10
(注意修改char类型的字段不能按照上面那种方式,需要使用Concat,加上拼接值value)
from django.db.models.functions import Concat from django.db.models import Value ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款'))) models.Book.objects.update(title = F('title')+'新款') # 不能这么写
Q查询(filter查询条件都是与,Q支持与或非)
查询书籍名称是三国演义或者价格是444
from django.db.models import Q res = models.Book.objects.filter(title='三国演义',price=444.44) # filter只支持and关系 res1 = models.Book.objects.filter(Q(title='三国演义'),Q(price=444)) # 如果用逗号 那么还是and关系 res2 = models.Book.objects.filter(Q(title='三国演义')|Q(price=444)) #或者关系 res3 = models.Book.objects.filter(~Q(title='三国演义')|Q(price=444)) #查询除了title是三国演义,或者价格是444的书籍
7.异常处理:try...except...else...,try...finally...执行的过程
当try中的代码块没有检测到异常时候,就会走else代码,finally无论有没有错误最后都会走。
常见错误类型
NAMERROR 名字错误
SyntaxError 语法错误
KeyError 键不存在
ValueError 值错误
IndexError 索引错误
try: 需要检验的代码 except Exception: # 万能异常 所有的异常类型都被捕获 print('老子天下无敌') else: print('被检测的代码没有任何的异常发生 才会走else') finally: print('无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我')
8.Linux下文件操作:
查看文件最后50行: tail -n 50 filename vim操作命令: 三种常见模式 1.正常模式 (一打开文档就是这个模式) 2.编辑模式 (按下i,o,a等键,会从正常模式到编辑模式,可以往文档中写内容) 3.命令行模式 (编辑模式按ESC键,进入正常模式,输入:q代表退出,:wq代表保存退出,:q!代表强制退出)
9.代码演示
1.打印python中的False print(bool(0)) print(bool('')) 2.列表操作结果 [1,2]*2 #[1, 2, 1, 2] 3.==与is区别 ==是比较值的大小 is是比较id值是否一致 4.变量赋值引用问题 a = 2 b = a a += 2 print(a, b) #4,2 5.函数传参,解压缩 def func(a, b, c=3, d=4): print(a, b, c, d) func(3, *(3, 4)) #3,3,4,4 func(3, *(3, 4), d=7) #3,3,,4,7
函数参数
1.位置参数:位置实参,位置形参 2.关键字参数:在函数调用的阶段,给变量名赋值 3.默认值参数:在函数定义阶段,给变量名赋值 4.不定长参数:*和** 站在形参的角度看 * :接收多余的位置实参,统一放在元组中,然后传递给后面的变量名 站在实参的角度看 * :将元组,列表,字符串等数据打散,然后一一传给形参 站在形参的角度看** :接收多余的关键字参数,统一放在字典中,然后传递给后面的变量名 站在实参的角度看** :将字典数据打散成key=value形式,然后传给形参