python3知识汇总

1.什么是python

Python 是强类型的动态脚本语言
强类型:不允许不同类型相加。例如:整形+字符串会报类型错误。
动态:不使用显示数据类型声明,
脚本语言:一般是解释性语言,运行代码只需要一个解释器,不需要编辑。

2.python中的类型有哪些

number(数字) string(字符串) dictionary(字典) tuple(元组) list(列表) bool(布尔) set(集合)

3.python中什么元素为假

0、空字符串、空列表、空字典、空元组、None

4.python常见的字符串操作

find、index、count、replace、split、capitalize、title、startswith、endswith、lower、
upper、ljust、rjust、center、lstrip、rstrip、strip、rfind、rindex、partition、rpatition、
splitlines、isalpha、isdigit、isalnum、isspace、join。
详细请看:https://blog.****.net/weixin_44596097/article/details/88380327

5.python中类方法,静态方法的区别?

类方法:是类对象的方法,定义是需要在使用@classmethod进行修饰,形参为cls
使用类名和对象名均可调用。
静态方法:是一个任意函数,定义需要在使用@staticmethod进行修饰,静态方法实际上和该类没有太大关系,类名和对象名均可调用。

6.什么是lambda?

匿名函数lambda:是指无需定义标识符(函数名)的函数。
f = lambda x,y:x+y
说明: 冒号左边是参数,右边是执行代码

7.python中进程,线程,协程的区别?

》》》进程:进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
》》》线程: 调度执行的最小单位,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
》》》协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

8.python中内存管理与垃圾回收机制

1、python的内存管理分为六层:最底的两层有OS控制。第三层是调用C的malloc和free等进行内存控制。第四层第五层是python的内存池。最上层使我们接触的直接对python对象进行操作。

2、python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间。释放内存空间时候会回收到内存池中而不是直接调用free释放掉。

垃圾回收

Python的GC模块主要运用了引用计数来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”解决容器对象可能产生的循环引用的问题。通过分代回收以空间换取时间进一步提高垃圾回收的效率。

引用计数

原理:当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1,当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。

内存池

当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。

9.Gil全局解释器锁的理解

线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.
对于io密集型任务,python的多线程起到作用,而 对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。

10.装饰器
我们先认识一下闭包概念:
满足三个条件

  1. 发生函数嵌套
  2. 外层函数的返回值必须是内层函数的函数名(地址/引用)
  3. 外层函数有参数( 内层函数使用到)

装饰器是在不改变原有函数代码的前提下,给函数添加新的功能(业务代码)

代码实现

def func_out(data):
    def func_in():
        print("1111")
        data()
    return func_in

# println = func_out(println)
@func_out
def println():
    print("2222")

println()

应用场景:

插入日志、性能测试、事务处理,权限验证

执行流程
python3知识汇总

11.单例模式

单例模式:通过这个类创建的对象地址都是一样的。

应用场景

  1. 资源共享的情况下,避免由于资源操作是导致的性能或者损耗,如:日志文件
  2. 控制资源的情况先,方面资源之间的互相通信,如:应用配置,多线程池
class Single(object):
    # 自定义属性 ,保存对象
    __instance = None
    
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return  cls.__instance 

12.生成器、迭代器的区别?

生成器

在 Python 中,使用了 yield 的函数被称为生成器,Python的生成器是一个返回可以迭代对象的函数
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。

li = (i**2 for i in range(5))
print(next(li))

迭代器

迭代器是一个可以记住遍历的位置的对象。迭代器有两个基本的方法:iter() 和 next()。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
:字符串,列表或元组对象都可用于创建迭代器

list = [1,2,3,4,5]
it = iter(list)
print(next(it))
print(next(it))
print("-------")
for x in it:
    print(x,end=" ")

yield与return的区别

yield与return返回相同的值,区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行。