当前位置: 首页 > news >正文

函数式编程(以Python编程语言为例)介绍

函数式编程(以Python编程语言为例)介绍

何为函数式编程?

函数式编程(Functional Programming),不要误以为就是用函数编程。函数式编程确实涉及使用函数,但它不仅仅是“用函数编程”那么简单。

面向过程编程(Procedural Programming)是一种程序设计范式,强调以函数(或过程)为中心来组织代码。它将负责编程逻辑的指令分成多个子程序或函数,使得程序更易于理解和维护。

主要要素

函数(Function):逻辑代码块,面向过程的程序设计的基本单元。

代码复用:通过定义可重复使用的函数,可以避免代码重复,提高程序的可维护性和可读性。

自上而下设计:通常采用自上而下的方法,先定义程序的高层结构,然后逐渐细化到具体的实现细节。

控制结构:使用条件语句、循环结构等控制程序的流向。

函数式编程(Functional Programming),请注意多了一个“式”字。

函数式编程(Functional Programming)就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

主要要素

纯函数(Pure Functions):函数的输出仅依赖于其输入参数,没有副作用(side effects),这意味着调用该函数不会改变外部状态或数据。函数式编程强调使用不可变数据,一旦创建了一个对象,就不能改变它,这使得程序更具可预测性和可测试性。函数式编程强调使用纯函数。

函数是一等公民(Functions are First-Class Citizens/ First-class functions):在函数式编程中,函数被视为第一类公民。这意味着函数可以被赋值给变量,可以作为参数传递给其他函数,也可以作为返回值返回。这使得高阶函数(即接受其他函数作为参数或返回其他函数的函数)成为可能。

不可变性(Immutability):数据结构在创建后不能被修改。相反,任何数据变更都会返回一个新的数据结构。这有助于避免状态的变化和潜在的错误,从而简化并发编程。

高阶函数(Higher-Order Functions):高阶函数是指接受一个或多个函数作为参数,或者返回一个新函数的函数。许多编程语言中,像 map、filter、reduce 这样的内置函数就是高阶函数。高阶函数允许程序员以更抽象的方式处理操作,例如映射、过滤和归约等操作。

递归(Recursion):函数式编程常常使用递归来替代传统的循环结构。由于纯函数字段不允许有副作用,因此递归成为了实现重复(如 for 和 while)逻辑的一种重要手段。

惰性求值(Lazy Evaluation):即表达式在需要时才会计算,而不是立即计算。这种特性可以提高性能并允许处理无限数据结构。

下面解析函数式编程的几个要素

☆在编程语言中“函数是一等公民”意味着,函数被视为与其他数据类型(如整数、字符串等)具有同等地位。具体来说,这意味着函数可以:

    被赋值给变量

    作为参数传递给其他函数

    作为其他函数的返回值

    存储在数据结构中,如数组或对象

下面用Python编程语言举一个简单的例子来说明这个概念:

def greet(name):return f"Hello, {name}!"# 1. 将函数赋值给变量
say_hello = greet# 2. 将函数作为参数传递
def apply_function(func, value):return func(value)result = apply_function(greet, "Alice")
print(result)  # 输出: Hello, Alice!# 3. 函数作为返回值
def create_greeter(greeting):def greeter(name):return f"{greeting}, {name}!"return greetercasual_greeter = create_greeter("Hi")
print(casual_greeter("Bob"))  # 输出: Hi, Bob!# 4. 存储在数据结构中
function_list = [greet, casual_greeter]
for func in function_list:print(func("Charlie"))
# 输出:
# Hello, Charlie!
# Hi, Charlie!

☆纯函数是指满足以下两个条件的函数:

    给定相同的输入,总是返回相同的输出。这意味着函数的输出完全由其输入决定,不依赖于任何外部状态或数据。

    函数的执行不会产生副作用(Side Effects)。这意味着函数不会修改任何外部状态。它不会改变全局变量,不会修改传入的参数,不会进行I/O操作(如写文件或打印到控制台),也不会调用其他会产生副作用的函数。

下面用Python举个例子来说明纯函数和非纯函数的区别:

# 纯函数
def add(a, b):return a + b# 非纯函数
total = 0
def add_and_increment(a, b):global totaltotal += 1return a + b# 使用纯函数
result1 = add(3, 4)  # 总是返回 7
result2 = add(3, 4)  # 总是返回 7# 使用非纯函数
result3 = add_and_increment(3, 4)  # 返回 7,但 total 变为 1
result4 = add_and_increment(3, 4)  # 返回 7,但 total 变为 2

