python 高级技巧 0708

python 33个高级用法技巧

  1. 使用装饰器计时函数
    装饰器是一种允许在一个函数或方法调用前后运行额外代码的结构。
import time


def timer(func):
    """
    装饰器函数,用于计算函数执行时间并打印。

    参数:
    func (function): 被装饰的函数

    返回:
    function: 包装后的函数
    """
    def wrapper(*args, **kwargs):
        """
        包装函数,计算并打印函数执行时间。

        参数:
        *args: 原函数的非关键字参数
        **kwargs: 原函数的关键字参数

        返回:
        原函数的返回值
        """
        start_time = time.time()  # 记录开始时间
        result = func(*args, **kwargs)  # 执行原函数
        end_time = time.time()  # 记录结束时间
        print(f"Function {func.__name__} took {end_time - start_time} seconds")
        return result  # 返回原函数的结果
    return wrapper


@timer
def example_function(x):
    """
    示例函数,等待 x 秒后返回 x。

    参数:
    x (int/float): 等待的秒数

    返回:
    int/float: 输入的 x 值
    """
    time.sleep(x)  # 模拟耗时操作
    return x


# 调用被装饰的函数
result = example_function(2)
print(result)
Function example_function took 2.0022225379943848 seconds
2
  • 装饰器功能:

    • 装饰器 timer 计算并打印被装饰函数的执行时间。
    • 通过 wrapper 函数实现这一功能,使得可以在不修改原函数代码的情况下,添加额外的行为。
  • 装饰器语法糖:

    • @timer 是装饰器的简洁语法,用于将装饰器应用于函数。
    • 相当于手动将函数传递给装饰器并将返回值赋给原函数名。
  • 包装函数:

    • wrapper 函数接受任意数量的参数和关键字参数,确保可以包装任何函数。
    • wrapper 中,可以在调用原函数之前或之后添加任何额外的代码,这里是计算并打印执行时间。
  1. 使用生成器
    生成器是一种特殊的迭代器,通过 yield关键字逐个生成值。

通过使用装饰器,可以在不修改原函数代码的情况下,添加额外的行为。装饰器函数接受一个函数作为参数,返回一个新的包装函数,在调用原函数之前或之后执行额外的代码。装饰器提供了一种简洁而强大的方式来扩展函数的功能,使代码更加模块化和可重用。

def countdown(n):
    """
    生成从 n 到 1 的倒计时序列。

    参数:
    n (int): 倒计时的起始值

    生成:
    int: 当前倒计时的值
    """
    while n > 0:
        yield n
        n -= 1


# 使用生成器函数 countdown 进行倒计时
for i in countdown(5):
    print(i)
5
4
3
2
1
  • 生成器函数:

    • 生成器函数使用 yield 关键字逐个生成值,与常规的返回值函数不同,它在每次生成值后暂停执行,并保留其状态以便继续生成下一个值。
    • 在生成器函数 countdown 中,while 循环每次生成当前的 n 值,然后将 n 减少 1。
  • 迭代生成器:

    • 使用 for 循环迭代生成器时,循环会自动处理生成器的状态,并在每次迭代时调用生成器函数的 __next__() 方法,获取下一个值。
    • 当生成器函数不再生成新值时,迭代结束。

通过使用生成器函数,可以逐个生成序列中的值,而不需要一次性创建整个序列。这种方法在处理大数据集或需要逐步生成数据时非常有用,能够节省内存并提高效率。生成器函数使用 yield 关键字生成值,并在每次生成后暂停执行,保留其状态以便后续继续生成。

  1. 使用命名元组
    命名元组是一种特殊的元组,允许通过名称访问元素。
from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

10 20
  1. 使用全局变量
    全局变量可以在多个函数之间共享数据。
global_var = 0

def increment():
    global global_var
    global_var += 1

increment()
print(global_var)

1
  1. 使用局部变量
    局部变量在函数内部定义,只在函数内部有效。
def example():
    local_var = 'Hello'
    print(local_var)

example()
# print(local_var)  # 这行会报错,因为local_var是局部变量

Hello
  1. 使用类方法
    类方法是一种绑定到类而不是实例的方法。
