之前暑假学习的笔记在这里 ,因为过于久远,所以俺再开一篇。这一篇可能就比较琐碎了,并且会加上其他包的内容。
语言
iter()
用来生成迭代器,形式为iter(object[, sentinel])
object
:支持迭代的集合对象。
sentinel
:如果传递了第二个参数,则参数 object
必须是一个可调用的对象(如函数),此时,iter()
创建了一个迭代器对象,每次调用这个迭代器对象的__next__()
方法时,都会调用 object
。当返回值等于sentinel
时,迭代停止,sentinel
不会被返回。
异常
Python内置的异常类型:
折叠代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning
多线程
multiprocessing.pool.ThreadPool
可以方便地开启多线程。
inspect
库
Python真的是啥都能干啊。
使某个函数的签名与另一个函数一致:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from inspect import signaturedef copy_signature (source_fct ): def copy (target_fct ): target_fct.__signature__ = signature(source_fct) return target_fct return copy def test (a, /, b, c=1 , *, d, e ): print (a, b, c, d, e) @copy_signature(test ) def forwards (*args, **kwds ): signature(forwards).bind(*args, **kwds) print ('Just wrapping' ) test(*args, **kwds)
语序
1 2 arr = [(i, j) for i in range (3 ) for j in range (3 )] >>> [(0 , 0 ), (0 , 1 ), (0 , 2 ), (1 , 0 ), (1 , 1 ), (1 , 2 ), (2 , 0 ), (2 , 1 ), (2 , 2 )]
注意它的输出顺序。这说明for循环是从左到右进行的。
杂项
Python的import是共用变量的。
Python也是有箭头函数的!
命名规范
前置单下划线 _var
:命名约定,用来表示该名称仅在内部使用。一般对Python解释器没有特殊含义(通配符导入除外),只能作为对程序员的提示。
后置单下划线 var_
:命名约定,用于避免与Python关键字发生命名冲突。
前置双下划线 __var
:在类环境中使用时会触发名称改写,对Python解释器有特殊含义。
前后双下划线 __var__
:表示由Python语言定义的特殊方法。在自定义的属性中要避免使用这种命名方式。
单下划线 _
:用作临时或无意义变量的名称。此外还能表示Python REPL会话中上一个表达式的结果。
实用库
hashlib
这是官方库。
1 2 3 4 5 import hashlibmd5 = hashlib.md5() md5.update('how to use md5 in python hashlib?' .encode('utf-8' )) print (md5.hexdigest())
可以把较长的内容分多次update
,结果是一样的。
对于文件:
1 2 3 4 5 6 7 8 9 10 11 12 import hashlibdef md5 (fname ): with open (fname, "rb" ) as f: return hashlib.md5(f.read()).hexdigest() def md5 (fname ): md5 = hashlib.md5() with open (fname, "rb" ) as f: for chunk in iter (lambda : f.read(4096 ), b"" ): md5.update(chunk) return md5.hexdigest()
(发现自己不会iter()
,于是滚去学了)
pathlib
补充一些:
列出路径下的对象:p.iterdir()
获取绝对路径:p.resolve()
相对其他某个路径的结果:p.relative_to('')
zipfile
1 2 3 4 5 6 7 8 9 10 11 import zipfilezip_file = zipfile.ZipFile(zip_file_name) for file in zip_file.namelist(): zip_file.extract(file, '.' ) new_zip_file = zipfile.ZipFile(new_zip_file_name) for file in p.iterdir(): new_zip_file.write(file)
pprint
pprint
模块提供了“美化打印”任意 Python 数据结构的功能。
Pytorch
Pytorch实现的BatchNorm好像是带梯度的…
3.10新特性
上下文管理器支持在括号里写多个了。
类型注释可以用|
来表示多种可能,而不是臃肿的Union
。
match-case
结构化模式匹配
可以使用通配符,可以提取变量,可以匹配tuple, dict, list
,甚至是对象的属性!