☆高阶函数是指满足以下一个或两个条件的函数:

    接受一个或多个函数作为参数

    返回一个函数作为结果

换句话说,高阶函数就是操作函数的函数。这个概念利用了函数作为“一等公民”的特性。

下面用Python举几个例子来说明高阶函数:

(1)接受函数作为参数示例:

def apply_twice(func, value):return func(func(value))def add_five(x):return x + 5result = apply_twice(add_five, 10)
print(result)  # 输出: 20

在这个例子中,apply_twice 是一个高阶函数,它接受 func 函数作为参数,并对 value 应用两次。

(2)返回一个函数示例:

def create_multiplier(factor):def multiplier(x):return x * factorreturn multiplierdouble = create_multiplier(2)
triple = create_multiplier(3)print(double(5))  # 输出: 10
print(triple(5))  # 输出: 15

这里 create_multiplier 是一个高阶函数,它返回一个新的函数。

(3)既接受函数作为参数,又返回一个函数示例:

def compose(f, g):return lambda x: f(g(x))def add_one(x):return x + 1def square(x):return x * xadd_one_and_square = compose(square, add_one)print(add_one_and_square(3))  # 输出: 16

在这个例子中,compose 是一个高阶函数,它接受两个函数作为参数,并返回一个新的函数。

Python常用的内置高阶函数:

(1)map()

map(function, iterable):将指定的 function 应用到 iterable 中的每个元素,并返回一个迭代器。

高阶函数: 因为它接受一个函数(例如 lambda x: x ** 2)作为参数。

示例:将一个列表中的每个数字平方

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

(2)filter()

filter(function, iterable):根据 function 的返回值过滤 iterable 中的元素,只保留返回值为 True 的元素。

高阶函数: 因为它接受一个函数作为参数。

示例:从列表中筛选出偶数

numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4]

(3)reduce() 【在 functools 模块中】

reduce(function, iterable):在 functools 模块中,reduce() 将二元操作(即接受两个参数的函数)累积应用于可迭代对象中的元素,从而将其缩减为单一值。

高阶函数: 因为它接受一个函数作为参数。

示例:计算列表中所有数字的乘积

from functools import reducenumbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product)   # 输出: 24 (1*2*3*4)

(4)sorted()

sorted(iterable, key=None, reverse=False):对可迭代对象进行排序,并可以通过提供自定义排序键(key)来控制排序方式。

虽然它不直接接受一个“处理”函数,但可以通过 key 参数传入一个用于比较的函数,因此也被视为高阶函数。

高阶函数: 因为它可以接受一个函数(key 参数)作为参数。

示例:按字符串长度对列表进行排序

words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print(sorted_words)   # 输出: ['date', 'apple', 'banana', 'cherry']

(5)any() 和 all()

any(iterable):如果可迭代对象中至少有一个元素为 True,则返回 True;否则返回 False。

all(iterable):如果可迭代对象中的所有元素都为 True,则返回 True;否则返回 False。

这两个函数本身不接受用户定义的处理逻辑,但它们基于布尔上下文来评估可迭代对象中的元素,因此也被认为是高阶函数的一种变体。

高阶函数: 被认为是高阶函数的一种变体。

示例:使用 any() 检查是否有任何元素为 True;使用 all() 检查是否所有元素都为 True。

numbers = [1, 2, 3, 4, 5]
print(any(x > 3 for x in numbers))  # 输出: True
print(all(x > 3 for x in numbers))  # 输出: False

☆惰性求值(Lazy Evaluation)是一种计算策略,它延迟表达式的评估,直到真正需要其结果的时候。

惰性求值的特点和优势:

    按需计算:只有在实际需要结果时才进行计算,而不是预先计算所有可能的值。

    处理无限序列:可以定义和使用理论上无限的数据结构,因为只有被访问的部分才会被计算。

    提高性能:避免不必要的计算,特别是在处理大型数据集时。

    节省内存:不需要一次性在内存中保存所有结果。

在Python中,我们可以通过生成器和迭代器来实现惰性求值。

(1)使用生成器实现惰性求值:

def infinite_sequence():num = 0while True:yield numnum += 1# 使用生成器
gen = infinite_sequence()
print(next(gen))  # 0
print(next(gen))  # 1
print(next(gen))  # 2

这个例子定义了一个理论上无限的序列,但只有在调用 next() 时才会生成下一个值。

(2)自定义惰性求值类:

class LazyRange:def __init__(self, start, end):self.start = startself.end = enddef __iter__(self):current = self.startwhile current < self.end:yield currentcurrent += 1# 使用LazyRange
lazy_range = LazyRange(1, 1000000)
for i in lazy_range:if i > 5:breakprint(i)

这个例子定义了一个惰性范围类,只有在迭代时才会生成值。

面向过程编程和函数式编程对比

面向过程编程(Procedural Programming)和函数式编程(Functional Programming)是两种不同的编程范式,它们在设计理念、结构、数据处理方式等方面存在显著差异。以下是这两种编程范式的主要区别:

☆编程理念方面

面向过程编程:

    强调使用过程或函数来组织代码。

    关注的是如何实现任务(即程序的步骤和流程)。

    逐步实现,从顶层结构逐渐细化到具体实现。

函数式编程:

    强调使用纯函数来定义计算。

    关注的是计算的结果和数据的变换,而不是如何执行这些变换的具体步骤。

    偏好声明式编程风格,即说明结果是什么,而不是怎么做。

☆数据与状态管理方面

面向过程编程:

    使用可变数据结构,允许在程序运行时修改变量的值。

    状态管理依赖于全局变量和局部变量,可能导致难以追踪和理解程序状态变化。

函数式编程:

    数据通常是不可变的,一旦创建就不能被修改。任何“变化”都通过创建新的数据结构来实现。

    函数不依赖于外部状态,不会有副作用(side effects),使得代码更具可预测性和可测试性。

☆代码组织、制流的使用方面

面向过程编程:

    使用控制结构(如条件语句、循环等)来控制程序执行流程。

    程序逻辑往往围绕着对状态的改变进行组织。

函数式编程:

    更倾向于使用递归而不是循环来实现重复操作。

    控制流通常通过高阶函数(如 map、filter 和 reduce 等)来实现,而不是显式地使用循环结构。

下面是使用 Python 语言给出简单的示例对比,直观比较这两种范式,分别演示面向过程编程和函数式编程来计算圆的周长和面积的例子。

先看面向过程编程的实现,在面向过程编程中,我们通常会定义一个或多个函数来执行特定的任务,并且可能会使用可变状态。以下是一个简单的实现:

import mathdef calculate_circumference(radius):circumference = 2 * math.pi * radiusreturn circumferencedef calculate_area(radius):area = math.pi * (radius ** 2)return area# 主程序
radius = float(input("请输入圆的半径: "))
circumference = calculate_circumference(radius)
area = calculate_area(radius)print(f"圆的周长: {circumference}")
print(f"圆的面积: {area}")

再看函数式编程的实现,在函数式编程中,我们将更加注重使用纯函数,避免可变状态。虽然 Python 本身并不是纯粹的函数式语言,但我们仍然可以采用一些函数式风格。以下是相应的实现:

import math# 定义纯函数
def calculate_circumference(radius):return 2 * math.pi * radiusdef calculate_area(radius):return math.pi * (radius ** 2)# 使用高阶函数来处理输入和输出(模拟)
def process_circle_data(func, radius):return func(radius)# 主程序
radius = float(input("请输入圆的半径: "))
circumference = process_circle_data(calculate_circumference, radius)
area = process_circle_data(calculate_area, radius)print(f"圆的周长: {circumference}")
print(f"圆的面积: {area}")

对比分析说明

面向过程编程:

    明确地定义了计算周长和面积的两个独立函数。

    在主程序中直接调用这些函数,使用可变变量 circumference 和 area 来存储结果。

函数式编程:

    同样定义了计算周长和面积的两个纯函数。

    使用高阶函数 process_circle_data 来处理输入,这种方式使得代码更具抽象性。

    没有显式地维护任何状态,只通过传递参数来获取结果。

这两种方法都能有效地完成相同任务,但它们在结构和思维方式上有所不同。

Python对函数式编程要素总结与补充:

1. 函数是一等公民

在 Python 中,函数是第一类公民,可以将函数赋值给变量、作为参数传递给其他函数,以及从其他函数返回。详见前面介绍。

2. 高阶函数

Python 支持高阶函数,可以接受其他函数作为参数或返回一个新函数。详见前面介绍。

3. 纯函数

虽然 Python 本身不强制要求使用纯函数,但开发者可以遵循这一原则来实现没有副作用的功能。详见前面介绍。

4. 不可变性

虽然 Python 的内置数据结构(如列表)是可变的,但可以使用元组和 frozenset 等不可变数据结构来实现不可变性。

