Python方法链调用的优雅之处

从流式API到设计模式:链式调用的优雅实现与实战剖析 本文深入剖析链式调用的实现原理与设计模式应用,通过Java、Python等多语言示例展示如何优雅构建流式API。文章详解方法链技术核心,结合Builder模式、责任链模式等经典设计模式,提供降低认知负荷、提升代码可读性的实战方案,并给出调试优化策略与现代框架中的典范应用。 阅读详情

前言

在日常的Python开发中,我们经常会遇到需要对一个对象进行一系列的操作,然后得到最终结果的情况。

而方法链调用(method chaining)就是一种十分优雅的解决方案。

例如:字符串的各种方法

print("公众号:海哥python".strip().lower().title())  # 公众号:海哥Python

方法链接是一种编程风格,其中多个方法调用按顺序发生。它消除了在每个中间步骤分配变量的痛苦,因为每个调用都对同一对象执行操作,然后将该对象返回到下一个调用。

  • 它可以减少整个代码的长度,因为不必创建无数变量。
  • 由于方法是按顺序调用的,因此可以提高代码的可读性。

怎么实现

其实实现起来简单,就像这样,唱着,跳着就实现了:

def hai_ge(arg,*args, **kwargs):
    print(arg)
    return hai_ge

hai_ge("唱")("跳")("rap")("篮球")

# 唱
# 跳
# rap
# 篮球

开个玩笑,这种方式比较少用,下面介绍常见用法。


原理:方法链调用的实现依赖于Python中函数的返回值。当一个函数需要返回一个对象时,我们可以选择返回对象本身,也可以返回对象的某个属性或方法的结果,从而实现链式调用。

这种方式使得我们可以在一个对象上一连串地调用多个方法,而不需要每次都创建中间变量来保存中间结果,大大简化了代码逻辑。

普通方式实现方法链调用

from functools import reduce


class DataProcessor:
    def __init__(self, data):
        self.data = data

    def filter(self, condition):
        self.data = [x for x in self.data if condition(x)]
        return self  # 返回自身对象,实现链式调用

    def map(self, func):
        self.data = [func(x) for x in self.data]
        return self  # 返回自身对象,实现链式调用

    def reduce(self, func, initial):
        return reduce(func, self.data, initial)


# 使用方法链调用
result = DataProcessor([1, 2, 1, 6, 8, 3, 3]).filter(lambda x: x > 0).map(lambda x: x * 2).reduce(lambda x, y: x + y, 0)
# 等价于
# dp = DataProcessor([1, 2, 1, 6, 8, 3, 3])
# dp.filter(lambda x: x > 0)
# dp.map(lambda x: x * 2)
# result = dp.reduce(lambda x, y: x + y, 0)

print(result)  # 48

上面的代码演示了一个简单的数据处理类,通过方法链调用实现了数据的筛选、转换和聚合操作。这样的代码更加直观,清晰地展现了数据处理的流程。同时,我们也可以随时在方法链中加入新的操作,而不需要改动其他部分的代码,极大地提高了代码的灵活性和可维护性。

基于装饰器方式实现方法链

from functools import reduce

def chainable_method(method):
    def wrapper(self, *args, **kwargs):
        method(self, *args, **kwargs)
        return self
    return wrapper

class DataProcessor:
    def __init__(self, data):
        self.data = data
        self._result = None

    @property
    def result(self):
        return self._result

    @chainable_method
    def filter(self, condition):
        self.data = [x for x in self.data if condition(x)]

    @chainable_method
    def map(self, func):
        self.data = [func(x) for x in self.data]

    def reduce(self, func, initial):
        self._result = reduce(func, self.data, initial)
        return self._result

# 使用方法链调用
dp = DataProcessor([1, 2, 1, 6, 8, 3, 3])
result = dp.filter(lambda x: x > 0).map(lambda x: x * 2).reduce(lambda x, y: x + y, 0)
print(result)  # 48

# 使用属性获取结果
print(dp.result)  # 48

在上面的代码中,chainable_method装饰器用于将类方法转换为可链式调用的方法。它将被修饰的方法包装在一个函数中,该函数调用原始方法并返回self,以便可以连续调用其他方法。

