0%

Python学习笔记-2

之前暑假学习的笔记在这里,因为过于久远,所以俺再开一篇。这一篇可能就比较琐碎了,并且会加上其他包的内容。

语言

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 signature

# create a decorator to copy signatures
def copy_signature(source_fct):
def copy(target_fct):
target_fct.__signature__ = signature(source_fct)
return target_fct
return copy

# create a short test function as example
def test(a, /, b, c=1, *, d, e):
print(a, b, c, d, e)

# now wrap it
@copy_signature(test)
def forwards(*args, **kwds):
# assert that arguments are correct
signature(forwards).bind(*args, **kwds)
# now do potentially complicated and obscuring tasks
print('Just wrapping')
test(*args, **kwds)
# 使用函数签名的bind的方法,可以检查函数参数是否匹配签名。

语序

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 hashlib

md5 = hashlib.md5() # sha1 = hashlib.sha1()
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 hashlib
# memory inefficient
def md5(fname):
with open(fname, "rb") as f:
return hashlib.md5(f.read()).hexdigest()
# memory efficient
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

下载

image-20210824154148584

补充一些:

  • 列出路径下的对象:p.iterdir()
  • 获取绝对路径:p.resolve()
  • 相对其他某个路径的结果:p.relative_to('')

zipfile

1
2
3
4
5
6
7
8
9
10
11
import zipfile

# unzip
zip_file = zipfile.ZipFile(zip_file_name)
for file in zip_file.namelist():
zip_file.extract(file, '.')

# zip
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,甚至是对象的属性!