class MyClass:
    class_var = 0

    @classmethod
    def increment_class_var(cls):
        cls.class_var += 1

MyClass.increment_class_var()
print(MyClass.class_var)

1
  1. 使用静态方法
    静态方法是一种不依赖于类或实例的独立方法。
class MyClass:
    @staticmethod
    def static_method():
        print('This is a static method.')

MyClass.static_method()

This is a static method.
  1. 使用实例方法
    实例方法是绑定到实例的方法,可以访问实例的属性和方法。
class MyClass:
    def __init__(self, value):
        self.value = value

    def display_value(self):
        print(self.value)

obj = MyClass(10)
obj.display_value()

10
  1. 使用装饰器添加功能
    装饰器可以在不修改原函数代码的情况下添加功能。
def decorator(func):
    """
    装饰器函数,用于在调用被装饰函数之前打印一条消息。

    参数:
    func (function): 被装饰的函数

    返回:
    function: 包装后的函数
    """
    def wrapper(*args, **kwargs):
        """
        包装函数,打印一条消息然后调用原函数。

        参数:
        *args: 原函数的非关键字参数
        **kwargs: 原函数的关键字参数

        返回:
        原函数的返回值
        """
        print('Function is called')
        return func(*args, **kwargs)
    return wrapper


@decorator
def say_hello():
    """
    打印 'Hello' 的函数
    """
    print('Hello')


# 调用被装饰的函数
say_hello()
Function is called
Hello
  1. 使用链式函数调用
    链式函数调用允许连续调用多个方法。
class MyClass:
    def __init__(self, value):
        self.value = value

    def increment(self):
        self.value += 1
        return self

    def display_value(self):
        print(self.value)

obj = MyClass(10)
obj.increment().increment().display_value()

12
  1. 使用自定义迭代器
    自定义迭代器可以实现自己的迭代逻辑。
class MyIterator:
    def __init__(self, data):
        """
        初始化 MyIterator 对象,并设置初始数据和索引。

        参数:
        data (list): 要迭代的数据列表
        """
        self.data = data
        self.index = 0

    def __iter__(self):
        """
        返回迭代器对象本身。

        返回:
        MyIterator: 迭代器对象
        """
        return self

    def __next__(self):
        """
        返回下一个数据元素。

        返回:
        int/float: 当前索引的数据元素

        抛出:
        StopIteration: 当没有更多元素时停止迭代
        """
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration


# 创建 MyIterator 对象并迭代打印每个元素
my_iter = MyIterator([1, 2, 3])
for value in my_iter:
    print(value)
1
2
3
  • __iter__ 方法返回迭代器对象本身。
  • __next__ 方法在每次迭代中被调用,返回当前索引位置的元素,并将索引加1。
    当索引超出数据列表的长度时,抛出 StopIteration 异常,迭代结束。
  1. 使用类方法
    类方法可以在不实例化类的情况下调用。
class MyClass:
    class_var = 0

    @classmethod
    def increment_class_var(cls):
        cls.class_var += 1

MyClass.increment_class_var()
print(MyClass.class_var)

1
  1. 使用属性装饰器
    属性装饰器用于控制属性的访问和修改。
class MyClass:
    def __init__(self, value):
        """
        初始化 MyClass 对象并设置初始值。

        参数:
        value (int/float): 初始值
        """
        self._value = value

    @property  # 属性方法
    def value(self):
        """
        获取 _value 的值。

        返回:
        int/float: 当前 _value 的值
        """
        return self._value

    @value.setter  # 属性的设置方法
    def value(self, new_value):
        """
        设置 _value 的新值。

        参数:
        new_value (int/float): 新值
        """
        self._value = new_value


# 创建一个 MyClass 对象,初始值为 10
obj = MyClass(10)

# 获取并打印 _value 的值
print(obj.value)  # 输出: 10

# 设置 _value 的新值为 20
obj.value = 20

# 获取并打印新的 _value 的值
print(obj.value)  # 输出: 20
10
20
  • @property 装饰器:

    • 将方法转换为属性,使得可以通过 obj.value 访问,而不需要调用方法。
    • 这种方法使得属性访问看起来更自然,与直接访问实例变量类似。
  • @value.setter 装饰器:

    • 将方法转换为属性的设置方法,使得可以通过 obj.value = new_value 来设置属性的值。
    • 这种方法提供了一种控制属性值设置的机制,可以在设置值之前进行验证或其他处理。
  1. 使用字典合并
    合并两个字典。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

