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

Python:函数(一)

python函数相关的知识点

 1. 函数定义与调用

定义:使用 def 关键字,后接函数名和参数列表。

def greet(name):"""打印问候语(文档字符串)"""print(f"Hello, {name}!")

调用

greet("Alice")  # 输出:Hello, Alice!

2. 参数与返回值

  • 位置参数:按顺序传递参数。
  • 默认参数:为参数提供默认值。
def power(base, exponent=2):return base ​** exponentprint(power(3))      # 输出:9(使用默认exponent=2)
print(power(2, 4))   # 输出:16
  • 返回值:使用 return 返回结果,无返回值时默认返回 None
def add(a, b):return a + bresult = add(3, 5)  # result = 8

 1. ​参数传递的基本机制

Python中所有参数的传递都是 ​对象引用的传递

  • 不可变对象(如整数、字符串、元组):函数内对形参的修改会创建新对象,不影响实参。

  • 可变对象​(如列表、字典):函数内对形参的修改会影响实参(因为它们指向同一对象)。解决:传副本

示例

def modify(a, b,c):a = 2       # 修改不可变对象(创建新对象)b.append(3) # 修改可变对象c.append(4)x = 1          # 不可变
y = [1, 2]     # 可变
c=[1,2,3]
modify(x, y,c.copy())print(x)       # 输出:1(未改变)
print(y)       # 输出:[1, 2, 3](已改变)
print(c)       # 输出:[1, 2, 3](不改变)

2. ​参数传递的方式

Python支持多种参数传递方式,具体取决于函数定义和调用时的语法。

(1) ​位置参数(Positional Arguments)​

按参数定义顺序传递,最常见的方式。

def add(a, b):return a + bprint(add(3, 5))  # 输出:8

(2) ​关键字参数(Keyword Arguments)​

通过参数名指定值,顺序可以打乱。

print(add(b=5, a=3))  # 输出:8

(3) ​默认参数(Default Arguments)​

为参数提供默认值,调用时可省略。

def greet(name, msg="Hello"):print(f"{msg}, {name}!")greet("Alice")          # 输出:Hello, Alice!
greet("Bob", "Hi")      # 输出:Hi, Bob!

(4) ​可变参数(*args 和 ​kwargs)​**

  • *args:接收任意数量的位置参数(元组形式)(写最后)。

  • **kwargs:接收任意数量的关键字参数(字典形式)(写最后)。

def print_all(*args, ​**kwargs):print("位置参数:", args)print("关键字参数:", kwargs)print_all(1, 2, name="Alice", age=25)
# 输出:
# 位置参数: (1, 2)
# 关键字参数: {'name': 'Alice', 'age': 25}

3. ​参数解包(Unpacking)​

在调用函数时,可以使用 * 和 ** 解包序列或字典作为参数。

示例

def func(a, b, c):print(a, b, c)# 解包列表/元组(按位置传递)
args = [1, 2, 3]
func(*args)  # 输出:1 2 3# 解包字典(按关键字传递)
kwargs = {"a": 1, "b": 2, "c": 3}
func(**kwargs)  # 输出:1 2 3

4. ​注意事项

(1) ​默认参数的陷阱

默认参数的值在函数定义时计算一次,若默认值是可变对象,多次调用会共享该对象。

def append_to(item, lst=[]):lst.append(item)return lst# 第一次调用
print(append_to(1))  # 输出:[1]
# 第二次调用
print(append_to(2))  # 输出:[1, 2](而不是预期的[2])

原因分析

  • Python 在函数定义时(即代码加载时)就创建了默认参数 lst=[],并将其存储在函数对象的 __defaults__ 属性中。
  • 所有未显式传递 lst 参数的调用,都会共享同一个列表对象
  • 每次调用 append_to 时,修改的是同一个列表,而不是创建新列表。

修正方法:使用不可变对象(如 None)占位。

def append_to(item, lst=None):if lst is None:lst = []  # 每次调用时创建新列表lst.append(item)return lst# 第一次调用
print(append_to(1))  # 输出:[1]
# 第二次调用
print(append_to(2))  # 输出:[2](符合预期)