在实际应用中,方法链调用可以极大地简化代码(一个变量名想半天)。例如,在数据处理的过程中,我们可能需要进行一系列的筛选、转换和聚合操作,通过方法链调用,可以非常直观地表达出数据的处理流程,而且可以方便地进行调试和修改。

应用场景

链式调用在Python中通常用于构建流畅的API接口或简化操作流程。

numpy中的链式调用

import numpy as np

chained_numpy = np.arange(1, 9, 2).reshape(2, 2).clip(3, 6)
print(chained_numpy)

"""
[[3 3] 
 [5 6]]
"""

在此示例中,不同的NumPy方法被链接起来创建一个2x2矩阵。

  • .arange()方法:创建一个从1到9的矩阵,步长为2;
  • .reshape()方法:将矩阵调整为2x2配置;
  • .clip()方法:用于将矩阵中的最小元素设置为9,最大元素设置为25。

pandas中的链式调用示例

import pandas as pd

# 创建一个 DataFrame
data = {'A': [1, 2, 3, 4, 5],
        'B': [10, 20, 30, 40, 50],
        'C': [100, 200, 300, 400, 500]}
df = pd.DataFrame(data)

print(df)

# 链式调用示例:选择列、过滤数据、计算平均值
result = (df[['A', 'B']]            # 选择列 A 和 B
          .query('A > 2')            # 过滤 A 列大于 2 的行
          .apply(lambda x: x * 2)    # 对选定的行进行元素乘以2的操作
          .mean())                   # 计算均值
print("\n")
print(result)

结果如下:

自定义数据处理流水线

方法链在对集合或数据结构执行操作(例如过滤、映射和减少数据)时非常有用。

假设我们现在有个txt文件,需要对其中的数据进行清洗转换: data --> NEW DATA。

# data.txt

data1
data2
data3

实现代码示例:

# 假设这些函数是用于数据处理的辅助函数
def load_data_from_file(file_path):
    with open(file_path, "r") as file:
        return [line.strip() for line in file]

def clean_data(data):
    return [item.upper() for item in data]

def transform_data(data):
    return [item.replace("DATA", "NEW DATA") for item in data]

def save_results_to_file(data, file_path):
    with open(file_path, "w") as file:
        for item in data:
            file.write(f"{item}\n")

class DataPipeline:
    def __init__(self):
        self.data = None

    def load_data(self, file_path):
        self.data = load_data_from_file(file_path)
        return self

    def clean_data(self):
        if self.data is not None:
            self.data = clean_data(self.data)
        return self

    def transform_data(self):
        if self.data is not None:
            self.data = transform_data(self.data)
        return self

    def save_results(self, file_path):
        if self.data is not None:
            save_results_to_file(self.data, file_path)
        return self

# 测试数据
file_path = "data.txt"

# 测试代码
pipeline = DataPipeline()
pipeline.load_data(file_path).clean_data().transform_data().save_results("results.txt")

结果为:

# results.txt

NEW DATA1
NEW DATA2
NEW DATA3

Pillow中的方法链调用

你是否想顺滑地使用当下最火热的大模型 ChatGPT-4、Midjourney V6、Dall·E 3、文心一言 4.0 和 Gemini Pro?

想要破除上网魔法?想要降低使用成本?想在同一个平台上使用多个大语言模型?我推荐以下这个好用的工具,它都能满足:

这个服务刚刚推出,推广期间优惠价 298,即将涨价到 498。扫描上方二维码,即可免费试用,大家觉得效果满意后,再考虑付费。

现在的需求是要将其转换成灰度图,旋转,应用高斯模糊。

from PIL import Image, ImageFilter

Image.open('Hulu-AI.png').convert('L').rotate(180).filter(ImageFilter.GaussianBlur()).save('公众号:海哥python2.jpg', quality=95)

# 等价于
# im = Image.open('Hulu-AI.png')
# im = im.convert('L')
# im = im.rotate(180)
# im = im.filter(ImageFilter.GaussianBlur())
# im.save('公众号:海哥python.jpg', quality=95)

处理后的图像如下所示:

配置工具(Configuration Tools)