# 使用字典的update方法合并
dict1.update(dict2)
print(dict1)
print({**dict1, **dict2})
{'a': 1, 'b': 3, 'c': 4}
{'a': 1, 'b': 3, 'c': 4}
  1. 使用 Counter计数
    Counter类用于计数可哈希对象。
from collections import Counter

data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(data)
print(counter)

Counter({'apple': 3, 'banana': 2, 'orange': 1})
  1. 使用 deque进行双端队列操作
    deque是一种双端队列,可以在两端高效地添加和删除元素。
from collections import deque

d = deque([1, 2, 3])
d.appendleft(0)
d.append(4)
print(d)

deque([0, 1, 2, 3, 4])
  1. 使用 defaultdict
    defaultdict是一个带有默认值的字典。
from collections import defaultdict

dd = defaultdict(int)
dd['a'] += 1
print(dd)

defaultdict(<class 'int'>, {'a': 1})
  1. 使用堆排序
    使用 heapq模块进行堆排序。
import heapq

# 初始化一个无序列表
data = [3, 1, 4, 1, 5, 9, 2, 6, 5]

# 使用 heapq.heapify 将列表转换为堆
heapq.heapify(data)

# 使用 heapq.heappop 逐个弹出最小元素,实现排序
sorted_data = [heapq.heappop(data) for _ in range(len(data))]

# 打印排序后的列表
print(sorted_data)
[1, 1, 2, 3, 4, 5, 5, 6, 9]
  • 堆排序过程:

    • heapq.heapify(data) 将列表 data 转换为最小堆,最小元素在堆的根节点。
    • heapq.heappop(data)逐个弹出最小元素,重新调整堆结构,使得次小元素成为新的根节点。
    • 通过列表推导式,所有元素依次弹出并存入新的列表 sorted_data,实现排序。
  • 堆的性质:

    • 最小堆是一种完全二叉树结构,满足父节点小于或等于子节点的性质。
    • 这种结构使得获取最小元素的时间复杂度为 O(1),插入和删除元素的时间复杂度为 O(log n)
import heapq

# 初始化一个无序列表
data = [3, 1, 4, 1, 5, 9, 2, 6, 5]

# 将所有元素取反,构建最大堆
max_heap = [-x for x in data]

# 使用 heapq.heapify 将列表转换为堆
heapq.heapify(max_heap)

# 使用 heapq.heappop 逐个弹出最大元素(原值)
sorted_data = [-heapq.heappop(max_heap) for _ in range(len(max_heap))]

# 打印排序后的列表
print(sorted_data)
[9, 6, 5, 5, 4, 3, 2, 1, 1]

通过使用 heapq 模块,可以间接实现大顶堆和堆排序。虽然 heapq 主要支持最小堆,但通过取反数的方法,可以高效地实现最大堆排序。

  1. 使用 bisect进行二分查找
    使用 bisect模块进行二分查找。
import bisect

# 初始化一个有序列表
data = [1, 2, 4, 4, 5]

# 使用 bisect.insort 在合适的位置插入元素 3
bisect.insort(data, 3)

# 打印插入后的列表
print(data)
[1, 2, 3, 4, 4, 5]
  • 二分查找:

    • bisect 模块使用二分查找算法在有序列表中找到元素应该插入的位置。
    • 二分查找的时间复杂度为 O(log n),比线性查找 O(n) 更高效。
  • 插入元素:

    • insort 函数不仅找到插入位置,还会将元素插入到该位置。
  1. 使用 itertools生成排列组合
import itertools

# 生成 'ABC' 字符串的长度为2的排列
permutations = list(itertools.permutations('ABC', 2))
# 生成 'ABC' 字符串的长度为2的组合
combinations = list(itertools.combinations('ABC', 2))

