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)
posted @ 2023-07-21 12:01  F___Q  阅读(43)  评论(0)    收藏  举报