方法链用于在对象上设置各种配置选项,其中每个方法调用都会修改特定设置。

class Config:
    def __init__(self):
        self.options = {}

    def set_option(self, key, value):
        self.options[key] = value
        return self  # 返回 self,以支持链式调用

    def get_option(self, key):
        return self.options.get(key, None)


# 使用示例
config = Config()
config.set_option('debug', True).set_option('log_level', 'info').set_option('max_connections', 10)

print(config.get_option('debug'))  # 输出: True
print(config.get_option('log_level'))  # 输出: info
print(config.get_option('max_connections'))  # 输出: 10

在这个示例中Config类代表了一个配置对象,set_option方法用于设置配置选项,同时返回self以支持链式调用。这样,可以连续调用多个set_option方法来设置多个配置选项,使代码更加简洁和易读。

复杂对象的构建

构建器模式是一种设计模式,它可以提高代码的灵活性、可读性和可维护性,特别是当需要创建具有许多属性的复杂对象时。

class Product:
    def __init__(self, name, price, category):
        self.name = name
        self.price = price
        self.category = category

    def __repr__(self):
        return f"Product(name={self.name}, price={self.price}, category={self.category})"


class ProductBuilder:
    def __init__(self):
        self.name = None
        self.price = None
        self.category = None

    def set_name(self, name):
        self.name = name
        return self

    def set_price(self, price):
        self.price = price
        return self

    def set_category(self, category):
        self.category = category
        return self

    def build(self):
        if not all([self.name, self.price, self.category]):
            raise ValueError("Incomplete product information.")
        return Product(self.name, self.price, self.category)


# 测试数据
product_data = {
    "name": "Product1",
    "price": 100,
    "category": "Electronics"
}

# 测试代码
builder = ProductBuilder()
product = builder.set_name(product_data["name"]).set_price(product_data["price"]).set_category(product_data["category"]).build()
print(product)  # Product(name=Product1, price=100, category=Electronics)

这段代码定义了Product类来表示产品,以及ProductBuilder 类来构建产品对象。然后,使用给定的产品数据,我们创建了一个产品构建器并构建了一个产品对象,并将其打印出来。

简易计算器

class Calculator:
    def __init__(self):
        self.result = None

    def operate(self, operator, value):
        if self.result is None:
            self.result = value
        else:
            if operator == '+':
                self.result += value
            elif operator == '-':
                self.result -= value
            elif operator == '*':
                self.result *= value
            elif operator == '/':
                self.result /= value
        return self

    def add(self, value):
        return self.operate('+', value)

    def sub(self, value):
        return self.operate('-', value)

    def mul(self, value):
        return self.operate('*', value)

    def div(self, value):
        return self.operate('/', value)

    @property
    def get_result(self):
        return self.result


# 创建 Calculator 实例并使用链式调用
chain_obj = Calculator().add(4).sub(2).mul(6).div(4).get_result
print(chain_obj)  # 输出结果为: 3.0

查询数据库

方法链通常在查询生成器或对象关系映射(ORM)库中用于构造复杂的数据库查询,这里以django自带的ORM为例。

from django.db import models

# 创建学生表
class Student(models.Model):
    name = models.CharField(max_length=32, verbose_name='名字')
    age = models.IntegerField(verbose_name='年龄')
    height = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='身高', null=True)  # 长度为5,两位小数
    birthday = models.DateField(verbose_name='生日')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'student'
        verbose_name = '学生'
        verbose_name_plural = '学生'  # 显示的是后台模块的名字

# 添加数据
student = Student(name='海哥python', age=3, birthday='2023-2-16')
student.save()

通过ORM链式调用:

# 查询数据库所有数据
all_students = Student.objects.all()
print(all_students)

# 筛选条件
filtered_students = Student.objects.filter(birthday='2023-2-16')
print(filtered_students)

# 修改id为1的人的名字为[公众号:海哥python]
Student.objects.filter(id=1).update(name='公众号:海哥python')

自定义一个简易ORM(玩具)

现在,其实我们可以自己来实现简单的玩具版ORM~

