马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
name
当一个Python文件作为主步调运行时,name__属性的值将被设置为__main。这提供了一种方式,通过判定__name__来实行特定的代码块。
如果一个Python文件被其他文件导入,name__的值将是该模块的名称,而不是__main。这为模块提供了一种在导入时不实行某些代码的方式。
在编写单元测试时,__name__属性可以用于判定当前模块是否为测试模块,以便实行相应的测试代码。
模块独立运行
通过在模块中利用if name == “main”:语句,确保模块在须要时可以或许独立运行。这使得每个模块都成为一个可实行的脚本,方便测试和调试。
当在其他步调中导入模块时,name__属性的值将是模块的名称,而不是__main。这使得模块可以或许无缝地集成到其他步调中,而不实行在if name == “main”:块内的代码。
方便维护、模块独立测试、模块复用
java string和字符串区别
线程安全:
StringBuffer:线程安全
StringBuilder:线程不安全
利用环境:
利用少量的数据利用 String;
单线程利用大量数据利用 StringBuilder;
多线程利用大量数据利用 StringBuffer。
深浅拷贝
深拷贝
不光拷贝对象,对象内的元素也会发生拷贝。拷贝的是对象。
浅拷贝
只拷贝了对象,对象内的元素并不会发生拷贝。也就是说拷贝的是引用。
但是并不代表浅拷贝下修改了此中一个元素的值,另一个素内元素的值肯定会发生厘革,还要看被修改的值是否是可变对象:
【环境一】:如果是修改的元素是可变对象(set list dict字典),那么修改了此中一个元素,拷贝的元素会发生厘革,;
【环境二】:如果修改的元素是不可变对象(int string tuple元组),那么修改了此中一个元素,拷贝的元素不会发生厘革,
内存池 垃圾采取机制
引用增减
增
对象被创建:a = ‘abc’
对象被引用:b = a
对象作为其他对象的一个元素:c = [1,2,a]
对象被作为参数转达给函数:f(a)
减
变量被删除:del a or del b
变量引用了其他对象:b = c or a = c
在其他的引用对象中被删除(移除):c.remove(a)
引用对象自己被烧毁:del c
变量离开了地点的作用域(函数调用竣事):好比f(a)竣事时,传入参数a的引用次数-1
可以用sys.getrefcount函数看某个参数引用次数,但是其返回的计数总是比实际的引用次数多1,这是由于这内里包罗了调用此函数的临时计数。
垃圾采取
引用计数
当一个对象的引用计数归零时,会被垃圾采取。
Python表明器会定期实行一个循环检测器,搜索不可访问的对象的循环,并删除他们。
优点:简单及时性。
缺点:维护引用计数斲丧资源,且无法办理循环引用。
标记打扫
创建特别链表专门用于生存 列表、元组、字典、聚集、自界说类等对象,之后再去查抄这个链表中的对象是否存在循环引用
缺点:打扫非活动的对象前它必须次序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描全部对象。
分代采取
简单来说,分代采取就是为了提升标记打扫的服从
对标记打扫中的链表举行优化,将那些大概存在循引用的对象拆分到3个链表,链表称为:1/2/3三代,每代都可以存储对象和阈值,当到达阈值时,就会对相应的链表中的每个对象做一次扫描,除循环引用各自减1而且烧毁引用计数器为0的对象。
缓存机制
由于内存申请和烧毁一样寻常比力耗时,Python有两大类缓存机制来克制频仍的内存申请和烧毁从而提升服从。
池机制
在表明器中步调一开始就默认创建了一些常见的对象放在池中,当步调中用到这些对象时,只须要从池中获取就行,即引用次数+1,而不须要重新一个新的对象,也不须要开辟新的内存。
别的,在步调过程中池中的对象不会被烧毁,除非步调竣事。
Python提供了对内存的垃圾采取机制,将不消的内存放到内存池而不是返回给利用体系。
1)Pymalloc 机制。为了加速 Python 的实行服从和管理对小块内存的申请和开释。
2)Python 中全部小于 256 个字节的对象都利用 pymalloc 实现的分配器,而大的对象则利用体系的 malloc。
3)对于Python对象,如整数、浮点数和List,都有其独立的私有内存池,对象间不共享它们的内存池。也就是说如果你分配又开释了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
free_list
当一个对象的引用计数为0时,步调内部本应该立即将内存烧毁,但内部并没有直接烧毁。
而是将对象添加到free_list链表中当做缓存,以后再去创建新对象时,不在重新开辟内存,而是直接利用free_list。
Python中差异的数据范例利用的free_list也差异,好比小的整数型就不利用free_list,而是利用池
装饰器
通过装饰器函数,来修改原函数的一些功能,又不会改变原函数的内部实现,又使得原函数不须要修改。装饰器自己可以增强其他函数的功能。
优点:
克制大量的重复代码;
装饰器的原理
装饰器的原理是基于Python的函数对象和闭包的特性。当界说一个装饰器时,我们实际上创建了一个新的函数对象,该对象担当一个函数作为参数。这个新的函数对象的__call__方法被调用,它将调用我们转达给装饰器的原始函数。
当我们利用@decorator语法将装饰器应用于一个函数时,Python会实行以下利用:
创建一个新的函数对象,该对象将调用我们转达给装饰器的原始函数。
将新创建的函数对象的__call__方法设置为装饰器函数。
将新创建的函数对象的__name__属性设置为原始函数的名称。
将新创建的函数对象的__doc__属性设置为原始函数的文档字符串。
将新创建的函数对象的__module__属性设置为原始函数的模块名称。
将新创建的函数对象的__globals__属性设置为原始函数的全局作用域。
将新创建的函数对象的__closure__属性设置为原始函数的闭包。
返回新创建的函数对象。
当我们调用被装饰的函数时,Python会调用我们转达给装饰器的原始函数,并实行我们在装饰器中添加的额外功能。
迭代器
迭代器是一个对象,它可以返回一个序列中的一个个元素。迭代器可以用于遍历列表、字典、聚集等数据布局。
迭代器的告急优点是它们可以一次只返回一个元素,这意味着它们可以处置惩罚大量数据时节流内存。以是循环遍历常用迭代器。
迭代器的原理
迭代器的原理是基于Python的内置iter()函数和next()函数的特性。当我们调用iter()函数并转达一个可迭代对象时,Python会返回一个迭代器对象。当我们调用next()函数并转达一个迭代器对象时,Python会返回迭代器对象的下一个元素。
当我们调用iter()函数时,Python会实行以下利用:
创建一个新的迭代器对象。
将新创建的迭代器对象的__next__方法设置为迭代器对象的next()方法。
将新创建的迭代器对象的__iter__方法设置为迭代器对象自己。
返回新创建的迭代器对象。
当我们调用next()函数时,Python会实行以下利用:
调用迭代器对象的__next__方法,并返回下一个元素。
如果迭代器对象的__next__方法已经被调用过一次,而且迭代器对象的__iter__方法返回False,则会引发StopIteration非常。
进步运行服从的方法
5方法-利用外部功能包-排序时利用key-针对循环优化-实行多种编译方法-python版本-交织编译
函数转达方式
python参数转达接纳的是“传对象引用”的方式,这种方式是值转达和引用转达的综合。
不可变参数范例是值转达:
如果函数收到的是一个不可变数据范例(好比数字、字符大概元组)的引用,就不能直接修改原始对象,相称于通过“传值’来转达对象。
可变参数范例是引用转达:
如果函数收到的是一个可变数据范例(好比字典大概列表)的引用,就能修改对象的原始值,相称于通过“传引用”来转达对象。
|