关键点

  • 默认参数设为 None(不可变对象)。
  • 在函数内部检查 lst is None,若为真则创建一个新的空列表。
  • 每次调用都会生成新的列表对象,避免共享问题。

默认参数是字典、集合等可变对象时,同样需要警惕:

# 错误示例:默认值为空字典
def update_dict(key, value, d={}):d[key] = valuereturn dprint(update_dict("a", 1))  # {'a': 1}
print(update_dict("b", 2))  # {'a': 1, 'b': 2}# 正确写法
def update_dict(key, value, d=None):if d is None:d = {}d[key] = valuereturn d

通过 __defaults__ 属性查看函数的默认参数值:

def func(a, lst=[]):passprint(func.__defaults__)  # 输出:([],)# 调用函数后,默认列表被修改
func(1)
print(func.__defaults__)  # 输出:([1],)
  • 规则:默认参数的值在函数定义时被计算一次,并存储在函数对象中。
  • 陷阱:若默认值是可变对象(列表、字典等),所有未显式传递该参数的调用会共享同一个对象。
  • 解决:用 None 作为默认值,在函数内部初始化可变对象。
  • # 错误写法 ❌
    def func(arg=[]):pass# 正确写法 ✅
    def func(arg=None):if arg is None:arg = []

(2) ​避免意外修改可变对象

若函数需要处理可变对象但不希望影响原始数据,应创建副本。

def process_list(lst):lst = lst.copy()  # 创建副本lst.append(100)return lstoriginal = [1, 2, 3]
modified = process_list(original)
print(original)  # [1, 2, 3](未被修改)
print(modified)   # [1, 2, 3, 100]

5. ​总结

参数类型

特点

位置参数

按顺序传递,简单直接

关键字参数

按参数名指定,提高可读性

默认参数

提供默认值,简化调用