class User:
    def __init__(self, name, age, status):
        self.name = name
        self.age = age
        self.status = status

    def __repr__(self):
        return f"User(name={self.name}, age={self.age}, status={self.status})"

class QueryBuilder:
    def __init__(self, model):
        self.model = model
        self.query = []

    def filter(self, **kwargs):
        self.query.append(kwargs)
        return self

    def exclude(self, **kwargs):
        self.query.append({'NOT_' + key: value for key, value in kwargs.items()})
        return self

    def order_by(self, *args):
        self.query.append(('ORDER_BY', args))
        return self

    def values_list(self, *args):
        self.query.append(('VALUES_LIST', args))
        return self

    def execute(self, dataset):
        filtered_data = dataset
        for condition in self.query:
            if isinstance(condition, dict):
                filtered_data = [item for item in filtered_data if all(getattr(item, key) == value for key, value in condition.items())]
            elif condition[0] == 'ORDER_BY':
                filtered_data.sort(key=lambda x: getattr(x, condition[1][0]))
            elif condition[0] == 'VALUES_LIST':
                # filtered_data = [[getattr(item, field) for field in condition[1]] for item in filtered_data]
                filtered_data = ([getattr(item, field) for field in condition[1]] for item in filtered_data)
        return filtered_data

# 测试数据
users = [
    User("Alice", 25, "active"),
    User("Bob", 30, "inactive"),
    User("Charlie", 25, "active"),
    User("David", 35, "inactive"),
]

# 测试代码
query_builder = QueryBuilder(User)
result = query_builder.filter(age=25).filter(name="Charlie").values_list("age", "name").execute(users)
#result = query_builder.filter(age=25, name="Charlie").filter().values_list("age", "name").execute(users)
print(f"查询参数列表为:{query_builder.query}", "\n")
for user in result:
    print(f"查询到用户:{user}")

输出结果为:

我们将查询的方法链转换为相应的查询条件,并在最终执行查询时将其应用于模拟的数据集合。

函数式编程与方法链

方法链和函数式编程中的链式调用类似,它们都是一种通过在对象或函数之间连续调用方法或函数来构建复杂操作的技术。两者的主要区别在于:

  1. 方法链:通常用于面向对象编程中,其中对象具有一系列方法,每个方法都返回对象本身或者另一个相关对象。通过在对象上连续调用方法,可以实现一系列操作,最终得到期望的结果。方法链通常与面向对象编程语言中的流畅接口(fluent interface)一起使用。

  2. 函数式编程中的链式调用:则是通过在函数之间连续调用函数来实现类似的目的。在函数式编程中,函数是一等公民,可以作为参数传递给其他函数,也可以作为返回值返回。通过在函数之间连续调用函数,可以构建数据处理流水线,实现复杂的数据转换和过滤操作。

举个栗子

有下面这样一段函数式编程的代码:

result = list(
    map(lambda x: x + 1,
        filter(lambda x: x > 5,
               map(lambda x: x * 2, range(10))))
)
print("函数式编程链式调用结果:", result)  # 函数式编程链式调用结果: [7, 9, 11, 13, 15, 17, 19]

哈哈,小朋友,你是不是有很多问号???

咋一看感觉不是很直观呢。

既然我们学会了方法链,那让我们来改写下,看看有啥区别!!

class ChainIterator:
    def __init__(self, data):
        self.data = data

    def map(self, func):
        self.data = map(func, self.data)
        return self

    def filter(self, func):
        self.data = filter(func, self.data)
        return self

    @property
    def to_list(self):
        return list(self.data)


result = (
    ChainIterator(range(10))
    .map(lambda x: x * 2)
    .filter(lambda x: x > 5)
    .map(lambda x: x + 1)
    .to_list
)
print("方法链调用结果:", result)  #  法链调用结果: [7, 9, 11, 13, 15, 17, 19]

虽然两者在概念上相似,但在实现方式和语义上有所不同。方法链通常与面向对象编程和流畅接口一起使用,而函数式编程中的链式调用则更强调函数之间的组合和转换。

小彩蛋:“属性链”

我们“精通”了方法链,我们本能的想到还有“属性链”。

来玩一下…

没错,使用python中的magic method实现属性链。