my_tuple = (1, 2, 3)
# my_tuple[0] = 10 会引发 TypeError,因为元组是不可变的。

5. 递归

Python 支持递归,可以通过定义一个调用自身的函数来实现重复逻辑。不过要注意,Python 对递归深度有限制(默认最大深度为1000)。

def factorial(n):if n == 0:return 1else:return n * factorial(n - 1)print(factorial(5)) # 输出: 120

6. 匿名函数(Lambda 表达式)

Python 提供了 lambda 表达式,用于创建小型匿名函数。这在需要简单功能时非常方便,可以直接在调用时定义,而不必单独命名。

add = lambda x, y: x + y
print(add(2, 3)) # 输出: 5

7. 闭包

Python 支持闭包,即可以在一个嵌套函数中引用外部作用域中的变量。这使得可以创建具有状态的函数。

def make_counter():count = 0def counter():nonlocal countcount += 1return countreturn countercounter = make_counter()
print(counter())  # 输出: 1
print(counter())  # 输出: 2

8. 生成器

生成器(generator)是一种特殊类型的迭代器,可以用来生成序列。它们通过 yield 表达式返回值,并保持其状态,使得可以按需计算序列中的值。

示例:生成斐波那契数列的生成器

def fibonacci(n):a, b = 0, 1for _ in range(n):yield aa, b = b, a + bfor num in fibonacci(10):print(num)   # 输出前10个斐波那契数:0, 1, 1, 2, ...

9.迭代器(Iterator)

定义:迭代器是一种对象,它实现了 __iter__() 和 __next__() 方法,允许我们逐个访问集合中的元素。

示例:使用生成器创建一个简单的迭代器

生成器是 Python 中一种特殊类型的迭代器,可以用来惰性地生成数据。这符合函数式编程中“懒惰计算”的理念,因为它只在需要时才会计算下一个值。

# 创建一个生成器,产生斐波那契数列
def fibonacci(n):a, b = 0, 1for _ in range(n):yield aa, b = b, a + b# 使用这个生成器
for num in fibonacci(10):print(num)  # 输出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

例子中,fibonacci 函数是一个生成器,它每次调用 yield 时返回当前的 Fibonacci 数,而不是一次性计算所有的值。这样可以节省内存,并且只有在需要时才会进行计算,这符合函数式编程中的惰性求值特性。可以有效地处理大量数据。

10. 装饰器(Decorator)

定义:装饰器是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。装饰器通常用于扩展或修改原有函数的行为,而无需直接修改其代码。

下面是一个简单的示例,展示如何使用装饰器来记录函数执行时间:

import time# 定义装饰器
def timer_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()      # 开始计时result = func(*args, **kwargs) # 调用被装饰的函数end_time = time.time()        # 停止计时print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")return result                 # 返回原始函数结果return wrapper# 使用装饰器修饰目标函数
@timer_decorator
def example_function():time.sleep(1)   # 模拟耗时操作example_function()

例子中,timer_decorator 是一个装饰器,它增强了 example_function 的功能,使得每次调用该函数时都会打印出执行时间。你可以看到,通过使用装饰器,我们没有改变 example_function 的内部实现,但却为它添加了新的功能。Python中的装饰器 提供了一种优雅的方法(在不修改函数本身代码的情况下)来添加额外的功能,而不需要修改原始函数的代码。这种方式符合函数式编程中的组合和重用原则。

需要注意的是,Python提供了对函数式编程支持,但它不是一个纯粹的函数式编程语言。

函数式编程语言通常强调以下特性:

    纯函数:函数的输出仅依赖于输入,没有副作用。它们不会修改外部状态或者数据。

    不可变性:数据结构通常是不可变的,意味着一旦创建就不能被修改。

    高阶函数:可以接受其他函数作为参数或返回函数的函数。

    函数组合:支持将多个函数组合成更复杂的操作。

Python的特性

    可变与不可变:Python有可变(如列表、字典)和不可变(如元组、字符串)数据类型,但程序员在使用时可以选择可变数据结构,这使得状态的变化变得简单。

    副作用:Python中的函数可以有副作用,如修改外部变量或输出到控制台。因此,定义一个“纯”函数的概念在Python中并不总是适用。

    高阶函数支持:Python支持高阶函数,如使用 map()、filter() 和 reduce() 等内建函数,也可以通过定义自己的函数来实现这一点。

