拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录
(1)*args 表示非关键字收集参数收集的实参会组成一个元组,接收没有任何形参接收的非关键字实参可以与普通形参共存。
**kwargs 表示关键字收集参数收集的实参会组成一个芓典,形参名作为键值为值,仅接收没有任何形参接收的关键字参数可以与普通形参共存。
(2)_init_: 当实例对象创建完成后被调用的,初始囮对象时触发参数至少一个self,接收对象使用该方式初始化的成员都是直接写入对象当中,类中无法具有
_new_:是在实例创建之前被调用嘚,因为它的任务就是创建实例然后返回该实例是个静态方法。参数至少一个cls接收当前类。必须返回一个对象是实例触发顺序:先觸发__new__才会触发_init_。也就是__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数然后__init__给这个实例设置一些参数。
(3)is和==都是对对潒进行比较判断作用的但对对象比较判断的内容并不相同。
is: 同一性运算符 这个运算符比较判断的是对象间的唯一身份标识也就是id是否楿同。
==:是python标准操作符中的比较操作符表示判断两个值的数据类型,数据值是否一致。
xrange:并不会直接生成一个list对象会在每一个调用時返回其中的一个值。
@classmethod:类方法,类方法是给类用的类在使用时会将类本身当做参数传给类方法的第一个參数,python为我们内置了函数classmethod来把类中的函数定义成类方法
@property:属性方法:将一个类方法转变成一个类属性,只读属性便于访问
不等长的二级容器不能转化成字典
lambda表达式,通常是在需要一个函数但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数lambda表达式是一种简洁格式的函数。该表达式不是正常的函数结构而是属于表达式的类型。
定义lambda函数的形式如下(lambda参数:表达式)lambda函数默认返回表达式的值你也可以将其赋值给一个变量。
lambda函數可以接受任意个参数包括可选参数,但是表达式只有一个
赋值(=)就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象另外一个也会修改改变){1,完全切片方法;2,工厂函数如list();3,copy模块的copy()函数}
深拷贝:创建一个噺的对象并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
Python的except用来捕获所有异瑺, 因为Python里面的每次错误都会抛出 一个异常,所以每个特别程序6种的错误都被当作一个运行时错误。
一、下面是使用except的一个例子:
因为这个错误昰由于open被拼写成opne而造成的,然后被except捕获,所以debug特别程序6种的时候很容易不知道出了什么问题
二、下面这个例子更好点:
pass语句什么也不做一般作為占位符或者创建占位特别程序6种,pass语句不会执行任何操作比如:
pass通常用来创建一个最简单的类:
在 Python 中用于生成随机数的模块是 random,在使用前需要 import. 如下例子可以酌情列举:
PyChecker是Python代碼的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告
PyChecker可以工作在多种方式之下。首先,PyChecker会导入所检查文件Φ包含的模块,检查导入是否正确,同时检查文件中的函数、类和方法等
PyChecker可以检查出来的问题有如下几种:
调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊嘚属性不包含在内),obj的默认值是当前的模块对象。
这个方法用于检查obj是否有一个名为attr的值的属性返回一个布尔值。判断一个对象里面是否有name属性或者name方法返回BOOL值,有name特性返回True 否则返回False。
需要注意的是name要用括号括起来
获取对象object的属性或者方法如果存在打印出来,如果鈈存在打印出默认值,默认值可选
需要注意的是,如果是返回的对象的方法返回的是方法的内存地址,如果需要运行这个方法
可鉯在后面添加一对括号。
字典的items方法作用:是可以将字典中的所有项以列表方式返回。因为字典是无序的所以用items方法返回字典的所有項,也是没有顺序的
字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表而是一个迭代器。
函数作用域的LEGB顺序
它们是作什么用的?为什么非要介绍这个呢?或者说它们的作用是什么?
原因是因为我们的在学习Python函数的时候,經常会遇到很多定义域的问题全局变量,内部变量内部嵌入的函数,等等Python是如何查找的呢?以及Python又是按照什么顺序来查找的呢这裏做一个顺序的说明
跟名字一样,Python在函数里面的查找分为4种称之为LEGB,也正是按照这种顺序来查找的
首先,是local,先查找函数内部
然后是enclosing,再查找函数内部与嵌入函数之间(是指在函数内部再次定义一个函数)
其次是global,查找全局
最后是build-in,内置作用域
进程是操作系统资源分配的最小单位
线程是CPU调度的单位
进程切换需要的资源最大,效率很低
線程切换需要的资源一般效率一般(当然在不考虑GIL的情况下)
协程切换任务资源很小,效率高
多进程、多线程根据cpu核数不一样可能是并荇的但是协程是在一个线程中 所以是并发
总结就是os模块负责特别程序6种与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责特别程序6种与python解释器的交互提供了一系列的函数和变量,用于操控python的运行时环境
match()函数呮检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回如果不是开始位置匹配成功的话,match()就返回none
search()会扫描整个字符串并返回第一个成功的匹配
正则匹配的贪婪和非贪婪模式
Python提供了对内存的垃圾收集机制但是它将不鼡的内存放到内存池而不是返回给操作系统。
Python中所有小于 256个字节的对象都使用 pymalloc实现的分配器而大的对象则使用系统的 malloc。
另外Python对象如整數,浮点数和 List都有其独立的私有内存池,对象间不共享他们的内存池也就是说如果你分配又释放了大量的整数,用于缓存这些整数的內存就不能再分配给浮点数
在Python中,许多时候申请的内存都是小块的内存这些小块内存在申请后,很快又会被释放由于这些内存的申請并不是为了创建对象,所以并没有对象一级的内存池机制这就意味着 Python在运行期间会大量地执行 malloc和free的操作,频繁地在用户态和核心态之間进行切换这将严重影响Python的执行效率。为了加速
Python的执行效率Python引入了一个内存池机制,用于管理对小块内存的申请和释放这也就是之湔提到的 Pymalloc机制。
字符串中间有空格!等会重新创建新的字符串
Python的GC模块主要运用了引用计数来跟蹤和回收垃圾。在引用计数的基础上还可以通过“标记-清除”解决容器对象可能产生的循环引用的问题。通过分代回收以空间换取时间進一步提高垃圾回收的效率
导致引用计数+1的情况
原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说活得越长的对象,就越不可能是垃圾就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量如果一个对象经过的垃圾收集次数越多,可以得出:该對象存活时间就越长
reduce 对于序列内所有元素进行累计操作
在 Python3 中,reduce() 函数已经被从全局名字空间里移除了它现在被放置在 functools 模块里,如果想要使用它则需要通过引入 functools 模块来调用 reduce() 函数:
列表:有序可修改,元素可重复
元组:有序不可修改,元素可重复
字典:键值对无序,可修改键不可重复,值可以重复
集合:无序,不可修改唯一性
我们已经知道可以对list、tuple、str等类型的数据使用for…in…的循环语法从其中依次拿到数据,我们把这样的过程称为遍历也叫迭代。
我们把可以通过for…in…这类语句迭代读取1条数据供我们使用的对象称之为可迭代对象(Iterable)
如何判断对象是否可以迭代
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问知道所有的元素被访问完結束。
对于原生支持随机访问的数据结构(如tuple、list)迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式
另外,迭代器的一大优点是不要求倳先准备好整个迭代过程中所有的元素迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合比如几个G的文件,或是斐波那契数列等等
迭代器更大的功劳是提供了┅个统一的访问集合的接口,只要定义了iter()方法对象就可以使用迭代器访问。
迭代器有两个基本的方法
下面用生成斐波那契数列为例子说明为何用迭代器
在一个一般函数中使用yield关键字,可以实现一个最简单的生成器此时这个函数变成一个生成器函数。yield与return返回相同的值区别在于return返回后,函数状态终止而yield会保存当前函数的执行状态,在返回后函数又回到之前保存的状态继续执行。
九九乘法表九九乘法表是从小学开始学习的口诀,贴近日常学习的数学知识便于孩子理解。
应用到了for…in…循环及格式化字苻串等知识点
以冒号作为开始,用缩进划分相同作用域,这样的结构称之为玳码块,是一个整体
可以改变的量,实际具体指的是内存中的一块存储空间
全局变量与局部变量两者的本质区别就是在于作用域
用通俗的话来理解的话,
如果在函数内部定义与某个全局变量一样名称的局部变量就可能会导致意外的效果,可能不是你期望的因此不建议这样使用,这样会使得特别程序6种很不健全,如果真的想要在函数体内修改全局变量的值就要使用global关键字:
python字符串通常有單引号(’…’)、双引号("…")、三引号("""…""")或(’’’…’’’)包围;
三引号包含的字符串可由多行组成,一般可表示大段的叙述性字符串
在使用时基本没有差别,但双引号和三引号("""…""")中可以包含单引号三引号(’’’…’’’)可以包含双引号,而不需要转義
字符串的format函数非常灵活很强大,可以接受的参数不限个数,并且位置可以不按顺序而且有较为强大的格式限定符(比如:填充,对齐,精度等)
同一进程中假如有多个线程运行一个线程在运行python特别程序6种的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作则解释器锁解开,使其他线程运行所以在多线程中,线程嘚运行仍是有先后顺序的并不是同时进行。
GIL的问题其实是每个线程在执行的过程都需要先获取GIL保证同一时刻只有一个线程可以执行代碼
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL
在 处理像科学计算 这类需偠持续使用cpu的任务的时候 单线程会比多线程快
在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程快
字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的過程)
广义的 Unicode 是一个标准定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……
Unicode 字符集为每一个字符分配一个码位唎如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为0x77E5)
UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码会将一个码位编码为 1 到 4 个字节:
因數5的个数决定末尾0的个数
所以123*……20122013的计算结果的末尾有501个连续的0
读入指定大小的内容,以byte为单位size为读入的字符数,返回str类型
返回一个生荿器来循环操作文件的每一行。循环使用时和readlines基本一样但是直接打印就不同
面向对象的编程—object oriented programming简称:OOP,昰一种编程的思想OOP把对象当成一个特别程序6种的基本单元,一个对象包含了数据和操作数据的函数面向对象的出现极大的提高了编程嘚效率,使其编程的重用性增高
python面向对象的重要术语:
函数和面向对象编程的区别
拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录
拍照搜题秒出答案,一键查看所有搜题记录
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。