可变参数(*args

接收任意数量的位置参数

可变参数(**kwargs

接收任意数量的关键字参数

参数解包

使用 * 和 ** 将序列或字典解包为参数

返回值

1. ​基本返回值

使用 return 语句返回结果。如果没有 return 或 return 后无值,函数默认返回 None

def add(a, b):return a + bresult = add(3, 5)
print(result)  # 输出:8# 无返回值的函数
def greet(name):print(f"Hello, {name}!")result = greet("Alice")  # 输出:Hello, Alice!
print(result)            # 输出:None

2. ​返回多个值

Python 允许通过 ​返回元组 实现多值返回,调用时可以直接解包。

def min_max(numbers):return min(numbers), max(numbers)values = [4, 2, 9, 7]
min_val, max_val = min_max(values)#解包
print(f"最小值: {min_val}, 最大值: {max_val}")  # 输出:最小值: 2, 最大值: 9

本质

函数返回的多个值实际上是一个元组,解包是隐式操作:

result = min_max(values)
print(result)  # 输出:(2, 9)

3. ​返回复杂对象

函数可以返回列表、字典、类实例等任意对象。

示例 1:返回字典

def create_person(name, age):return {"name": name, "age": age}person = create_person("Bob", 30)
print(person)  # 输出:{'name': 'Bob', 'age': 30}

示例 2:返回函数(闭包)

def outer():def inner():print("内部函数被调用")return innerfunc = outer()
func()  # 输出:内部函数被调用

  

4. ​返回生成器(yield)​

使用 yield 关键字定义生成器函数,返回一个生成器对象,支持迭代。

def count_up_to(max):count = 1while count <= max:yield countcount += 1generator = count_up_to(3)
for num in generator:print(num)  # 依次输出:1, 2, 3

5. ​返回 None 的情况

以下情况函数返回 None

  1. 没有 return 语句。

  2. return 语句没有指定返回值。

  3. return 后仅写 None

def func1():passdef func2():returndef func3():return Noneprint(func1())  # None
print(func2())  # None
print(func3())  # None

6. ​提前返回与多条件返回

函数中可以存在多个 return 语句,执行到第一个 return 时函数终止。

示例:根据条件返回不同结果

def check_number(num):if num < 0:return "负数"elif num == 0:return "零"else:return "正数"print(check_number(-5))  # 输出:负数
print(check_number(0))   # 输出:零
print(check_number(10))  # 输出:正数

7. ​注意事项

(1) ​返回值与可变对象

如果返回的是可变对象(如列表、字典),多次调用可能共享同一对象(需谨慎)。

def get_list():return []list1 = get_list()
list2 = get_list()
list1.append(1)
print(list2)  # 输出:[](安全,因为每次返回新列表)# 但若函数内部缓存了可变对象:
def get_cached_list(lst=[]):return lstlist3 = get_cached_list()
list4 = get_cached_list()
list3.append(1)
print(list4)  # 输出:[1](危险!共享同一列表)

(2) ​类型提示(Python 3+)​

可以为返回值添加类型注解,提高代码可读性。

def add(a: int, b: int) -> int:return a + b

8. ​总结

返回类型

示例

说明

单个值

return 10

直接返回数据

多个值(元组解包)

return a, b

返回元组,调用时可解包

复杂对象

return {"data": [...]}

返回字典、列表、实例等

函数或闭包

return inner

返回内部函数,形成闭包

生成器

yield value

返回生成器,支持惰性计算

None

return 或 return None

默认返回值

合理使用返回值可以让函数更灵活,例如:

  • 通过返回生成器处理大数据集(节省内存)。

  • 返回函数实现装饰器或策略模式。

  • 返回元组简化多值传递。

3. 作用域与 global

  • 函数内部默认不能修改全局变量,需使用 global 声明。
x = 10def modify_global():global xx = 20modify_global()
print(x)  # 输出:20

5. 嵌套函数、闭包与装饰器

  • 嵌套函数:在函数内部定义另一个函数。
  • 闭包:内部函数记住外部作用域的变量。
def outer(msg):def inner():print(msg)  # 闭包保留外部变量msgreturn innerclosure = outer("Hello")
closure()  # 输出:Hello

装饰器用于增强函数功能,不修改原函数代码。

def my_decorator(func):def wrapper():print("装饰器:函数执行前")func()print("装饰器:函数执行后")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
# 输出:
# 装饰器:函数执行前
# Hello!
# 装饰器:函数执行后

在 Python 中,​闭包(Closure)​ 和 ​装饰器(Decorator)​ 是两个紧密关联且强大的概念,它们通过函数的高阶特性实现代码复用和动态扩展功能。


一、闭包(Closure)

1. ​定义

闭包是 ​一个函数与其外部作用域变量的绑定关系。即使外部函数已执行完毕,内部函数仍能访问和修改外部函数的变量。

2. ​核心机制

  • 捕获变量:内部函数会“记住”外部函数的作用域(即闭包环境)。

  • 延迟绑定:闭包中的变量引用在函数调用时才解析,可能导致意外行为(需注意循环变量问题)。

3. ​示例

def outer(msg):def inner():print(msg)  # inner捕获了外部变量msgreturn innerclosure = outer("Hello")
closure()  # 输出:Hello(即使outer函数已执行完毕,msg仍被保留)

4. ​实际应用

  • 工厂函数:动态生成不同行为的函数。

def power_factory(exponent):def power(base):return base ​** exponent  # 捕获exponentreturn powersquare = power_factory(2)
print(square(3))  # 9(3^2)
  • 延迟绑定问题与解决

# 错误示例:所有闭包共享循环变量i的最终值
def create_buttons():buttons = []for i in range(3):def button():print(f"Button {i} clicked")buttons.append(button)return buttons# 解决:通过默认参数或嵌套函数绑定当前值
def create_buttons_fixed():buttons = []for i in range(3):def wrapper(x):  # 捕获当前x的值def button():print(f"Button {x} clicked")return buttonbuttons.append(wrapper(i))return buttons
1. ​状态保持计数器
def counter(start=0):count = start  # 闭包保存状态def increment():nonlocal count  # 声明为非局部变量count += 1return countreturn incrementc = counter(10)
print(c())  # 11
print(c())  # 12(闭包记住count的值)
2. ​动态配置函数
def configure_printer(prefix):def printer(message):print(f"[{prefix}] {message}")  # 闭包捕获prefixreturn printererror_log = configure_printer("ERROR")
info_log = configure_printer("INFO")error_log("File not found!")  # [ERROR] File not found!
info_log("Process started.")  # [INFO] Process started.
3. ​缓存机制
def cached(func):cache = {}  # 闭包保存缓存数据def wrapper(*args):if args not in cache:cache[args] = func(*args)return cache[args]return wrapper@cached
def factorial(n):return 1 if n <= 1 else n * factorial(n-1)print(factorial(5))  # 120(后续调用直接返回缓存结果)

二、装饰器(Decorator)

1. ​定义

装饰器是 ​一个修改其他函数行为的函数,通过接受目标函数作为参数,返回增强后的新函数,而无需修改原函数代码。

2. ​核心机制

  • 高阶函数:装饰器本身是一个返回函数的函数。

  • 语法糖:使用 @decorator 简化装饰器调用。

3. ​基本示例

def logger(func):def wrapper(*args, ​**kwargs):print(f"调用函数: {func.__name__}")return func(*args, ​**kwargs)return wrapper@logger
def add(a, b):return a + bprint(add(3, 5))  
# 输出:
# 调用函数: add
# 8

4. ​带参数的装饰器

需三层嵌套函数:

def repeat(n):def decorator(func):def wrapper(*args, ​**kwargs):result = Nonefor _ in range(n):result = func(*args, ​**kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def greet(name):print(f"Hello, {name}!")greet("Alice")
# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!

5. ​类装饰器

通过实现 __call__ 方法:

class Timer:def __init__(self, func):self.func = funcdef __call__(self, *args, ​**kwargs):import timestart = time.time()result = self.func(*args, ​**kwargs)end = time.time()print(f"{self.func.__name__} 执行时间: {end - start:.2f}s")return result@Timer
def slow_func():time.sleep(1)slow_func()  # 输出:slow_func 执行时间: 1.00s

6. ​实际应用

  • 缓存(Memoization)​

def memoize(func):cache = {}def wrapper(*args):if args not in cache:cache[args] = func(*args)return cache[args]return wrapper@memoize
def fibonacci(n):return n if n <= 1 else fibonacci(n-1) + fibonacci(n-2)
  • 权限验证

def login_required(func):def wrapper(user, *args, ​**kwargs):if user.is_authenticated:return func(user, *args, ​**kwargs)else:raise PermissionError("用户未登录")return wrapper

7. ​注意事项

  • 多个装饰器的顺序:装饰器从下往上应用,但执行顺序从上到下。

    @decorator1
    @decorator2
    def func(): pass
    # 等效于 func = decorator1(decorator2(func))
  • 保留原函数元信息:使用 functools.wraps 保留原函数名和文档。

    from functools import wraps
    def logger(func):@wraps(func)def wrapper(*args, ​**kwargs):print(f"调用函数: {func.__name__}")return func(*args, ​**kwargs)return wrapper

三、闭包与装饰器的关系

  • 装饰器依赖闭包:装饰器通常通过闭包保存目标函数和装饰器参数。

  • 闭包是装饰器的基础:装饰器返回的增强函数本质上是一个闭包,捕获了原函数和装饰逻辑。


四、总结

概念

特点

应用场景

闭包

内部函数捕获外部变量,保留状态

工厂函数、延迟计算、回调

装饰器

动态扩展函数功能,不修改原代码,支持多层装饰

日志、缓存、权限、性能测试


7. Lambda 函数

匿名函数,适用于简单操作。

square = lambda x: x ​** 2
print(square(4))  # 输出:16# 结合map使用
numbers = [1, 2, 3]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9]

8. 生成器函数

使用 yield 逐个返回值,节省内存。

def count_up_to(max):count = 1while count <= max:yield countcount += 1for num in count_up_to(3):print(num)  # 输出:1 2 3

9. 递归函数

函数调用自身,需设置终止条件。

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

10. 参数传递的注意事项

  • 可变对象​(如列表)作为参数时,函数内修改会影响原始对象。
def append_item(lst, item):lst.append(item)my_list = [1, 2]
append_item(my_list, 3)
print(my_list)  # 输出:[1, 2, 3]

11. 函数注解

提供类型提示(Python 3+)。

def greet(name: str, age: int) -> str:return f"{name} is {age} years old."

相关文章:

Python:函数(一)

python函数相关的知识点 1. 函数定义与调用 定义&#xff1a;使用 def 关键字&#xff0c;后接函数名和参数列表。 def greet(name):"""打印问候语&#xff08;文档字符串&#xff09;"""print(f"Hello, {name}!") 调用&#xff1a…...

qml c++混合编程注意事项

在Qml和C类进行数据交互时&#xff0c;通用的办法都是注册C到Qml中&#xff0c;但是很多时候C的对象是在C中进行创建&#xff0c;如果在Qml中创建了&#xff0c;数据之间的交互就会出现无法控制的问题。 信号与槽、上下文等都是数据交互的方式&#xff0c;但是当嵌套多层时&…...

Leetcode6-Z字形变换

题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 定义numRows个字符数组&#xff0c;用于存每一行的字符&#xff1b;再定义一个标志行数的变量cnt&#xff0c;cnt在0到numRows-1之间不停的加一或减一&#xff08;当cnt到0了&am…...

【eNSP实战】配置交换机端口安全

拓扑图 目的&#xff1a;让交换机端口与主机mac绑定&#xff0c;防止私接主机。 主机PC配置不展示&#xff0c;按照图中配置即可。 开始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…...

React.js 基础与进阶教程

React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库&#xff0c;专为构建用户界面&#xff08;UI&#xff09;设计&#xff0c;尤其适用于单页面应用&#xff08;SPA&#xff09;。它采用组件化开发模式&#xff0c;使 UI 结构更加清晰、可维护性更…...

Docker基础入门(一)

初识Docker 什么是Docker Docker是一个快速交付应用、运行应用的技术&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完成&…...

moment.js时间处理库

目录 一、moment().isValid()验证时间是否有效 二、moment().second()获取秒数或者设置秒数 三、moment().day()获取星期或者设置星期 四、moment().add()加法操作 五、moment().subtract()减法操作 六、moment.max()最大值 七、moment.min()最小值 八、克隆时间 一、mo…...

基于hive的电信离线用户的行为分析系统

标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展&#xff0c;用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式&#xff0c;提升电信服务质量和精准营销能力&#xff0c;本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...

循环神经网络(RNN):时序建模的核心引擎与演进之路

在人工智能处理序列数据的战场上&#xff0c;循环神经网络&#xff08;RNN&#xff09;如同一个能够理解时间的智者。从 2015 年谷歌神经机器翻译系统颠覆传统方法&#xff0c;到 2023 年 ChatGPT 实现对话连续性&#xff0c;这些突破都植根于 RNN 对时序建模的深刻理解。本文将…...

docker 安装常用镜像

我们在上篇文章中已经修改了daemon.json 安装镜像时如果search超时就直接pull 安装mysql docker pull mysql:5.7 启动命令 docker run --name mysql-docker -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 ocker run&#xff1a;运行docker容器命令 --name my…...

大数据学习(63)- Zookeeper详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…...

安卓Compose中accompanist库使用详解

安卓Compose中accompanist库使用详解 文章目录 安卓Compose中accompanist库使用详解一、Accompanist 库概览二、核心组件详解三、总结与建议 本文首发地址 https://h89.cn/archives/348.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 一、Accompanist 库概览 Acco…...

Gateway:网关路由与登录鉴权

在微服务架构中&#xff0c;用户登录和身份校验的处理方式确实与单体应用有所不同。在单体架构中&#xff0c;一旦用户通过身份验证&#xff0c;其会话信息可以在整个应用范围内共享&#xff0c;所有模块都能访问到用户信息。然而&#xff0c;在微服务架构下&#xff0c;每个服…...

【MySQL篇】MySQL内置函数

目录 1&#xff0c;日期函数 2&#xff0c;字符串函数 3&#xff0c;数学函数 4&#xff0c;其他函数 实战OJ 1&#xff0c;日期函数 日期类型在之前文章【数据类型】中有描述 传送门&#xff1a;【MySQL篇】数据类型_mysql 数据类型-CSDN博客 函数名称描述current_dat…...

爬虫案例十三js逆向模拟登录中大网校

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; js 逆向模拟登录中大网校 提示&#xff1a;以下是本篇文章正文内…...

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…...

前馈神经网络 - 参数学习(优化问题)

神经网络的参数学习比线性模型要更加困难&#xff0c;主要原因有两点:&#xff08;1)非凸优化问题和 &#xff08;2)梯度消失问题&#xff0c;本文我们来学习和分析这两类问题。 一、非凸优化问题 1、非凸优化问题演示&#xff1a; 神经网络的优化问题是一个非凸优化问题。 …...

AI 大模型统一集成|如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…...

C语言学习day25:WinAPI编程进阶06-游戏辅助窗体监视热键讲解

我们上一章已经绘制出了植物大战僵尸的一个页面 但是我们要怎么样去判断&#xff0c;用户是否按了F1呢。好的接下来就是我们的内容&#xff0c;监视热键。 思路&#xff1a; 我们按下的是键盘&#xff0c;因此我们得用键盘消息&#xff0c;也是&#xff1a;WM_KEYDOWN 同时要…...

JVM常用概念之常量

问题 final修饰的字段就一定是不能重新赋值吗? 基础知识 常量变量是使用常量表达式初始化的原始类型或 String 类型的最终变量。变量是否为常量变量可能对类初始化、二进制兼容性和明确赋值有影响。 —Java 语言规范 实验 用例源码-重新赋值 import java.lang.reflect.Fie…...

【Vue】el-dialog的2种封装方法(父子组件双向通信),$emit触发父事件/.sync修饰符双向绑定

🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐:《前端项目教程以及代码》 前言 在现代Vue.js开发中,el-dialog组件作为ElementUI库中的一个…...

解决远程主机允许路由转发 【原理扫描】:将/proc/sys/net/ipv4/ip_forward 置为0

解决远程主机允许路由转发 【原理扫描】&#xff1a;将/proc/sys/net/ipv4/ip_forward 置为0 解决远程主机允许路由转发 【原理扫描】&#xff1a;将/proc/sys/net/ipv4/ip_forward 置为0问题描述解决方案临时修改永久生效验证配置 影响 解决远程主机允许路由转发 【原理扫描】…...

c++20 Concepts的简写形式与requires 从句形式

c20 Concepts的简写形式与requires 从句形式 原始写法&#xff08;简写形式&#xff09;等效写法&#xff08;requires 从句形式&#xff09;关键区别说明&#xff1a;组合多个约束的示例&#xff1a;两种形式的编译结果&#xff1a;更复杂的约束示例&#xff1a;标准库风格的约…...

安装oVirt环境

1. oVirt Engine 硬件要求 资源最低推荐 中央处理器 双核 x86_64 CPU. 一个四核 x86_64 CPU 或多个双核 x86_64 CPU。 记忆 4 GB 的可用系统 RAM&#xff08;如果未安装 Data Warehouse 且现有进程未占用内存&#xff09;。 16 GB 的系统 RAM。 硬盘 25 GB 本地可访问的…...

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Tomcat 的工作原理:从启动到请求处理的流程

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Tomcat…...

【认识OpenThread协议】

OpenThread 是一种基于 IPv6 、IEEE 802.15.4 标准的低功耗无线 Mesh 网络协议&#xff0c;主要用于智能家居、物联网设备等场景。它的设计目标是实现设备之间的高效通信、低功耗运行和高可靠性。 OpenThread官方文档 ① 特性 低功耗: 适合电池供电的设备。 Mesh 网络: 支持多…...

Qt入门笔记

目录 一、前言 二、创建Qt项目 2.1、使用向导创建 2.2、最简单的Qt应用程序 2.2.1、main函数 2.2.2、widget.h文件 2.2.3、widget.cpp文件 2.3、Qt按键Botton 2.3.1、创建一个Botton 2.3.2、信号与槽 2.3.3、按键使用信号与槽的方法 2.4、文件Read与Write-QFile类 2…...

【前端】【nuxt】几种在 Nuxt 客户端使用console的方式

方法1&#xff1a;在Vue生命周期钩子中使用 只在客户端执行的钩子&#xff08;如mounted&#xff09;中打印&#xff1a; export default {mounted() {console.log(仅在客户端显示, this.$route.path)} }方法2&#xff1a;通过环境判断 使用process.client判断当前环境&…...

安装 ubuntu 2404 LTS 服务器 设置 服务器名称

安装 ubuntu服务器 设置 服务器名称 hostname 打开终端&#xff08;Terminal&#xff09;&#xff0c;通过快捷键CtrlAltT或在应用程序中搜索"终端"来打开&#xff1b;在终端中输入以下命令&#xff1a;hostname&#xff0c;然后按下回车键即可查看本机服务器名称。…...

C语言一维数组

学习任何数据结构,都可以分为三个主要步骤: 了解基本概念:首先,我们需要理解数据结构的基本概念。以数组为例,首先要知道什么是数组,数组的定义是什么。数组是一种存储固定大小的元素集合的数据结构,它的元素类型是统一的,且通过索引访问。 了解数组的构造和内存分布:…...

霍夫变换法是基于传统视觉特征的道路车道线检测算法中的一种经典方法

霍夫变换法是基于传统视觉特征的道路车道线检测算法中的一种经典方法&#xff0c;以下是对它的详细介绍&#xff1a; 基本原理 霍夫变换的基本思想是将图像空间中的点映射到参数空间中&#xff0c;通过在参数空间中寻找峰值来确定图像中特定形状的参数。在车道线检测中&#…...

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…...

DeepSeek引领端侧AI革命,边缘智能重构AI价值金字塔

目录 一、AI从“技术炫耀”到“价值兑现” 二、边缘侧部署&#xff1a;从技术挑战到商业必然 三、小规模模型&#xff1a;精度与效率的再平衡 四、Coovally的前瞻性&#xff1a;降低边缘AI开发门槛 五、生产级部署&#xff1a;跨越从实验室到车间的鸿沟 六、未来演进&…...

完整例子和调用关系qt OpenGL

项目结构 首先&#xff0c;你需要在 Qt 项目中创建一个类&#xff0c;继承自 QOpenGLWidget 来进行 OpenGL 渲染。文件结构如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 这是 Qt 项目的入口…...

SpringBoot缓存抽象:@Cacheable与缓存管理器配置

文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术&#xff0c;SpringBoot提供了强大的缓存抽象层&am…...

环路广播风暴演示图

以下是环路广播风暴的演示图及其说明&#xff1a; 环路广播风暴演示图 ----------------- ----------------- | Switch A | | Switch B | | | | | | [Port1]--------------------------[Port1] |…...

【webrtc debug tools】 rtc_event_log_to_text

一、rtc_event_log 简介 在学习分析webrtc的过程中&#xff0c;发现其内部提供了一个实时数据捕获接口RtcEventLog。通过该接口可以实时捕获进出webrtc的RTP报文头数据、音视频配置参数、webrtc的探测数据等。其内容实现可参考RtcEventLogImpl类的定义。其文件所在路径 loggin…...

【统计至简】【古典概率模型】联合概率、边缘概率、条件概率、全概率

联合概率、边缘概率、条件概率 联合概率边缘概率条件概率全概率 一副标准扑克牌有 54 张&#xff0c;包括 52 张常规牌&#xff08;13 个点数&#xff0c;每个点数有 4 种花色&#xff09;和 2 张王&#xff08;大、小王&#xff09;。我们从中随机抽取一张牌&#xff0c;定义以…...

Linux 字符设备驱动实例

编写驱动程序&#xff0c;并将内核模块加载到内核中&#xff0c;等待被用户程序调用。 在控制台中借助第一步申请到的设备号&#xff0c;使用 mknod 命令创建一个设备节点&#xff0c;并拟一个设备名称。 在用户程序中&#xff0c;使用 open 打开第二步中的设备名称&#xff…...

【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器---tinyEasyMuduoWebServer

【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器—tinyEasyMuduoWebServer csdn项目&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/weixin_45178775/article/details/122257814 github链接&#xff1a;https://github.com/wyewyewye/tinyEasyMuduo…...

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理&#xff0c;手册分析&#xff0c;驱动程序。初始化&#xff0c;清屏&#xff0c;ASCII字库&#xff0c;显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子&#xff0c;杜…...

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析

更多真题在线练习系统&#xff1a;历年真题在线练习系统 一、单选题 1、以下表达式的值为True的是&#xff1f;&#xff08; &#xff09; A. all( ,1,2,3) B. any([]) C. bool(abc) D. divmod(6,0) 正确答案&#xff1a;C 答案解析&#xff1a;A和B选项&#xff0c;Fal…...

苍穹外卖实战附源码-DAY1

一、打开项目的Nginx 1.通过nginx成功打开包装后的前端网页 二、导入sky的数据库 sky.sql 数据 CREATE DATABASE IF NOT EXISTS sky_take_out ; USE sky_take_out;DROP TABLE IF EXISTS address_book; CREATE TABLE address_book (id bigint NOT NULL AUTO_INCREMENT COMMEN…...

Spring 框架学习

技术体系结构 总体技术体系 单一架构 一个项目&#xff0c;一个工程&#xff0c;导出为一个 war 包&#xff0c;在一个 Tomcat 上运行&#xff0c;也叫 all in one。 单一架构&#xff0c;项目主要应用技术框架为&#xff1a;Spring、SpringMVC 、Mybatis。 分布式架构 一个…...

股票交易所官方api接口有哪些?获取和使用需要满足什么条件

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

NAT NAPT

NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 主要用于在不同网络&#xff08;如私有网络和公共互联网&#xff09;之间进行 IP 地址转换&#xff0c;解决IP 地址短缺问题&#xff0c;并提供一定的安全性。 IPv4 地址是 32 位&#xf…...

调优案例一:堆空间扩容提升吞吐量实战记录

&#x1f4dd; 调优案例一&#xff1a;堆空间扩容提升吞吐量实战记录 &#x1f527; 调优策略&#xff1a;堆空间扩容三部曲 # 原配置&#xff08;30MB堆空间&#xff09; export CATALINA_OPTS"$CATALINA_OPTS -Xms30m -Xmx30m"# 新配置&#xff08;扩容至120MB&am…...

对比 Vue2 选项式 API 与 Vue3 setup 语法

对比 Vue2 选项式 API 与 Vue3 setup 语法 1. 代码组织方式 Vue2 选项式 API 通过独立的选项&#xff08;data, methods, computed, watch, 生命周期钩子等&#xff09;组织代码。 export default {data() {return { count: 0 };},methods: {increment() { this.count; }},mou…...

ragflow-组件可视化工具 es默认用户名elastic

以下是针对各个后台组件的可视化工具及配置指南&#xff0c;基于您提供的环境变量和端口设置&#xff1a; 1. Elasticsearch 可视化工具: Kibana&#xff08;官方推荐&#xff09;、Cerebro、ElasticHQ访问方式: Kibana&#xff08;集成管理&#xff09;: URL: http://<主机…...

MATLAB代码开发实战:从入门到高效应用

一、MATLAB生态系统的核心优势 &#xff08;扩展原有内容&#xff0c;增加行业数据&#xff09; MATLAB在全球工程领域的市场占有率已达67%&#xff08;2024年IEEE统计&#xff09;&#xff0c;其核心优势体现在&#xff1a; 矩阵运算速度比传统编程快3-5倍包含22个专业工具箱…...