因此所以说,虽然Python支持函数式编程的某些特性,并允许开发者以函数式的风格编程,但由于其对可变状态的支持和函数的灵活性,Python不是一种纯函数式编程语言。开发者可以根据需要选择不同的编程风格,结合面向对象、面向过程和函数式编程的特性来开发更为灵活和高效的代码。

相关文章:

函数式编程(以Python编程语言为例)介绍

函数式编程&#xff08;以Python编程语言为例&#xff09;介绍 何为函数式编程&#xff1f; 函数式编程&#xff08;Functional Programming&#xff09;&#xff0c;不要误以为就是用函数编程。函数式编程确实涉及使用函数&#xff0c;但它不仅仅是“用函数编程”那么简单。 …...

银河麒麟操作系统中查看动态库函数的方法

银河麒麟操作系统中查看动态库函数的方法 1、查看单个动态库中的函数2、查找特定函数位于哪个动态库中 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux系统&#xff0c;包括银河麒麟操作系统中&#xff0c;动态库&#xff08;.so文件…...

开放麒麟openkylin

开源社区&#xff1a; openKylin: openKylin 社区的愿景是&#xff1a;在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区。 下载地址&#xff1a; openKylin开源操作系统 安…...

用Python与OpenCV的实践:实时面部对称性分析

目录 思路分析 整体代码 效果展示 总结 在当今计算机视觉领域&#xff0c;人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用&#xff0c;还是美学研究&#xff0c;人脸特征的提取和分析都是关键技术之一。在这篇博客中&#xff0c;我们将深入探讨一个有趣的…...

第三十三章 使用派生密钥令牌进行加密和签名 - 使用 DerivedKeyToken _进行加密(一)

文章目录 第三十三章 使用派生密钥令牌进行加密和签名 - 使用 <DerivedKeyToken> 第三十三章 使用派生密钥令牌进行加密和签名 - 使用 进行加密&#xff08;一&#xff09; 如果加密了任何安全标头元素&#xff0c;请将它们添加到 WS-Security 标头元素中。为此&#…...

Structure-Aware Transformer for Graph Representation Learning

Structure-Aware Transformer for Graph Representation Learning&#xff08;ICML22&#xff09; 摘要 Transformer 架构最近在图表示学习中受到越来越多的关注&#xff0c;因为它通过避免严格的结构归纳偏差而仅通过位置编码对图结构进行编码&#xff0c;自然地克服了图神经…...

滚动页面,el-table表头始终置顶

效果如下&#xff1a; 起始状态&#xff1a; 滚动后&#xff1a; 代码地址&#xff1a;代码地址-面包多...

Mac使用gradle编译springboot-2.7.x源码

1 开发环境&#xff1a; JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…...

MySQL --索引(下)

文章目录 6.索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引6.7 索引创建原则6.8 复合索引6.9 索引最左匹配原则6.10 索引覆盖 6.索引操作 6.1 创建主键索引 第一种方式&#xff1a; – 在创建表的时候&#xff0c;直接…...

选择寄宿学校,给自闭症孩子一个温暖的第二家

在寻找适合自闭症孩子成长的道路上&#xff0c;每一个家庭都充满了艰辛与希望。而广州市星贝育园康复中心&#xff0c;以其独特的全托寄宿制教育模式&#xff0c;为这些特殊的孩子提供了一个充满爱与关怀的“第二家”。在这里&#xff0c;孩子们不仅能够得到专业的康复训练&…...

大模型训练:K8s 环境中数千节点存储最佳实践

今天这篇博客来自全栈工程师朱唯唯&#xff0c;她在前不久举办的 KubeCon 中国大会上进行了该主题分享。 Kubernetes 已经成为事实的应用编排标准&#xff0c;越来越多的应用在不断的向云原生靠拢。与此同时&#xff0c;人工智能技术的迅速发展&#xff0c;尤其是大型语言模型&…...

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…...

ftdi_sio驱动学习笔记 3 - 端口操作

目录 1. ftdi_port_probe 1.1 私有数据结构ftdi_private 1.2 特殊probe处理 1.3 确定FTDI设备类型 1.4 确定最大数据包大小 1.5 设置读取延迟时间 1.6 初始化GPIO 1.6.1 使能GPIO 1.6.2 添加到系统 1.6.2.1 设置GPIO控制器的基本信息 1.6.2.2 设置GPIO控制器的元信息…...

[leetcode]39_组合总和_给定数组且数组可重复

给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数。 解集不能包含重复的组合…...

【笔记】第三节 组织与性能

