python 知识点补充
简明 python 教程
- r 或 R 来指定一个 原始(Raw) 字符串
- Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字、字符串与
函数。 - 所谓物理行(Physical Line)是你在编写程序时 你所看到 的内容。所谓逻辑行(Logical
Line)是 Python 所看到 的单个语句。Python 会假定每一 物理行 会对应一个 逻辑行。- 希望在一行物理行中指定多行逻辑行,那么你必须通过使用分号( ; )来明确表明逻辑
行或语句的结束。
- 希望在一行物理行中指定多行逻辑行,那么你必须通过使用分号( ; )来明确表明逻辑
- Python 将始终对块使用缩进,并且绝不会使用大括号。你可以通过运行 from
future import braces 来了解更多信息。 - // (整除)
- 可以在 Python 的 while 循环中使用 else 从句。
- 关键字参数(Keyword Arguments)——我们使用命名(关键字)而非位置(一直以来我们所使用的方式)来指定函数中的参数。
- *param 的星号参数时,从此处开始直到结束的所有位置参数(Positional Arguments)都将被收集并汇集成一个称为“param”的元组(Tuple)。
- **param 的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param 的字典(Dictionary)。
- DocStrings 是一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解
- print(print_max[函数名].doc)
- 通过使用函数的 doc (注意其中的双下划綫)属性(属于函数的名称)来获取函数 print_max 的文档字符串属性。
- python 中一切皆对象,包括函数。
- 按字节码编译的 .pyc 文件
- 按字节码编译的(Byte-Compiled)文件, 是将 Python 转换成中间形式的文件。
- 这一 .pyc 文件在你下一次从其它不同的程序导入模块时非常有用, 将更加快速。因为导入模块时所需要的一部分处理工作已经完成了.
- 如果 Python 没有相应的权限对这一目录进行写入文件的操作,那么 .pyc 文件将不会被创建.
- 应该尽量避免使用 from...import 语句,而去使用 import 语句。这是为了避免在你的程序中出现名称冲突,同时也为了使程序更加易读。
- 每一个 Python 模块都定义了它的 name 属性。如果它与 main 属性相同则代表这一模块是由用户独立运行的.
- 内置的 dir() 函数能够返回由对象所定义的名称列表。
- 包是指一个包含模块与一个特殊的 init.py 文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了 Python 模块。
- Python 中有四种内置的数据结构——列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)
- 一个类同样也可以具有字段(Field),它是只为该类定义且只为该类所用的变量。
- 元组的一大特征类似于字符串,它们是不可变的。
- 变量名只是指向你计算机内存中存储了相应对象的那一部分。这叫作将名称绑定(Binding)给那一个对象。
- 通过生成一份完整的切片制作一份列表的副本(mylist = shoplist[:])
- 开发一款软件的流程中的各个 阶段(Phases):
- What/做什么(分析)
- How/怎么做(设计)
- Do It/开始做(执行)
- Test/测试(测试与修复错误)
- Use/使用(操作或开发)
- Maintain/维护(改进)
- 字段(field)与方法(method)通称类的属性(Attribute)。
- Python 中的 self 相当于 C++ 中的 this 指针以及 Java 与 C# 中的 this 引用
- init 方法会在类的对象被实例化(Instantiated)时立即运行。
- 类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。
- 没有 self 引用的变量
- 使用装饰器(Decorator)将 how_many 方法标记为类方法
- 定义为一个 classmethod(类方法) 或是一个 staticmethod(静态方法)
- 将装饰器想象为调用一个包装器(Wrapper)函数的快捷方式
- @classmethod修饰how_many 等价于 how_many = classmethod(how_many)
- 对象变量(Object variable)由类的每一个独立的对象或实例所拥有。
- 通过 self 引用的变量
- Python 提供了一个叫作 Pickle 的标准模块,通过它你可以将任何纯 Python 对象存储到一个文件中,并在稍后将其取回。这叫作持久地(Persistently)存储对象。
- dump, 这一过程被称作封装(Pickling)。
- load, 这个过程被称作拆封(Unpickling)。
- 可以通过使用 try..except 来处理异常状况。
- 把通常的语句放在 try 代码块中,将我们的错误处理器代码放置在 except 代码块中。
- 通过 raise 语句来引发一次异常,具体方法是提供错误名或异常名以及要抛出(Thrown)异常的对象。
- 能够引发的错误或异常必须是直接或间接从属于 Exception (异常) 类的派生类。
- Try ... Finally, 通过 finally 来保证发生异常时,资源被正确的释放。
- with 语句使得这一过程可以以一种干净的姿态得以完成
- 在代码块开始之前调用 thefile.enter 函数
- 在代码块执行完毕之后调用 thefile.exit, 类似 c++ 的 cs 操作
- 特殊方法:
- init(self, ...)
- 这一方法在新创建的对象被返回准备使用时被调用。
- del(self)
- 这一方法在对象被删除之前调用(它的使用时机不可预测,所以避免使用它)
- str(self)
- 当我们使用 print 函数时,或 str() 被使用时就会被调用。
- getitem(self, key)
- 使用 x[key] 索引操作时会被调用。
- init(self, ...)
- lambda 语句可以创建一个新的函数对象, lambda 需要一个参数,后跟一个表达式作为函数体,这一表达式执行的值将作为这个新函数的返回值。
- 列表推导(List Comprehension)用于从一份现有的列表中得到一份新列表
- listtwo = [2*i for i in listone if i > 2]
- 原始列表依旧保持不变
- 当语句断言(assert)失败时,将会抛出 AssertionError 。
- 装饰器(Decorators)是应用包装函数的快捷方式。这有助于将某一功能与一些代码一遍又一遍地“包装”。
- 装饰器有点像模板编程,模板编程泛化了类型, 装饰器泛化了函数方法。
流畅的Python
-
namedtuple 就加入到 Python 里,用以构建只有少数属性但是没有方法的对象,比如数据库条目
-
特殊方法的存在是为了被 Python 解释器调用的
- repr(字符串表示形式)、abs、add 和 mul 特殊的运算符。
-
Python 会忽略代码里 []、{} 和 () 中的换行
-
missing 方法只会被 getitem 调用
-
slots 属性可以改变实例属性的存储方式
-
在 Python 中,函数是一等对象, 整数、字符串和字典都是一等对象
-
Python 简单的句法限制了 lambda 函数的定义体只能使用纯表达式。换句话说,lambda 函数的定义体中不能赋值,也不能使用 while 和 try 等 Python 语句。
-
调用类时会运行类的 new 方法创建一个实例,然后运行 init 方法,初始化实例,最后把实例返回给调用方。
-
生成器函数: 使用 yield 关键字的函数或方法。调用生成器函数返回的是生成器对象。
- 生成器函数还可以作为协程
- 判断对象能否调用,最安全的方法是使用内置的 callable() 函数。
-
任何对象都可以表现得像函数那样,只需实现实例方法 call
-
装饰器必须是函数,而且有时要在多次调用之间“记住”某些事
-
注解不会做任何处理,只是存储在函数的 annotations 属性(一个字典)中
-
支持函数式编程的包 reduce, functools 模块提供了一系列高阶函数
-
函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。
- 最简单的注册装饰器和较复杂的参数化装饰器。
- 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。
- 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
- 装饰器得到的 target 不一定是原来那个 target 函数,而是 decorate(target) 返回的函数。
- 装饰器只是语法糖, 装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时立即执行。
- 装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这通常是在导入时(即 Python 加载模块时)。
-
闭包还是回调式异步编程和函数式编程风格的基础。
- 闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。
- 关键是它能访问定义体之外定义的非全局变量。
- 闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。
- 只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。
- nonlocal 的作用是把变量标记为自由变量,即使在函数中为变量赋予新值了,也会变成自由变量。
- Python 内置了三个用于装饰方法的函数:property、classmethod 和 staticmethod
- functools.lru_cache(Least Recently Used), 避免传入相同的参数时重复计算
- 叠放了装饰器:@lru_cache() 应用到 @clock 返回的函数上。(最先是靠近函数声明的地方)
- 闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。
-
默认做浅复制:
- copy 模块提供的 deepcopy 和 copy 函数能为任意对象做深复制和浅复制。
- Python 唯一支持的参数传递模式是共享传参(call by sharing)。
- 共享传参指函数的各个形式参数获得实参中各个引用的副本。也就是说,函数内部的形参是实参的别名。
-
del 语句删除名称,而不是对象。del 命令可能会导致对象被当作垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时。
-
弱引用不会增加对象的引用数量。弱引用在缓存应用中很有用,因为我们不想仅因为被缓存引用着而始终保存缓存对象。
- 弱引用是可调用的对象,返回的是被引用的对象;如果所指对象不存在了,返回 None
-
在python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。
-
只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数时,会返回一个生成器对象。也就是说,生成器函数是生成器工厂。
- 生成器用于“凭空”生成元素。
- 序列可以迭代的原因:iter函数, 解释器需要迭代对象 x 时,会自动调用 iter(x)。
- 标准的迭代器接口有两个方法:
- next: 返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常。
- iter: 返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如在 for 循环中。
- 普通的函数与生成器函数在句法上唯一的区别是,在后者的定义体中有 yield 关键字
- 生成器函数会创建一个生成器对象,包装生成器函数的定义体。
- yield from i 完全代替了内层的 for 循环。
-
yield 关键字可以在表达式中使用,而且生成器 API 中增加了 .send(value) 方法。生成器的调用方可以使用 .send(...) 方法发送数据,发送的数据会成为生成器函数中 yield 表达式的值。因此,生成器可以作为协程使用。协程是指一个过程,这个过程与调用方协作,产出由调用方提供的值。
- .throw(...) 和 .close() 方法:前者的作用是让调用方抛出异常,在生成器中处理;后者的作用是终止生成器。
- 理解 python 的协程
-
CPython 解释器本身就不是线程安全的,因此有全局解释器锁(GIL),一次只允许使用一个线程执行 Python 字节码。因此,一个 Python 进程通常不能同时使用多个 CPU 核心。
其他
- 《Rework》
- 技术思维是很厉害的,够理性、有逻辑、有解决问题的能力,你们去玩那些行业一定能玩得更好,千万别觉得做技术的只能在线上生存。
- 技术需求还是需要专业、专注的态度,还有专业的服务模式。
- MegaEase
- 《人月神话》