抖机灵玩法一

class Chain:
    def __init__(self):
        self._value = 0

    def __getitem__(self, item):
        self._value += item
        return self

    def __call__(self, *args, **kwargs):
        return self


c2 = Chain()
c2[1][3][2][4][5][6]
print(c2._value)

没难度啊~

抖机灵玩法二

class Chain(object):
    def __init__(self, path=''):
        self._path=path
 
    def __getattr__(self, path):
        print(f"do __getattr__: {path}")
        return Chain( '%s/%s' %(self._path, path))
 
    def __str__(self):
        return self._path
 
    def __call__(self, user):
        print(f"do __call__: {user}")
        return Chain('%s/%s' %(self._path, user))
 
    __repr__=__str__


print('GET',Chain().users('user').u1111)

咱还是学过魔术方法的~

组合拳

class Chain:
    def __init__(self):
        self._value = 0

    def __add__(self, other):
        self._value += other
        return self
    
    def add(self, other):
        self._value += other
        return self

    def __getitem__(self, item):  # []
        print(f"do __getitem__: {item}")
        if isinstance(item, int):
            self._value += item
        elif isinstance(item, slice):
            if item == slice(None, None, None):  # 空切片处理
                pass  # 空切片不执行任何操作
            else:
                start = item.start if item.start is not None else 0
                stop = item.stop if item.stop is not None else 0
                step = item.step if item.step is not None else 1
                self._value += sum(range(start, stop, step))
        elif isinstance(item, list):
            self._value += sum(item)

        return self
    
    def __getattr__(self, item):
        print(f"do __getattr__: {item}")
        return self

    def __call__(self, *args, **kwargs):
        for arg in args:
            if isinstance(arg, int):
                self._value += arg
            elif isinstance(arg, list):
                self._value += sum(arg)
        return self

    def __iter__(self):
        return iter(self._value)

    def __repr__(self):
        return str(self._value)


c2 = Chain()
c2[:][1:4][2][4][5][6].a.b([1, 2, 3]).c[3].d[:][:]
print(c2._value)

啊,这是什么黑魔法~

提高了代码的不可读性哈哈~~

有了这些黑魔法,可以更好的写防御性代码啦。这样你的不可替代性增强了,可以更好的堆ss代码啦!!

小结

方法链调用作为一种优雅的编程风格,能够很好地支持函数式编程,简化代码,提高可读性。在数据处理、函数式编程、查询数据库、配置设置、构建流畅的 API等场景下都有着广泛的应用。

在使用方法链调用时,也需要注意避免链式调用过长、逻辑不清晰等问题。适当地使用方法链调用,能够提高代码的可读性和可维护性,但过度使用可能会使代码难以理解。

因此,在实际的编程工作中,我们应当充分发挥方法链调用的优势,以提高代码质量和开发效率。

希望本文的介绍能够帮助大家更好地理解方法链调用的概念和价值,进一步提升Python编程的技巧和水平。

最后

今天的分享就到这里。

如果觉得不错,点赞,在看,关注安排起来吧。

参考

https://nikhilakki.in/understanding-method-chaining-in-python
https://www.tutorialspoint.com/Explain-Python-class-method-chaining
https://github.com/mCodingLLC/VideosSampleCode/blob/master/videos/095_method_chaining_and_self/method_chaining_and_self.py

Python链式调用的实现方法 在上述示例中,我们创建了一个名为Order的类,它具有添加商品(add_item)、移除商品(remove_item)、应用折扣(apply_discount)和获取总价格(get_total_price)的方法。使用示例中,我们首先创建了一个API对象api,并通过链式调用的方式依次调用了set_url、set_header、set_params、send_request、parse_response和get_result方法。首先,我们需要创建一个类,并在类中定义需要链式调用的方法。 阅读详情

相关推荐

Python中方法链的使用方法

方法链(method chaining)是面向对象的编程语言中的一种常见语法,可以让开发者在只引用对象一次的情况下,对同一个对象进行多次方法调用。举个例子: 假设我们有一个Foo类,其中包含有两个方法——bar和baz。 我们创建一个Foo类的实例: foo = Foo() 如果不使用方法链,要想连续调用对象foo的bar和baz方法的话,我们得这样做: foo.bar() # Call method bar() on object foo. foo.baz() # Call method baz() on object foo. 如果使用方法链的话,我们就能这样实现: foo.bar()