3.1 基本成分 3.2 微观组织特征 0.6-0.8C%碳素钢的组织为珠光体和少量的铁素体。 如何把组织和性能联系起来&#xff1f;德国克虏伯公司的研究——珠光体片间距与渗碳体片层厚度成比例&#xff1a; t s 0 ( ρ 15 ( C % ) − 1 ) ts_0(\frac{\rho}{15(C\%)}-1) ts0​(15(C%)…...

数据库——sql语言学习 查找语句

一、什么是sql SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写&#xff0c;它是一种专门为数据库设计的操作命令集&#xff0c;用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;。 二、查找相关语句 ‌‌首先&#xff0c;我们已经设…...

【计算机网络 - 基础问题】每日 3 题(二十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

JPA + Thymeleaf 增删改查

一、 什么是 Thymeleaf JPA&#xff08;Java Persistence API&#xff09;&#xff1a;是一种用于对象关系映射&#xff08;ORM&#xff09;的 Java 规范&#xff0c;它简化了数据库操作&#xff0c;使开发者可以以面向对象的方式处理数据存储。通过定义实体类和数据访问接口&a…...

Android常用C++特性之std::this_thread

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::this_thread 是 C11 标准库中的一个命名空间&#xff0c;提供了一组与当前线程&#xff08;即调用这些函数的线程&#xff09;相关的操作。通过 std::this_threa…...

成语700词(31~45组)

目录 31.对待错误的态度(12 个)32.改变与不变(19 个)33.顺势造势(6 个)34.自然会发生(6 个)35.提早准备和补救(11 个)36.办公、管理相关(8 个)37.空谈与虚幻(8 个)38.来者众多(11 个)39.人多热闹(6)40.好坏掺杂(7 个)41.流行与名声(14 个)42.与传播、传闻…...

vue3组件通信(组合式API)

vue3组件通信&#xff08;组合式API&#xff09; vue3组件通信&#xff0c;采用组合式API。选项式API&#xff0c;参看官网 Vue3组件通信和Vue2的区别&#xff1a; 移出事件总线&#xff0c;使用mitt代替。 vuex换成了pinia。把.sync优化到了v-model里面了。把$listeners所…...

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来&#xff0c;边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点&#xff0c;在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…...

2024年汉字小达人区级自由报名备考冲刺:最新问题和官模题练一练

今天是2024年第十一届汉字小达人的区级自由报名活动的第二天。 我们继续回答几个关于汉字小达人的最新问题&#xff0c;做几道2024年官方模拟题&#xff0c;帮助孩子们少走弯路&#xff0c;再冲刺一般&#xff0c;更精准地备考2024年汉字小达人。 【温馨提示】本专题在比赛期…...

Linux相关概念和重要知识点(8)(操作系统、进程的概念)

1.操作系统&#xff08;OS&#xff09; &#xff08;1&#xff09;基本结构的认识 任何计算机系统都包含一个基本的程序集合&#xff0c;用于实现计算机最基本最底层的操作&#xff0c;这个软件称为操作系统。操作系统大部分使用C语言编写&#xff0c;少量使用汇编语言。 从…...

测序技术--组蛋白甲基化修饰、DNA亲和纯化测序,教授(优青)团队指导:从实验设计、结果分析到SCI论文辅助

组蛋白甲基化修饰工具(H3K4me3 ChIP-seq)组蛋白甲基化类型也有很多种&#xff0c;包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守&#xff0c;是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…...

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕&#xff0c;那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相&#xff0c;短短数月&#xff0c;Ray-Ban Meta 就突破百万销量&#xff0c;不仅让马…...

软考高级:SOA 和微服务 AI 解读

概念讲解 SOA&#xff08;面向服务架构&#xff09;和微服务虽然都是服务架构的设计模式&#xff0c;但它们的侧重点和实现方式有很大区别。为了帮助你理解这两个概念&#xff0c;我们可以从生活中的例子、概念本身的讲解以及记忆方法三方面入手。 生活化例子 **SOA&#xf…...

【每天学个新注解】Day 6 Lombok注解简解(五)—@SneakyThrows

SneakyThrows 简化异常处理 并不建议日常开发中通过此注解解决异常捕获问题&#xff01;&#xff01;&#xff01; 允许方法抛出检查型异常而无需显式声明或捕获这些异常。这对于那些不希望在方法签名中声明异常或不愿意编写复杂的 try-catch 块的场景非常有用。 使用 SneakyT…...

C语言 | Leetcode C语言题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ //递归遍历树节点&#xff0c;判断是否为有效路径 int dfs(struct TreeNode * root, int ta…...

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…...