python小知识
前言
一些小知识
正文
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)
可变对象做关键字参数
点击查看代码
from typing import List
# def test(args, result: List = []):
# result.append(args)
# print(result)
def test(args, result: List = None):
result = [] if result is None else result
result.append(args)
print(result)
test(1)
test(2)
test(3)
重载变量
从系统环境中重载当前文件中定义的变量
点击查看代码
import os
VALUE = ''
for var, var_value in locals().copy().items():
# 变量命名的要求
if var.startswith('_') or callable(var_value) or not var[0].isupper():
continue
locals()[var] = os.getenv(var, var_value)
遇上方知有

浙公网安备 33010602011771号