Python链式调用:优雅的编程风格

链式调用是一种通过连续调用对象的方法,使得代码可读性更强、结构更清晰的编程风格。在链式调用中,每个方法的返回值通常是一个包含了其他方法的对象,这样就可以在单一的表达式中完成多个操作。Python链式调用是一种优雅的编程风格,通过连续调用对象的方法,使得代码结构更清晰、可读性更强。本文通过构建链式调用的类、实际应用场景和数据处理示例,详细介绍了链式调用的基本概念、原理以及在实际项目中的应用。链式调用可以用于构建流畅的API、优雅的配置对象以及简化数据处理操作,是Python中一个强大且常用的编程技巧。

涛哥聊Python 1660

CVPR2021 CenterPoint源码解读:从VoxelNet到两阶段优化的完整实现细节

本文深度解析了CVPR 2021 CenterPoint模型的完整实现细节,从VoxelNet体素化、稀疏卷积Backbone,到基于中心点的检测头与两阶段精修机制。文章提供了从环境搭建、数据预处理到核心代码模块(如热力图生成、关键点特征提取与MLP Refiner)的实战指南,并分享了训练策略、多任务损失调优及可视化调试等关键工程实践,助力开发者深入理解并复现这一高效的3D目标检测框架。

linux的博客 468

方法重写

/* 方法重写:子类中出现了和父类中方法声明一模一样的方法。 方法重载: 本类中出现的方法名一样,参数列表不同的方法。与返回值无关。 子类对象调用方法的时候: 先找子类本身,再找父类。 方法重写的应用: 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。 这样,即沿袭了父类的功能,又定义了子类特有的内容。 */ class Pho

dwq_5678的博客 350

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟共地导致的.是一个宏,实际上是指向的一个内存地址, 这个内存地址是FSMC指定的地址. 使用FSMC接口, 可免于控制引脚, 直接读取某个地址即可, FSMC会自动产生操作时序. 具体请见FSMC相关知识.

走错路的程序员 5495

基于DO-178C/331的飞控软件研发环境的研究

本研究提出了一套基于DO-178C/331标准的飞控系统软件开发和验证框架。通过优化模型库的设计、代码生成配置和测试验证流程,显著提升了飞控系统软件的开发效率和安全性。未来的研究可以进一步扩展模型库的功能,以适应更复杂的飞控系统需求。

qq_41854911的博客 561

Python:方法的链式调用

在Python编程中,方法的链式调用是一种简洁且优雅的编程风格,它允许你在一行代码中连续调用多个方法,这种编程模式在简化代码、提升可读性和减少代码冗余方面发挥了重要作用。链式调用的原理是通过在每个方法结束时返回对象自身(通常命名为self),从而使后续的方法能够继续作用在同一个对象上。本文将深入探讨Python中链式调用的基本概念、优势、实现方式,以及常见的使用场景。

保持终身学习的能力,温故而知新 1509

科研级YOLOv8 Neck革新:HS-FPN模块赋能,让特征融合更高效且参数量直降100W的实战指南

在文件夹下新建HS_FPN.py,将上述和HS_FPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

FJN110的博客 150

Java方法完整调用链生成工具

1. 前言 在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的。 IDEA提供了显示调用指定Java方法向上的完整调用链的功能,可以通过“Navigate -> Call Hierarchy”菜单(快捷键:Ctrl+Alt+H)使用;Eclipse也提供了相同的功能。但以上都需要针对每个方法进行手工处理,拷贝出来的文本无法展示调用层级,且不支持生成指定Java方法向下的完整调用链。 以下实现了一个工具,能够批量生成指定Java方法向下的完整调用链,对于关注的Java方法,能够生成其

adrninistrat0r的博客 3万+

汇川Easy系列斜坡函数功能块(支持状态输出)

IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。

RXXW_Dor的博客 455

单光子雪崩二极管(SPAD):原理、极高增益机制与微光探测解析

