1.is和==的区别:
is比较的是id,对象的内存地址
= =比较的是值
2.按字典中的value值进行排序
sorted(dict.items(), key = lambda x: x[1])
3.字典和json的区别
字典是python的数据结构,字典中的key值能hash
json是一种数据的表现形式,是字符串
4.可变、不可变类型:
指的是内存中的值是否可以被改变
不可变:数值、字符串、元组
可变:列表、字典、集合
5.常用的字符串格式化
占位符 s1 = “%s DSB 你好”%name
format s2 = “{} DSB 你好”.format(name)
f-string s3 = f"{name} DSB 你好"
6.字符串驻留机制
对短字符串,赋值给多个不同对象时,内存中只有一个副本
驻留适用范围:由数字,字符和下划线组成的python标识符及整数[-5,256]
7.删除list中重复元素
通过set内置的去重实现: l2 = list(set(l1))
#保持原来顺序
通过内置sort方法:l2.sort(key=l1.index)
l2 = sorted(set(l1), key=l1.index)
遍历:if not in l2 -> append
8.统计函数的执行效率
import cProfil #引入程序分析包,分析代码性能
cProfile.run(‘func(paras)’) #把函数以字符串形式传入模块的run方法
9.列举字符串、列表、元组、字典的5个常用方法
str1 = ‘’ : replace, strip, split, reverse, upper, lower…
list1 =[]: append, pop, insert, remove,sort, count, index…
tuple1 = (): index, count, len(), dir()…
dict1 = {}: get, keys, values, items, pop, popitems, clear, update…
10.什么是反射,以及应用场景
通过字符串的形式去访问对象的属性,调用对象的方法(但是不能去访问方法)
比如本来可以通过if elif判断字符串然后调用函数,但在大规模系统中不可取。
核心主题是如何利用字符串驱动不同的事件,比如导入模块、调用函数等等,这些都是python的反射机制,是一种编程方法、设计模式的体现,凝聚了高内聚、松耦合的编程思想,不能简单的用执行字符串来代替。
可以通过__import__函数,我们实现了基于字符串的动态的模块导入。obj =import(modules)
#对于lib.xxx.xxx.xxx这一类的模块导入路径,__import__默认只会导入最开头的圆点左边的目录,也就是“lib”
=> obj =import(“lib.” + modules, fromlist=True) # 注意fromlist参数
class Foo:
pass
foo = Foo()
foo.x = 1
#getattr
getattr(foo,‘x’)) # 1 ## getattr 函数让程序去foo模块了,寻找一个叫x的成员
# 相当于把字符串变成函数名的过程,然后把结果复制给变量func,变量指向foo里某个函数
#setattr
setattr(foo, ‘y’, 2))
getattr(foo,‘y’)) # 2
#hasattr
hasattr(foo, ‘z’)) #False # 通常通过hasattr的判断,防止非法输入错误
#delattr
delattr(foo, 'x))
11.浅copy和深copy的区别:
首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,浅拷贝是地址的复制,深拷贝是值的复制,就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象。
12.Python中的self关键字:
python的类中定义函数时的self关键字跟python的方法函数有关,方法函数由类的实例化对象调用,需要把调用它的实例化对象传入方法函数中,self代表调用时的类的实例,而非类。
在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。
13.Yield关键字和生成器:
yield是一种特殊的return,执行遇到yield时,立即返回,这一点与return相似,不同之处在于,下次进入函数时直接到yield的下一个语句,而return后再进入函数,还是从函数体的第一行代码开始执行。带yield的函数生成器,通常与next函数结合用。g=f()执行f,只得到一个生成器对象g,使用next函数进入到函数体内(执行next(g))。优点-节省内存,占用内存空间为O(1)。
生成器:在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置,自动创建iter()和 next()方法
简洁、高效,节省内存
14.列表和迭代器的区别:
列表经过内置函数iter包装,成为迭代器 a_iter = iter(a)
列表不论遍历多少次,表头位置始终是第一个元素
迭代器遍历结束后,不再指向原来的表头位置,而是最后元素的下一个位置
(迭代到最后一个元素,再执行next,会触发stopiteratio异常,
通过捕获此异常,求迭代器指向列表a的长度;生成器也是一种迭代器)
15.python垃圾回收机制
16. try except用法和作用
try用于检测异常,except用于捕获所有异常,保证程序的正常运行
Exception:捕获万能异常
finally:无论是否错误,都会执行此处代码
raise:触发异常
17.enumerate的作用
将一个可迭代对象中的元素,按元素顺序每个增加一个索引值,组成索引序列,利用它可以同时获得索引和值,方便后续操作。
18.lambda匿名函数表达式及应用场景
与函数有相同的作用域,但是匿名意味着引用计数为0, 使用一次就释放,除非给其命名
作为内置函数的参数,与内置函数配合一起使用
19.python的递归最大层数
998
20.常见的内置函数
17. filter,map,reduce的作用
filter(lambda x: x == 2, [1,2,3]) #通过判断函数func,筛选符合条件的元素
map(lambda x: x + ‘xxx’, [‘1’,‘2’]) #将func用于每个iterable对象
reduce(lambda x, y: x + y, [1,2,3,4,5]) # 函数会对参数序列中的元素进行累积
18.什么是闭包
定义在一个函数内部的函数,被外层函数包裹着,特点是可以访问到外层函数中的名字
闭包函数时名称空间与作用域、函数对象、函数嵌套的结合体
19.装饰器
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数,即装饰器是一个函数,它以函数作为参数,返回另一个函数。
使用 @函数名字,放在某些函数上面,起到增强它们功能的作用。
装饰器使得代码更简洁,代码的复用性大大提升。在Java中装饰器被称为注解。
python支持异步编程,从中也能看到装饰器的身影
20.函数式编程:面向过程的程序设计
21.Python LEGB规则
Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系
查找变量名就是在命名空间字典中查找键-值对, LEGB就是用来规定命名空间查找顺序的规则
LEGB含义解释:
L-Local(function);函数内的名字空间
E-Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G-Global(module);函数定义所在模块(文件)的名字空间
B-Builtin(Python);Python内置模块的名字空间
Python在确定一个变量的核心规则是LEGB,只有熟悉LEGB规则,才能清楚在程序执行过程中调用的变量究竟是什么
22.@property的用法
如果在一个类中要设置和获取一个成员变量的话, 一般是定义get和set的方法,但我们希望get/set一个值时有更简单的方法,像设置成员变量一样去设置一个变量,又可以检查类型参数。
在方法定义前,加 @property 装饰器,可以像操作成员变量一样进行操作。
新式类中的属性有三种访问方式,如下:
@property对应读取
@方法名.setter修改
@方法名.deleter删除属性
23.多线程threading和多进程multiprocessing的应用场景
每一个应用程序都有一个自己的进程。操作系统会为这些进程分配一些执行资源,例如内存空间等。
在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。
线程的状态
创建线程之后,线程并不是始终保持一个状态。其状态大概如下:
New 创建。
Runnable 就绪。等待调度
Running 运行。
Blocked 阻塞。阻塞可能在 Wait Locked Sleeping
Dead 消亡
线程的类型
线程有着不同的状态,也有不同的类型。大致可分为:
主线程
子线程
守护线程(后台线程)
前台线程
io 操作不占用CPU(从硬盘、从网络、从内存读数据都算io)
计算占用CPU(如1+1计算)
python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源。
python多线程适合io操作密集型的任务(如socket server 网络并发这一类的);
python多线程不适合cpu密集操作型的任务,主要使用cpu来计算,如大量的数学计算。
那么如果有cpu密集型的任务怎么办,可以通过多进程来操作(不是多线程)。
24.异步和多线程的区别
异步是单线程的,它能更优雅处理了io密集型的应用场景
25.__new__和__init__的区别
创建时初始化实例
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。
也就是: __new__先被调用,__init__后被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
26.如何实现一个单例
只初始化一次,在数据库连接中很常用
单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象)。
实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个对象,下一次再实例的时候就直接返回这个对象,不再做实例化的操作。
方式:https://www.jb51.net/article/202178.htm
通过模块导入的方式
通过类的绑定方法
通过魔法方法__new__
通过元类**
函数装饰器
类装饰器
27.python查找对象属性的顺序
_getattribute_()
类属性
数据描述符
实例属性
非数据描述符
__getattr__()方法
28.SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理
想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!