print('Permutations:', permutations)
print('Combinations:', combinations)
Permutations: [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
Combinations: [('A', 'B'), ('A', 'C'), ('B', 'C')]
  1. 使用 itertools生成无限序列
import itertools

counter = itertools.count(start=1, step=2)
print(next(counter))
print(next(counter))
print(next(counter))

1
3
5
  1. 使用 functools.partial
    使用 partial函数创建部分参数的函数。
from functools import partial

def power(base, exponent):
    """
    计算 base 的 exponent 次方。

    参数:
    base (int/float): 底数
    exponent (int/float): 指数

    返回:
    int/float: base 的 exponent 次方
    """
    return base ** exponent

# 使用 partial 函数创建一个新的函数 square,固定 exponent 参数为 2
square = partial(power, exponent=2)

# 计算 3 的平方
print(square(3))  # 输出: 9

9
  • partial 函数:

partial 函数用于固定一个函数的部分参数,从而创建一个新的函数。
在这个例子中,partial 被用来固定 power 函数的 exponent 参数为 2,从而创建一个新的函数 square

  1. 使用 functools.lru_cache
    使用 lru_cache缓存函数结果,提高性能。
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    """
    计算第n个斐波那契数,使用lru_cache进行缓存以提高性能。

    参数:
    n (int): 需要计算的斐波那契数的索引

    返回:
    int: 第n个斐波那契数
    """
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 打印第10个斐波那契数
print(fibonacci(10))

55
  • 缓存的优势:

    • 在没有缓存的情况下,递归计算斐波那契数会有大量的重复计算。例如,计算 F(10) 会多次计算 F(9)、F(8) 等。
    • 使用 lru_cache 后,每个值只计算一次,然后存储在缓存中,以后再需要相同值时直接从缓存中读取,避免重复计算,提高了性能。
  • 递归过程:

    • 当计算 fibonacci(10) 时,函数会递归调用 fibonacci(9)fibonacci(8),依次类推,直到调用 fibonacci(0)fibonacci(1)
    • 由于 lru_cache 的存在,计算 fibonacci(10) 的整个过程中,每个值只会计算一次,并存储在缓存中。
  1. 使用 subprocess运行外部命令
import subprocess

result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print(result.stdout)

Hello, World!
  1. 使用 shutil进行文件操作
import shutil
# 创建一个文件 example.txt 并写入内容
with open('example.txt', 'w') as file:
    file.write('Hello, world!')
shutil.copy('example.txt', 'example_copy.txt')
print('File copied.')
File copied.
  1. 使用 pathlib处理文件路径
from pathlib import Path

# 创建一个文件 example.txt 并写入内容
with open('example.txt', 'w') as file:
    file.write('Hello, world!')

# 使用 pathlib 创建一个 Path 对象
p = Path('example.txt')

# 打印文件名
print(p.name)    # 输出:example.txt

# 打印文件名(不包括后缀)
print(p.stem)    # 输出:example

# 打印文件后缀
print(p.suffix)  # 输出:.txt

# 打印文件的父目录
print(p.parent)  # 输出:.
example.txt
example
.txt
.
  1. 使用正则表达式匹配字符串
    使用 re模块进行正则表达式匹配。
import re

pattern = re.compile(r'\d+')
match = pattern.search('The answer is 42')
print(match.group())

42
  1. 使用内存映射文件
    使用 mmap模块进行内存映射文件操作。
import mmap
# 创建一个文件 example.txt 并写入内容
with open('example.txt', 'w') as file:
    file.write('Hello, world!')
# 打开文件 example.txt 进行读写操作 ('r+b' 表示读写二进制模式)
with open('example.txt', 'r+b') as f:
    # 使用 mmap 模块创建内存映射对象
    with mmap.mmap(f.fileno(), 0) as mm:
        # 从内存映射对象中读取一行,并将其解码为 UTF-8 字符串
        print(mm.readline().decode('utf-8'))
Hello, world!

with mmap.mmap(f.fileno(), 0) as mm:

使用 mmap 模块创建一个内存映射对象。f.fileno() 返回文件的文件描述符,0 表示将整个文件映射到内存中。with 语句确保内存映射对象在块结束时会自动关闭。

  1. 使用logging记录日志
import logging

logging.basicConfig(level=logging.INFO)
logging.info('This is an info message')

INFO:root:This is an info message
  1. 使用 argparse解析命令行参数
import argparse

def main(name="Default Name"):
    print(f"Hello, {name}!")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Example script')
    parser.add_argument('name', type=str, nargs='?', default="Default Name", help='Your name')
    args = parser.parse_args()
    main(args.name)

Hello, Alice!
  1. 使用 unittest进行单元测试
import unittest

def add(x, y):
    return x + y

class TestAdd(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)

if __name__ == '__main__':
    unittest.main(argv=[''], verbosity=2, exit=False)

test_add (__main__.TestAdd) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
  1. 使用 tqdm显示进度条
from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.01)

