Python的一些总结

时间:2023-01-30 08:59:50

1.什么是lambda函数?

Python允许你定义一种单行的小函数。定义lambda函数的形式如下,lambda参数:表达式lambda函

>>> a = []
>>> def fun(a):
a.append(1)



>>> fun(a)
>>> print a
[1]

数默认返回表达式的值。你可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但表达式只有一个:(如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda)

>>> g = lambda x,y : x*y
>>> g(3,4)
12
>>> g = lambda x,y = 0, z = 0 : x + y + z
>>> g(1)
1
>>> g(3,4,5)
12
2.Python中,int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。

>>> int("23")
23
>>> int("23ab")

Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
int("23ab")
ValueError: invalid literal for int() with base 10: '23ab'
3.Python是如何进行内存管理的?

Python的内存管理是由Python的解析器负责的,开发人员可以从内存管理事物中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短。

详细的来说,可以从三个方面来说:一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:

1,一个对象分配一个新名称

2,将其放入一个容器中(如列表、元组或字典)

引用计数减少的情况:

1,使用del语句对对象别名显示的销毁

2,引用超出作用域或被重新赋值

sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

二、垃圾回收

1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

4、Python里面如何拷贝一个对象?(赋值、浅拷贝、深拷贝的区别)

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
5、Python的函数参数传递

>>> a = 1
>>> def fun(a):
a = 2

>>> fun(a)
>>> print a
1
>>> a = []>>> def fun(a):	a.append(1)>>> fun(a)>>> print a[1]
所有的变量都可以理解是内存中一个对象的”引用“,或者,也可以看似C中void*的感觉。

这里记住的类型是属于对象的,而不是变量。而对象有两种,”可更改“与”不可更改对象“。在python中,strings,tuples,和numbers是不可更改的对象,而list,dict等则是可以修改的对象。(这就是这个问题的重点)

当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改.

6、Python里面的list实现

Cpython 中的列表实现类似于下面的 C 结构体。ob_item 是指向列表对象的指针数组。allocated 是申请内存的槽的个数。

每当来了一个新要求的大小(比如插入操作中的原大小+1,或删除操作中原大小-1):newsize,这时python并不直接对list的空间进行调整。而是作个比较,若新要求的大小在总容量之下,总容量的一半之上则,不进行调整