前言
一些小知识
正文
format格式化的转义
将 abc_{i}_{j}
转换为 abc_1_2
展开代码
s = 'abc_{i}_{j}'
n = {'i': 1, 'j': 2}
print(s.format_map(n))
print(s.format(**n))
for k, v in n.items():
s = s.replace(f'{{{k}}}', f'{v}')
print(s)
命令行
命令行的使用:python filename.py -y 2021 -m 04
展开代码
import getopt
import sys
year = 2021
month = 1
opts, args = getopt.getopt(
sys.argv[1:],
"y:m:",
["year=", "month="],
)
opts = dict(opts)
if opts.get("-y"):
year = int(opts.get("-y"))
elif opts.get("--year"):
year = int(opts.get("--year"))
if opts.get("-m"):
month = int(opts.get("-m"))
elif opts.get("--month"):
month = int(opts.get("--month"))
print(year, month)
字典转换为对象
展开代码
class Obj(dict):
def __init__(self, name):
self.__name = name if name is not None else 'obj'
super().__init__()
def __repr__(self):
return self.__name
def __getitem__(self, key):
return self.__dict__.get(key)
def get(self, attr, default=None):
return self.__dict__.get(attr, default)
def dict_to_obj(data: dict, name: str = 'obj'):
obj = Obj(name)
for k, v in data.items():
setattr(obj, k, v)
return obj
data = {'a': 1, 'b': 2}
test_obj = dict_to_obj(data)
对象方法装饰器
将对象的方法变为装饰器,如:flask框架的路由注册
展开代码
from typing import Callable
class Demo:
def __init__(self, name=None):
self.name = name if name is not None else 'Demo'
def __demo(self, method: str):
def decorator(func):
print(f'{self.name} [{method}]')
return func
return decorator
def get(self) -> Callable:
return self.__demo('GET')
def post(self) -> Callable:
return self.__demo('POST')
demo = Demo()
@demo.get()
def test_get(data='d'):
print(data)
pass
二维数组的排列组合
展开代码
import itertools
data = [
['1-1', '1-2', '1-3'],
['2-1', '2-2', '2-3', '2-4'],
['3-1', '3-2'],
]
result = list(itertools.product(*data))
print(result)
字母迭代
展开代码
letters = [chr(x) for x in range(ord('A'), ord('Z') + 1)]
print(letters)
pass与...
pass
: 当作一个无意义的代码块,如:定义函数时,还没想好函数体的内容,可使用 pass 代替...
: 代码省略。是一个 Ellipsis 对象,单例
展开代码
def func():
pass
# 类型提示中的省略
def func(args: ...):
print(args)
# 函数内部的省略,相当于pass
def func():
...
# numpy中的索引省略
import numpy as np
arr = np.random.random((2, 2, 2))
print(arr)
print(arr[..., 0, 0]) # 放在前面,省略前面的索引;放在后面,省略后面的索引
函数形参中的 *
用于分隔位置参数和关键字参数。
它表示从此处开始,后面的参数只能通过关键字方式传递,不能通过位置方式传递。具体来说,当在函数定义中使用 * 时,它之前的参数是位置参数(可以按位置传递值),而之后的参数是关键字参数(必须使用关键字传递值)。
展开代码
# 函数定义中的 * 表示从此处开始后面的参数只能使用关键字传递
def demo(a, *, b, c):
print("a:", a)
print("b:", b)
print("c:", c)
# 调用函数时,必须按照位置参数和关键字参数的方式传递
demo(1, b=2, c=3)