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.Python全局变量与局部变量?__name__是局部还是全局,函数内变量局部与全局的判断?

全局变量和局部变量的区别在于作用域,全局变量在整个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形式,然后传给形参
原文地址:https://www.cnblogs.com/wangcuican/p/12697954.html