本文系统阐述了单光子雪崩二极管(SPAD)的工作原理及其在弱光探测中的应用。SPAD通过工作在盖革模式下的碰撞离化效应实现单光子探测,其核心机理包括:1)采用p+-n-n+结构实现高电场分布;2)通过雪崩倍增过程获得10^6量级增益;3)采用主动/被动淬灭机制实现快速恢复。文章详细分析了SPAD的关键性能参数(如光子探测效率、暗计数率等)及其在量子通信、激光雷达等领域的应用优势,揭示了该器件在极微弱光信号探测中的独特价值。

Fun_LiDAR的博客 1040

告别冗长代码:Black如何让Python方法链优雅换行与缩进

你是否也曾面对这样的Python代码:一长串方法调用挤在同一行,如同贪吃蛇般蜿蜒到屏幕外?或者手动换行后,团队成员因缩进风格不一致争论不休?作为一款"毫不妥协的Python代码格式化工具"(The uncompromising Python code formatter),Black通过自动化处理方法链(Method Chaining)的换行与缩进,彻底终结了这类格式之争。本文将深入解析Black...

gitblog_00752的博客 722

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

Indigo Furry mix 是一个混合模型,出的图具有雄性人类的体型和野兽的形态。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者indigowing文件名称文件大小1.99GB。

水滴的博客 1829

python public_跟黄哥学python序列文章之python方法链(method chaining)

写这篇文章来由,有朋友说下面这样的代码看不懂。choice = input("please input:n").strip()[0].lower()很多对于有经验的程序员来说,这些都不是事,但对于初学者来说,看到这样的语法头有点大。这个其实是面向对象中方法链的概念。请看维基百科上Method chaining的定义 Method chaining, also known as named p...

weixin_39926588的博客 134

YOLOv26全流程实战手册:从yaml配置拆解到训练推理参数调优(附虚拟环境搭建)

以“车辆、行人、小型物体”3类数据集为例,修改# 1. 修改类别数nc: 3# 2. 调整锚框(适配小目标)anchors:- [12,16, 16,24, 33,23] # 增加小锚框# 3. 轻量化调整(边缘部署)depth_multiple: 0.25 # 降低深度系数width_multiple: 0.20 # 降低宽度系数# 其余Backbone/Head结构不变yaml配置:核心是调整nc(类别数)、(轻量化)、anchors(适配目标尺度);虚拟环境。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 876

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

PyJanitor项目:Python数据清洗的优雅解决方案

PyJanitor是一个Python数据清洗工具库,它最初是R语言中janitor包的Python实现,但现在已经发展成为一个具有独特设计理念的数据处理工具。该项目为pandas用户提供了一套清晰、直观的API,特别强调通过方法链(method chaining)的方式来进行数据预处理。 ## 核心设计理念 PyJanitor的设计哲学主要体现在两个方面: 1. **动词化API**:所有方...

gitblog_00691的博客 482

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python链式调用顺序_Python实现类似jQuery使用中的链式调用的示例

关于jQuery的链式调用真正有意义的链式调用也就是方法链(method chaining)。方法链这个词是有的,而且使用的很广泛。其实很多人口中的“链式调用”实际上就是指方法链。但是“链式调用”这个词语还可以描述函数调用链,所以让它自身的存在价值变得难以理解。我总结的方法链的价值有这么几个:1. 让调用过程更接近自然语言。2. 把原本参数列表复杂的方法化作多个参数列表简单的方法来使用。3. 减少...

weixin_39771301的博客 164

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

方法调用的深度探讨:从基础到高级的程序设计

方法调用是现代编程中不可或缺的一部分,从简单的函数调用到复杂的对象方法,每一种方式都有其独特的应用场景和最佳实践。在程序设计中,方法调用是实现代码重用和模块化的核心机制之一。本文将探讨不同类的方法调用,包括基本的函数调用、类方法、实例方法及静态方法的调用,并提供一些最佳实践。静态方法是与类的实例无关的方法,通常用作工具函数,使用@staticmethod装饰器定义。实例方法是与对象实例相关联的方法,它们可以访问实例的属性。方法链是一种流行的设计模式,通过将多个方法链接在一起,以实现更简洁的代码。