100%|██████████| 100/100 [00:01<00:00, 97.88it/s]
  1. 使用 pandas进行数据分析
import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)

Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专家指南:如何为您的电路选择理想的压敏电阻或热敏电阻

保护和维持电路功能需要两种设备&#xff1a;压敏电阻和热敏电阻。这两个电气元件有时会因后缀相似而混淆&#xff0c;但它们具有不同且重要的用途。 由于这种混淆&#xff0c;我们需要准确地了解这些组件是什么&#xff0c;这就是本文将要讨论的内容——应用程序、作用、优点…

SAP 无权限的解决

在进行SAP操作过程中&#xff0c;经常会出现无权限的情况&#xff0c;如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候&#xff0c;已经有角色分配了 解决&#xff1a;1、ABAA之后&#xff0c;SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…

Jhipster实战中遇到的知识点-开发记录

利用Jhipster开发的网站天赋吉星终于上线啦&#xff0c;本文介绍了在开发过程中遇到的各种小的知识点和技巧&#xff0c;绝对干货&#xff0c;供你参考。大家可以直接点击天赋吉星&#xff0c;看到网站效果。 首先介绍一下项目技术选型&#xff0c;JHipster 版本:8.1.0, 项目类…

谷粒商城学习笔记-逆向工程错误记录

文章目录 1&#xff0c;Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中&#xff0c;新增如下配置&#xff1a;1.2&#xff0c;执行clean命令刷新maven配置 2&#xff0c;internal java compiler error3&#xff0c;启动逆向工程报错&#x…

Unity分享一个简单的3D角色漫游脚本

1.新建一个场景&#xff0c;并创建一脚本 2.给场景中的地面添加一个Ground标签 3.给刚刚新建的脚本编写代码 using UnityEngine;public class PlayerMovement : MonoBehaviour {public float moveSpeed 5f; // 移动速度public float jumpForce 5f; // 跳跃力量public float …

家里老人能操作的电视直播软件,目前能用的免费看直播的电视软件app,适合电视和手机使用!

2024年许多能看电视直播的软件都不能用了&#xff0c;家里的老人也不会手机投屏&#xff0c;平时什么娱乐都没有了&#xff0c;这真的太不方便了。 很多老人并不喜欢去买一个广电的机顶盒&#xff0c;或者花钱拉有线电视。 现在的电视大多数都是智能电视&#xff0c;所以许多电…

记录在Windows上安装Docker

在Windows上安装Docker时&#xff0c;可以选择使用不同的后端。 其中两个常见的选择是&#xff1a;WSL 2&#xff08;Windows Subsystem for Linux 2&#xff09;和 Hyper-V 后端。此外&#xff0c;还可以选择使用Windows容器。 三者的区别了解即可&#xff0c;推荐用WSL 2&…

驾校管理系统-计算机毕业设计源码49777

驾校管理系统 摘 要 驾校管理系统是一个基于Spring Boot框架开发的系统&#xff0c;旨在帮助驾校提高管理效率和服务水平。该系统主要实现了用户管理、年月类型管理、区域信息管理、驾校信息管理、车辆信息管理、报名信息管理、缴费信息管理、财务信息管理、教练分配管理、更换…

数字签密:信息安全的新防线

随着互联网的普及和数字技术的飞速发展&#xff0c;信息安全问题日益凸显。在这个背景下&#xff0c;数字签密技术应运而生&#xff0c;为保护信息安全提供了新的解决方案。本文将介绍数字签密的概念、原理及应用&#xff0c;探讨其在信息安全领域的重要性。 数字签密的概念 …

智慧矿山:EasyCVR助力矿井视频多业务融合及视频转发服务建设