m0_67674759的博客 306

【pandas教程】方法链简介

pandas中强大且鲜为人知的方法链assign

檐前潜心学种瓜 516

Python冷门神器:Icecream - 让调试输出变得优雅而强大

Icecream:让Python调试更优雅的利器 传统print调试存在输出混乱、清理麻烦等问题,而Icecream库提供了更优雅的解决方案。它能自动显示变量名和值、调用位置等上下文信息,支持表达式评估和自定义输出格式,使调试过程更加直观高效。安装简单(pip install icecream),基础用法只需替换print为ic()即可。该工具特别适合算法调试、Web开发和数据分析等场景,相比print和logging更简洁实用。通过配置前缀、输出函数等高级功能,可以灵活适应不同项目需求,显著提升调试效率和

qq_65622609的博客 558

每天都在用的20个Python技巧,让你从此告别平庸!

今天我将向大家分享日常工作中常用的20个Python技巧,小巧而优雅,让你的代码更加Pythonic

xyh2004的博客 2025

Python中的链式调用:提高代码流畅性与可读性

链式调用是现代编程语言中一种常见的编程模式,它使得代码更加流畅和简洁,能够提高代码的可读性和可维护性。Python,作为一门注重易读性的语言,支持链式调用的方式,让开发者能够以一种简洁且优雅的方式组织代码,减少冗余,提高效率。本文将深入探讨如何通过链式调用设计流畅、简洁的API,结合具体示例来展示链式调用的实现技巧。我们将从链式调用的基本概念、优势、应用场景,到具体的实现方式,逐步介绍如何在Python中使用链式调用构建高效、易于维护的代码。

一个被知识诅咒的人 981

Pytest:优雅高效的Python测试框架

Pytest已成为Python测试领域的事实标准,其简洁语法和强大功能显著提升测试效率。核心优势包括:1)零配置设计和自然表达式断言减少40%样板代码;2)智能容错机制缩短35%测试周期;3)Fixture系统降低60%内存消耗;4)参数化测试使用例覆盖增长300%。2025年数据显示其在金融科技和AI测试领域覆盖率达83%,某支付平台迁移后测试时间从47分钟降至12分钟。随着量子计算发展,Pytest 7.0将引入量子态断言等创新功能,持续引领测试工具演进。掌握Pytest已成为测试工程师的核心竞争力。

2501_94436372的博客 706

Python中优雅处理深层嵌套JSON数据的库与技巧

简单项目:考虑使用dictor或原生方式中等复杂度:推荐,功能全面复杂查询:选择jmespath,特别是处理数组和条件过滤数据转换:使用glom进行声明式数据处理根据具体需求选择合适的工具,可以让你的JSON数据处理变得更加优雅和高效!

qq_56972807的博客 439

Python建造者模式详解:构建复杂对象的优雅方式

建造者模式是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。在软件工程中,当对象包含多个可选参数或需要分步骤构建时,建造者模式能显著提升代码的可维护性和可读性。该模式通过抽象建造者接口和具体建造者实现,支持灵活的对象配置,特别适用于需要创建多种风格或配置的同类对象的场景。在Python开发中,建造者模式常与流畅接口结合,通过链式调用实现优雅的API设计。实际应用中,该模式广泛用于构建复杂配置对象、分步骤初始化等场景,是Python设计模式中的重要组成部分。

weixin_29266679的博客 223

PHP8.6 新的 RFC 提案 Context Managers 优雅管理资源生命周期

PHP 8.6引入Context Managers特性,通过using关键字和ContextManager接口优雅管理资源生命周期。该特性将"设置-使用-清理"模式标准化,自动处理资源释放,避免手动管理导致的错误。核心是enterContext()和exitContext()方法,确保无论代码执行成功与否都会进行清理。适用于文件处理、数据库事务等场景,显著简化代码结构,提高开发效率和可靠性。

qq_31470439的博客 1101
上一篇: Marshmallow,一个有点甜的Python库
下一篇: Python异常处理:基础到进阶的实用指南
海哥python
博客等级 码龄9年 1487粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值