一、方案背景 随着矿井安全生产要求的不断提高&#xff0c;视频监控、数据传输、通讯联络等业务的需求日益增长。为满足矿井生产管理的多元化需求&#xff0c;提高矿井作业的安全性和效率&#xff0c;TSINGSEE青犀EasyCVR视频汇聚/安防监控综合管理平台&#xff0c;旨在构建一…

Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务 AOPAOP底层原理比如下面的代码案例手动模拟AOP 动态代理详解JDK动态代理具体实现 Cglib动态代理具体实现 jdk动态代理和cglib动态代理的区别 事务 AOP AOP底层原理 当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类) 面试题&#xff1a;为…

JAVA之(static关键字、final关键字)

JAVA之&#xff08;static关键字、final关键字&#xff09; 一、 static关键字1、静态变量2、静态方法3、 静态代码块4、例子 二、final关键字1、final修饰类2、 final修饰方法3、修饰变量 一、 static关键字 1、静态变量 private static String str1“staticProperty”2、静…

适合中小企业的MES管理系统有哪些特点

在当今竞争激烈的商业环境中&#xff0c;中小企业对于高效、灵活的生产管理系统的需求日益凸显。面对这些企业的MES管理系统不仅成为监控生产过程的得力助手&#xff0c;还通过提供关键数据&#xff0c;构建起客户期望与制造车间实时订单状态之间的紧密桥梁&#xff0c;以下是对…

Vue3使用markdown编辑器之Bytemd

官网地址&#xff1a;https://bytemd.js.org/playground GitHub地址&#xff1a;https://github.com/bytedance/bytemd ByteMD 是字节跳动出品的富文本编辑器&#xff0c;功能强大&#xff0c;可以免费使用&#xff0c;而且支持很多掘金内置的主题&#xff0c;写作体验很棒。 …

【Unity2D 2022:Particle System】添加拾取粒子特效

一、创建粒子特效游戏物体 二、修改粒子系统属性 1. 基础属性 &#xff08;1&#xff09;修改发射粒子持续时间&#xff08;Duration&#xff09;为3s &#xff08;2&#xff09;取消勾选循环&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在时间&…

星网安全产品线成立 引领卫星互联网解决方案创新

2024年6月12日&#xff0c;盛邦安全&#xff08;688651&#xff09;成立星网安全产品线&#xff0c;这是公司宣布全面进入以场景化安全、网络空间地图和卫星互联网安全三大核心能力驱动的战略2.0时代业务落地的重要举措。 卫星互联网技术的快速发展&#xff0c;正将其塑造为全球…

leetcode:编程基础0到1

文章目录 交替合并字符串str.length();StringBuilder类型 ,toString()append() &#xff0c;chatAt()题目描述 交替合并字符串 str.length(); 输出字符串str的长度 StringBuilder类型 ,toString() append() &#xff0c;chatAt() 题目描述 class Solution {public String …

(译文)IRIG-B对时编码快速入门

原文 PDF&#xff1a;https://ww1.microchip.com/downloads/aemDocuments/documents/FTD/tekron/tekronwhitepapers/221223-A-guide-to-IRIG-B.pdf IRIG-B3 概论 Inter-Range Instrument Group 时间码&#xff08;简称IRIG&#xff09;是一系列标准时间码格式。用于将时间信…

俄罗斯VK Ads开户充值全流程!VK如何开户?VK如何注册?VK广告

在俄罗斯&#xff0c;VK&#xff08;VKontakte&#xff09;是一个广受欢迎的社交媒体平台&#xff0c;对于寻求进入该市场的企业来说&#xff0c;进行VK广告推广是一条有效途径。 首先&#xff0c;你需要明确自己要推广的产品或服务&#xff0c;并且确定目标市场和受众。 由于…

1.8.0-矩阵乘法的反向传播-简单推导

1相关资料 之前分享过一个博客里面写的&#xff0c;我们大致了解并记住结论的博客&#xff1a;【深度学习】7-矩阵乘法运算的反向传播求梯度_矩阵梯度公式-CSDN博客&#xff1b;这里再分享一下自然语言处理书上关于这部分的推导过程&#xff1a;3-矩阵相乘-梯度反向传播的计算…