Python3 基础:函数定义与调用
Python3 基础:函数定义与调用
- 什么是函数?
- 一、函数的定义
- 二、函数的调用
- 三、函数参数
- 3.1位置参数
- 3.2关键字参数
- 3.3默认参数值
- 3.4可变数量的参数
- args:接收任意数量的位置参数
- **kwargs:接收任意数量的关键字参数
- 3.5 综合使用各种参数
- 四、返回值
- 4.1 返回多个值
- 4.2没有返回值的函数
- 五、函数作用域与变量
- 5.1 局部变量
- 5.2全局变量
- 5.3修改全局变量
- 六、函数是一等公民
- 6.1函数赋值给变量
- 6.2函数作为参数
- 6.3函数作为返回值
- 七、匿名函数(Lambda 函数)
- 八、递归函数
- 九、文档字符串(Docstring)
- 十、函数的最佳实践
- 十一、实用示例
- 示例1:基于函数的简单计算器
- 示例2:文本处理函数
- 示例3:使用高阶函数处理数据
- 小结
- 问题1: 编写一个函数,接受一个列表和一个数字n作为参数,返回列表中所有大于n的元素。
- 问题2: 使用递归函数计算一个数字的所有位数之和
- 问题3: 编写一个装饰器函数,可以计算任何函数的执行时间并打印出来。
函数是Python编程中最强大的工具之一,它允许我们将代码组织成可重用的块。想象一下,函数就像是一个专门完成特定任务的机器:你给它一些原材料(参数),它按照预设的流程处理这些材料,然后给你一个成品(返回值)。
什么是函数?
函数是一段执行特定任务的代码块,可以在程序中多次调用。函数的优点包括:
- 代码复用:一次编写,多次使用
- 模块化:将复杂问题分解成小任务
- 可维护性:修改函数不影响使用该函数的代码
- 抽象:使用者只需知道函数做什么,不需要知道如何做
一、函数的定义
在Python中,我们使用def
关键字定义函数:
def greet():"""打印一条问候信息"""print("你好,欢迎学习Python函数!")
以上代码定义了一个名为greet
的函数,它不接受任何参数,执行时会打印一条问候信息。引号之间的内容是函数的文档字符串(docstring),用于说明函数的用途。
二、函数的调用
定义函数后,我们可以通过函数名加括号来调用它:
# 调用greet函数
greet() # 输出:你好,欢迎学习Python函数!
三、函数参数
函数可以接受输入值,这些值称为参数或形参。
3.1位置参数
最简单的参数形式是位置参数,调用时按照定义顺序传递:
def add(a, b):"""返回两个数的和"""return a + b# 调用add函数
result = add(5, 3)
print(result) # 输出:8
3.2关键字参数
调用函数时可以使用参数名来指定参数,这样参数顺序就不重要了:
def describe_pet(animal_type, pet_name):"""显示宠物的信息"""print(f"我有一只{animal_type},它叫{pet_name}。")# 使用关键字参数调用
describe_pet(animal_type="猫", pet_name="咪咪")
describe_pet(pet_name="旺财", animal_type="狗") # 顺序不重要
3.3默认参数值
定义函数时可以给参数指定默认值,调用函数时如果不提供该参数的值,将使用默认值:
def greet_user(username="用户"):"""向用户发出问候"""print(f"你好,{username}!")greet_user("小明") # 输出:你好,小明!
greet_user() # 输出:你好,用户!
注意:有默认值的参数必须放在没有默认值的参数之后。
# 正确的定义方式
def function(a, b=5, c=10):pass# 错误的定义方式
def function(a=5, b, c=10): # 这会导致语法错误pass
3.4可变数量的参数
args:接收任意数量的位置参数
def sum_numbers(*args):"""计算所有参数的和"""total = 0for num in args:total += numreturn totalprint(sum_numbers(1, 2)) # 输出:3
print(sum_numbers(1, 2, 3, 4, 5)) # 输出:15
args
将接收所有额外的位置参数,并将它们打包成一个元组。
**kwargs:接收任意数量的关键字参数
def build_profile(**kwargs):"""创建一个描述用户的字典"""profile = {}for key, value in kwargs.items():profile[key] = valuereturn profileuser = build_profile(name="小明", age=18, city="北京", hobby="编程")
print(user) # 输出:{'name': '小明', 'age': 18, 'city': '北京', 'hobby': '编程'}
**kwargs
将接收所有额外的关键字参数,并将它们打包成一个字典。
3.5 综合使用各种参数
参数定义的顺序应该是:位置参数、默认参数、*args、**kwargs
def example_function(a, b, c=0, *args, **kwargs):print(f"a = {a}, b = {b}, c = {c}")print(f"args = {args}")print(f"kwargs = {kwargs}")example_function(1, 2, 3, 4, 5, x=6, y=7)
# 输出:
# a = 1, b = 2, c = 3
# args = (4, 5)
# kwargs = {'x': 6, 'y': 7}
四、返回值
函数可以使用return
语句返回值。返回值可以是任何类型的数据。
def square(number):"""返回数字的平方"""return number ** 2result = square(4)
print(result) # 输出:16
4.1 返回多个值
Python函数可以返回多个值,实际上是返回一个元组:
def get_dimensions(width, height):"""计算面积和周长"""area = width * heightperimeter = 2 * (width + height)return area, perimeterarea, perimeter = get_dimensions(5, 3)
print(f"面积:{area},周长:{perimeter}") # 输出:面积:15,周长:16
4.2没有返回值的函数
如果函数没有return
语句,或者return
后面没有表达式,函数会返回None
:
def greet(name):print(f"你好,{name}!")# 没有return语句result = greet("小明")
print(result) # 输出:None
五、函数作用域与变量
Python中的变量有作用域,决定了变量在哪些区域可以被访问。
5.1 局部变量
函数内部定义的变量称为局部变量,只能在函数内部访问:
def my_function():x = 10 # 局部变量print(x)my_function() # 输出:10
# print(x) # 错误:x只存在于函数内部
5.2全局变量
在函数外部定义的变量称为全局变量,可以在整个模块中访问:
y = 20 # 全局变量def print_global():print(y) # 可以访问全局变量print_global() # 输出:20
5.3修改全局变量
要在函数内部修改全局变量,需要使用global
关键字:
counter = 0 # 全局变量def increment():global countercounter += 1print(f"计数器:{counter}")increment() # 输出:计数器:1
increment() # 输出:计数器:2
但要注意,过度使用全局变量会使代码难以理解和维护,一般情况下应该避免修改全局变量。
六、函数是一等公民
在Python中,函数是"一等公民",意味着函数可以:
- 赋值给变量
- 作为参数传递给其他函数
- 作为其他函数的返回值
6.1函数赋值给变量
def say_hello(name):return f"你好,{name}!"# 将函数赋值给变量
greeter = say_hello
result = greeter("小明")
print(result) # 输出:你好,小明!
6.2函数作为参数
def apply_twice(func, arg):"""对参数应用函数两次"""return func(func(arg))def add_five(x):return x + 5result = apply_twice(add_five, 10)
print(result) # 输出:20 (10+5+5)
6.3函数作为返回值
def get_math_function(operation):"""返回一个数学函数"""def add(x, y):return x + ydef subtract(x, y):return x - yif operation == "add":return addelse:return subtract# 获取加法函数
add_function = get_math_function("add")
result = add_function(5, 3)
print(result) # 输出:8
七、匿名函数(Lambda 函数)
当需要一个简单的函数,又不想正式定义一个函数时,可以使用lambda表达式:
# 常规函数
def square(x):return x ** 2# 等价的lambda函数
square_lambda = lambda x: x ** 2print(square(5)) # 输出:25
print(square_lambda(5)) # 输出:25
lambda函数常用于需要函数对象的场合,如排序或过滤:
# 按照姓名长度排序
names = ["张三", "李四", "王小明", "赵云"]
names.sort(key=lambda name: len(name))
print(names) # 输出:['张三', '李四', '赵云', '王小明']# 过滤列表中的偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出:[2, 4, 6, 8, 10]
八、递归函数
递归是一种函数调用自身的技术。递归需要有基本情况(停止条件)和递归情况:
def factorial(n):"""计算阶乘 n!"""if n == 0 or n == 1: # 基本情况return 1else: # 递归情况return n * factorial(n-1)print(factorial(5)) # 输出:120 (5*4*3*2*1)
递归函数的另一个例子是计算斐波那契数列:
def fibonacci(n):"""返回斐波那契数列的第n个数"""if n <= 0:return "输入必须是正整数"elif n == 1:return 0elif n == 2:return 1else:return fibonacci(n-1) + fibonacci(n-2)for i in range(1, 11):print(f"fibonacci({i}) = {fibonacci(i)}")
注意:Python的默认递归深度限制较小(通常是1000),深递归可能导致栈溢出。对于复杂的递归问题,考虑使用迭代方法或记忆化技术优化。
九、文档字符串(Docstring)
良好的函数应该有文档字符串,说明函数的功能、参数和返回值:
def calculate_area(length, width):"""计算矩形的面积。参数:length (float): 矩形的长度width (float): 矩形的宽度返回:float: 矩形的面积"""return length * width
文档字符串可以通过help()
函数或__doc__
属性查看:
help(calculate_area)
print(calculate_area.__doc__)
十、函数的最佳实践
- 单一职责原则:每个函数应该只做一件事,并且做好
- 函数名应清晰表明其功能:如
calculate_tax
比calc_t
更好 - 参数数量适中:通常不超过5个参数
- 提供适当的默认值:让常用情况调用更简单
- 返回值与函数名一致:如
get_
开头的函数应该返回值而不是修改参数 - 添加文档字符串:说明函数的用途、参数和返回值
- 异常处理:合理处理错误情况
- 避免副作用:尽量不要在函数内修改全局状态
十一、实用示例
示例1:基于函数的简单计算器
def add(x, y):"""将两个数相加"""return x + ydef subtract(x, y):"""从第一个数中减去第二个数"""return x - ydef multiply(x, y):"""将两个数相乘"""return x * ydef divide(x, y):"""将第一个数除以第二个数"""if y == 0:return "错误:除数不能为零"return x / ydef calculator():"""简单计算器函数"""print("选择操作:")print("1. 加法")print("2. 减法")print("3. 乘法")print("4. 除法")choice = input("输入选项(1/2/3/4): ")num1 = float(input("输入第一个数字: "))num2 = float(input("输入第二个数字: "))if choice == '1':print(f"{num1} + {num2} = {add(num1, num2)}")elif choice == '2':print(f"{num1} - {num2} = {subtract(num1, num2)}")elif choice == '3':print(f"{num1} * {num2} = {multiply(num1, num2)}")elif choice == '4':print(f"{num1} / {num2} = {divide(num1, num2)}")else:print("无效的输入")# 运行计算器
calculator()
示例2:文本处理函数
def word_counter(text):"""计算文本中的单词数量"""if not text:return 0words = text.split()return len(words)def character_frequency(text):"""计算每个字符在文本中出现的频率"""freq = {}for char in text:if char in freq:freq[char] += 1else:freq[char] = 1return freqdef is_palindrome(text):"""检查文本是否为回文"""# 移除空格并转换为小写text = text.lower().replace(" ", "")return text == text[::-1]# 测试这些函数
sample_text = "Madam, I'm Adam"
print(f"单词数: {word_counter(sample_text)}")
print(f"字符频率: {character_frequency(sample_text)}")
print(f"是否为回文: {is_palindrome(sample_text)}")
示例3:使用高阶函数处理数据
def process_data(data, operations):"""对数据应用一系列操作参数:data: 要处理的数据operations: 要应用的函数列表返回:处理后的数据"""result = datafor operation in operations:result = operation(result)return result# 定义一些操作函数
def remove_duplicates(items):"""移除列表中的重复元素"""return list(set(items))def sort_items(items):"""对列表元素排序"""return sorted(items)def keep_positive(numbers):"""只保留正数"""return [n for n in numbers if n > 0]# 测试数据处理
data = [3, -1, 7, 2, -5, 7, 3, 6, -8, 2]
operations = [remove_duplicates, sort_items, keep_positive]
result = process_data(data, operations)
print(f"原始数据: {data}")
print(f"处理后: {result}")
小结
函数是Python编程的基石,是代码复用和模块化的关键机制。通过合理设计和使用函数,你可以使代码更加清晰、简洁和可维护。本文介绍了函数的基本概念、参数传递、返回值、作用域和高级技巧,涵盖了Python函数编程的核心内容。
随着编程经验的积累,你会逐渐掌握如何设计好的函数和如何有效组合函数来解决复杂问题。函数不仅是处理代码重复的工具,更是表达程序逻辑和构建软件架构的重要组成部分。
思考题:
- 编写一个函数,接受一个列表和一个数字n作为参数,返回列表中所有大于n的元素。
- 使用递归函数计算一个数字的所有位数之和(例如:123的位数之和是1+2+3=6)。
- 编写一个装饰器函数,可以计算任何函数的执行时间并打印出来。
问题1: 编写一个函数,接受一个列表和一个数字n作为参数,返回列表中所有大于n的元素。
方法一:使用循环
def get_greater_than(numbers, n):"""返回列表中所有大于n的元素Args:numbers: 数字列表n: 比较基准值Returns:包含所有大于n的元素的列表"""result = []for num in numbers:if num > n:result.append(num)return result# 测试
numbers = [1, 5, 10, 3, 7, 2, 9]
print(get_greater_than(numbers, 5)) # 输出: [10, 7, 9]
方法二:使用列表推导式
def get_greater_than(numbers, n):"""返回列表中所有大于n的元素Args:numbers: 数字列表n: 比较基准值Returns:包含所有大于n的元素的列表"""return [num for num in numbers if num > n]# 测试
numbers = [1, 5, 10, 3, 7, 2, 9]
print(get_greater_than(numbers, 5)) # 输出: [10, 7, 9]
方法三:使用filter函数
def get_greater_than(numbers, n):"""返回列表中所有大于n的元素Args:numbers: 数字列表n: 比较基准值Returns:包含所有大于n的元素的列表"""return list(filter(lambda x: x > n, numbers))# 测试
numbers = [1, 5, 10, 3, 7, 2, 9]
print(get_greater_than(numbers, 5)) # 输出: [10, 7, 9]
问题2: 使用递归函数计算一个数字的所有位数之和
方法一:基本递归实现
def sum_digits(n):"""计算一个数字的所有位数之和Args:n: 要计算的数字Returns:所有位数之和"""# 处理负数if n < 0:n = -n# 基本情况:当n小于10时,直接返回nif n < 10:return n# 递归情况:返回最后一位加上其余位数的和return n % 10 + sum_digits(n // 10)# 测试
print(sum_digits(123)) # 输出: 6 (1+2+3)
print(sum_digits(9876)) # 输出: 30 (9+8+7+6)
print(sum_digits(-123)) # 输出: 6 (1+2+3)
方法二:使用字符串转换
def sum_digits(n):"""计算一个数字的所有位数之和Args:n: 要计算的数字Returns:所有位数之和"""# 处理负数if n < 0:n = -n# 转换为字符串n_str = str(n)# 基本情况:只有一位数if len(n_str) == 1:return n# 递归情况:第一位加上剩余位数的和return int(n_str[0]) + sum_digits(int(n_str[1:]))# 测试
print(sum_digits(123)) # 输出: 6 (1+2+3)
print(sum_digits(9876)) # 输出: 30 (9+8+7+6)
问题3: 编写一个装饰器函数,可以计算任何函数的执行时间并打印出来。
import time
import functoolsdef timing_decorator(func):"""装饰器函数,用于计算被装饰函数的执行时间Args:func: 被装饰的函数Returns:包装后的函数"""@functools.wraps(func) # 保留原函数的元数据def wrapper(*args, **kwargs):start_time = time.time() # 记录开始时间result = func(*args, **kwargs) # 执行被装饰的函数end_time = time.time() # 记录结束时间execution_time = end_time - start_time # 计算执行时间print(f"函数 '{func.__name__}' 的执行时间: {execution_time:.6f} 秒")return result # 返回原函数的结果return wrapper# 测试装饰器
@timing_decorator
def slow_function(delay):"""一个模拟耗时操作的函数"""time.sleep(delay) # 模拟耗时操作return f"完成了 {delay} 秒的操作"@timing_decorator
def calculate_sum(n):"""计算从1到n的和"""total = 0for i in range(1, n + 1):total += ireturn total# 测试函数
print(slow_function(1)) # 会输出执行时间约1秒
print(calculate_sum(1000000)) # 会输出计算结果和执行时间
高级版本:支持参数的装饰器
import time
import functoolsdef timing_decorator(print_args=False):"""带参数的装饰器工厂函数,用于计算被装饰函数的执行时间Args:print_args: 是否打印函数参数Returns:装饰器函数"""def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()execution_time = end_time - start_timeif print_args:args_repr = [repr(a) for a in args]kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]signature = ", ".join(args_repr + kwargs_repr)print(f"函数 '{func.__name__}({signature})' 的执行时间: {execution_time:.6f} 秒")else:print(f"函数 '{func.__name__}' 的执行时间: {execution_time:.6f} 秒")return resultreturn wrapper# 处理不带参数的调用方式 @timing_decoratorif callable(print_args):func = print_argsprint_args = Falsereturn decorator(func)# 处理带参数的调用方式 @timing_decorator(print_args=True)return decorator# 测试不同的调用方式
@timing_decorator
def function1(n):"""测试基本装饰器"""time.sleep(n)return n@timing_decorator(print_args=True)
def function2(n, m=1):"""测试带参数的装饰器"""time.sleep(n)return n * m# 测试函数
print(function1(0.5)) # 输出执行时间但不显示参数
print(function2(0.5, m=2)) # 输出执行时间和参数
这个高级版本的装饰器支持两种调用方式:
- 简单方式:
@timing_decorator
- 带参数方式:
@timing_decorator(print_args=True)
同时,当print_args=True
时,它还会打印出函数调用的参数,便于更详细的性能分析。
相关文章:
Python3 基础:函数定义与调用
Python3 基础:函数定义与调用 什么是函数?一、函数的定义二、函数的调用三、函数参数3.1位置参数3.2关键字参数3.3默认参数值3.4可变数量的参数args:接收任意数量的位置参数**kwargs:接收任意数量的关键字参数 3.5 综合使用各种参…...
Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开
以下是 Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开: 1. Vue 2 的响应式 API 核心机制 基于 Object.defineProperty: 通过劫持对象的 getter 和 setter 实现数据变化追踪。限制&…...
修改了Element UI中组件的样式,打包后样式丢失
修改了Element UI中组件的样式,在本地运行没有问题,但是打包到线上发现样式丢失(样式全部不生效、或者有一部分生效,一部分不生效),问题在于css的加载顺序导致代码编译后样式被覆盖了, 解决办法…...
大模型工业化元年:GPT-5开启通用AI新纪元,中国技术如何破局?
过去一周,AI领域的焦点无疑是OpenAI发布的GPT-5预览版,以及全球大模型技术从实验室迈向工业化的关键转折。这场变革不仅标志着通用人工智能(AGI)的进一步逼近,更掀起了全球产业链的竞争与反思。本文将从技术突破、产业…...
离线电脑安装python包
离线电脑安装python第三方库 在联网电脑上下载Python包 使用pip安装所需的包,例如 pip install requests numpy导出已安装的包列表 pip freeze > requirements.txt根据requirements.txt下载包及其所有依赖项到指定目录: pip download -r require…...
【Unity AR开发插件】一、高效热更新:Unity AR 插件结合 HybridCLR 与 ARFoundation 的开源仓库分享
摘要 本篇博客详细介绍了我基于 HybridCLR 与 AR Foundation 的 Unity AR 开发插件,旨在为开发者提供高效的跨平台热更新方案。文章从背景与动机出发,覆盖一键安装工具、环境配置、热更新数据制作与示例程序运行等核心模块,并展示代码结构与使…...
深入浅出学会函数(下)
5. return语句 在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项。 return 后面可以是一个数值,也可以是一个表达式,如果是表达式先执行表达式,再返回表达式的结果。return 后面也可以…...
架构-软件工程
一、软件过程模型(核心高频考点) 1. 瀑布模型 知识点:严格分阶段(需求→设计→编码→测试→维护),前一阶段输出是后一阶段输入,阶段间因果紧密,适合需求明确且稳定的项目。缺点&am…...
Redis 及其在系统设计中的作用
什么是Redis Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息代理。它因其快速的性能、灵活性和易用性而得到广泛应用。 Redis 数据存储类型 Redis 允许开发人员以各种数据结构(例如字符串、位图、位域、哈希、列表、集合、有序集合…...
运维打铁:Centos 7 使用yum安装 mysql5.7
文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…...
第二章:MCP服务器分类
Chapter 2: MCP服务器分类 🌟 从上一章到本章 在第一章:Model Context Protocol (MCP)中,我们学习了如何通过MCP让LLM安全访问文件系统。现在,让我们想象一个更复杂的需求:假设你需要让LLM同时处理文件、查询数据库、…...
遨游三防|30200mAh、双露营灯三防平板,见证堆料天花板
在工业4.0与智能化转型的浪潮中,专业设备对性能、防护及场景适应性的要求日益严苛。遨游通讯作为国家级高新技术企业,依托“危、急、特”场景的深耕经验,推出的旗舰级产品AORO-P300三防平板,以30200mAh超大容量电池、双露营灯设计…...
OFDM 信道表示(3)
上节我们令得到频域相关系数与PDP是一对傅里叶变换对。这次我们令即只考虑同一个RE上随时间变化得过程。 为接收信号自相关函数,令即为上式 所以可得Doppler 功率谱和子相关函数一对傅里叶变换对。 上面给出多径DPL信道接受信号表示,其中为t时间多径时延…...
MongoDB副本集搭建与核心机制
一、节点架构解析 1.1 节点角色分工 主节点(Primary) 唯一写入口:处理所有写操作(插入/更新/删除) Oplog生成器:记录操作日志到local.oplog.rs集合 同步中枢:向所有从节点推送oplog变更 典型…...
深度学习-数值稳定性和模型初始化
到目前为止,我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数,有人会认为初始化方案时理所当然的,忽略了如何做出这些选择的细节,甚至有人可能会觉得,初始化方案的选择并不是特别重要,实际…...
详解Linux中的定时任务管理工具crond
在 Linux 容器环境中,/etc/cron.d/ 目录可能不存在,特别是在精简的容器镜像(如 Alpine、BusyBox 或某些定制化的镜像)中。这是因为容器通常追求轻量级,默认不包含完整的 cron 系统(如 cronie 或 vixie-cron…...
【element plus】解决报错error:ResizeObserver loop limit exceeded的问题
当我们在使用element plus框架时,有时会遇到屏幕突然变暗,然后来一句莫名其妙的报错ResizeObserver loop limit exceeded,其实这是因为改变屏幕大小时el-table导致的报错 网上给出了几种解决方案,我试了其中两种可以实现 方案一&…...
GD32E23x flash作为静态存储的读写操作
目录 一、前言 二、GD32E23x flash扇区地址划分 三、GD32E23x 固件库下载 四、GD32E23x falsh擦写操作函数封装 五,引用示例 一、前言 在只有芯片没有外部存储时需要存储一些配置信息,使用flash进行存储是很好的选择了,在GD32E23x中以flash…...
空闲列表:回收和再利用
空闲列表:回收和再利用 手动与自动内存管理 手动管理:程序员需要明确地分配和释放内存。自动管理:例如使用垃圾收集器(GC),它能够自动检测并回收未使用的对象,不需要程序员干预。 对于某些数据结构如B树,…...
功能脑网络较新的方法[和ai讨论的方向和学习资源]
文章目录 前言和回顾代码实现ai 提问大脑连通性分析方法扩展与分类指南一、现有方法的补充与分类1. 补充的其他连通性方法2. 分类框架 二、近年来的新方法(2019年后)1. 相位动力学扩展2. 信息论与复杂度3. 基于图论与网络科学4. 动态系统与因果推断 三、…...
【MongoDB + Spark】 技术问题汇总与解决方案笔记
场景背景 最近练手项目:Spark 结合 MongoDB 构建商品推荐系统的过程中,过程中出现多种环境配置与兼容性问题,主要涉及 MongoDB 连接、版本兼容性、Casbah 驱动使用问题等。汇总调试过程中遇到的常见错误及其解决方案,供参考复用。…...
给git配置SSH(github,gitee)
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 本文基于mac,linux和win可以参考 个人同时配置gitee和github的ss…...
Linux基础使用-笔记
1. 文件和目录操作 查看当前目录:pwd 命令用于显示当前工作目录的完整路径。 pwd切换目录:cd 命令用于切换工作目录。 # 切换到指定目录 cd /home/user/Documents # 切换到上一级目录 cd .. # 切换到用户主目录 cd ~列出目录内容:ls 命令用…...
什么是Maven
Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。Maven 是目前最流行的自动化构建工具࿰…...
DNS主从同步及解析
DNS 域名解析原理 域名系统的层次结构 :DNS 采用分层树状结构,顶级域名(如.com、.org、.net 等)位于顶层,下面是二级域名、三级域名等。例如,在域名 “www.example.com” 中,“com” 是顶级域名…...
Git 的基本概念和使用方式
Git 是一种分布式版本控制系统,广泛用于跟踪文件的变化和协作开发项目。以下是 Git 的基本概念和使用方式: 仓库(Repository):Git 用来存储项目文件和历史记录的地方。可以是本地仓库(Local Repository)或远程仓库(Remote Repository)。 工作区(Working Directory):…...
【C++】二叉树进阶面试题
根据二叉树创建字符串 重点是要注意括号省略问题,分为以下情况: 1.左字树为空,右子树不为空,左边括号保留 2.左右子树都为空,括号都不保留 3。左子树不为空,右子树为空,右边括号不保留 如果根节…...
时序数据库IoTDB构建的能源电力解决方案
随着能源格局的快速变化与“双碳”战略的逐步践行,电力系统的绿色低碳转型已成为重要发展趋势。在这一背景下,数字化、智能化技术正逐步扩大在新型电力系统发电侧、电网侧、储能侧的应用,以推动传统电力发输配用向全面感知、双向互动、智能高…...
【KWDB 创作者计划】_上位机知识篇---Github
文章目录 前言1. GitHub 核心功能(1) 代码托管(Git 仓库)存储代码版本控制代码浏览(2) 协作开发Pull RequestlssuesProjectsDiscussions(3) 自动化与 CI/CDGitHub ActionsGitHub PagesDependabot(4) 社区与开源ForkStarWatchSponsor2. GitHub 基本使用方法(1) 创建仓库(Repo…...
vxe-table封装表头
待补充使用说明,但是可以用 一.效果二.封装MyTable.vue1.封装index.vue2.日期选择筛选3.输入筛选4.下拉筛选5.多选筛选6.远程多选筛选7.远程单选筛选 三、页面使用1.具体页面使用2./utils/filter.js 注意:需要使用jsx、vxe-table、element-plus 一.效果 …...
力扣hot100 91-100记录
91-100 (动态规划) class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> f(m, vector<int>(n, 1));for(int i 1; i < m; i){for(int j 1; j < n; j){f[i][j] f[i-1][j] f[i][j-1];} }return f[…...
SpringMVC处理请求映射路径和接收参数
目录 springmvc处理请求映射路径 案例:访问 OrderController类的pirntUser方法报错:java.lang.IllegalStateException:映射不明确 核心错误信息 springmvc接收参数 一 ,常见的字符串和数字类型的参数接收方式 1.1 请求路径的…...
ESP32上C语言实现JSON对象的创建和解析
在ESP32上使用C语言实现JSON对象的创建和解析,同样可以借助cJSON库。ESP-IDF(Espressif IoT Development Framework)本身已经集成了cJSON库,你可以直接使用。以下是详细的步骤和示例代码。 1. 创建一个新的ESP-IDF项目 首先&…...
关于Qt对Html/CSS的支持
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、原生控件二、QtWebEngine总结 前言 最近遇到了一些问题需要使用Qt加载Html发现一些特性不能使用,估计很多人也和我一样遇到这种情况。需要说明…...
Python 读取 txt 文件详解 with ... open()
文章目录 1 概述1.1 注意事项1.2 模式说明1.3 文件准备 2 读文件2.1 读取整个文件2.2 逐行读取2.3 读取所有行到列表 3 写文件3.1 覆盖写入3.2 追加写入3.3 写入多行 4 实用技巧4.1 检查文件是否存在4.2 异常处理 1 概述 1.1 注意事项 文件编码:建议指定编码&…...
[Mac] 使用homebrew安装miniconda
使用虚拟环境可以对不同项目的依赖进行隔离。可以使用venv或者conda来创建和使用虚拟环境。 venv是Python内置的虚拟环境管理模块,适合纯Python项目以及快速轻量级的开发和部署。conda具备更强大的版本管理能力,但是占用较大的磁盘空间。 考虑到我基本不…...
如何获取适用于广告过滤增强的Chrome浏览器版本【广告净化】
不少人使用浏览器时,会遇到广告弹窗、视频前贴广告或页面跳转。这些情况会影响上网体验。想要改善,可以从选择合适版本的谷歌浏览器开始,并加上合理设置。 先打开电脑上的浏览器,在搜索栏中输入“谷歌浏览器官方下载页面”。找到带…...
JVM(Java虚拟机)详解
目录 1 JVM执行流程 2 JVM运行时数据区(内存布局) 2.1 堆 2.2 栈 2.3 方法区 2.4 程序计数器 2.5 Java和运行时数据区相关的异常 3 JVM类加载(Class Loading) 3.1 加载Loading 3.2 连接Linking 3.2.1 验证Verification…...
Vue3 + TypeScript,使用provide提供只读的响应式数据的详细分析与解决方法
原始无类型写法(不报错) typescript const applySampleTableData ref<ApplySample[]>([]); const applySampleListSymbol Symbol("applySampleList"); provide(applySampleListSymbol, readonly(applySampleTableData)); 类型推断&a…...
深入理解 BLE PHY 模式:1M、2M 与 Coded 的演进与应用
随着蓝牙技术不断演进,BLE(Bluetooth Low Energy)在物联网、可穿戴设备、智能家居等领域的应用愈发广泛。BLE 中的 PHY(Physical Layer,物理层)是决定无线传输速率、覆盖范围和功耗的核心因素。本文将以浅显易懂的语言,结合示意图和代码示例,系统梳理 BLE 三种 PHY 模式…...
人工智能与机器学习:二元分类决策树构建指南
引言 在人工智能与机器学习的领域里,算法犹如智慧的钥匙,开启着数据洞察的大门。决策树作为其中一颗璀璨的明珠,以其独特的非线性处理能力和可解释性备受瞩目。今天,让我们跟随作者的脚步,深入探究如何构建一个用于二…...
Ubuntu下软件运行常见异常退出问题汇总分析
软件在Ubuntu下运行时,可能会遇到各种异常退出情况,常见可分为以下几点: 目录 一、系统资源耗尽导致退出 二、权限导致无法运行 三、找不到依赖的动态库 四、编译可执行文件时,动态库所引用的头文件与动态库不匹配 一、系统资…...
机器学习漏洞大汇总——利用机器学习服务
在本节中,我们将展示机器学习框架中存在的漏洞,这些漏洞会直接处理模型工件,或者通过工件存储或模型注册表的凭证来处理。利用此类漏洞,攻击者可以在企业系统内部进行非常强大的横向移动,从而劫持被利用的模型注册表中的机器学习模型。 WANDB Weave 目录遍历 - CVE-2024-…...
类的六个默认成员函数
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认…...
精益数据分析(21/126):剖析创业增长引擎与精益画布指标
精益数据分析(21/126):剖析创业增长引擎与精益画布指标 大家好!在创业和数据分析的探索道路上,我一直希望能和大家携手共进,共同学习。今天,我们继续深入研读《精益数据分析》,剖析…...
SAIL-RK3588协作机器人运动控制器技术方案
一、核心能力与政策适配 政策合规性 满足工信部《智能机器人重点技术攻关指南》要求,支持 EtherCAT主站协议(符合IEC 61158标准),助力企业申报工业机器人研发专项补贴(最高300万元/项目)核心板…...
手搓箱图并输出异常值(MATLAB)
看下需求 想要复刻这种箱图,咱们直接开始手搓 %% 可修改 % 生成模拟数据(假设5个用户群体的发帖数) data {randn(100,1)*10 30, ... % 核心用户randn(200,1)*5 10, ... % 边缘用户randn(150,1)*8 20, ... % 积极社交用户randn(8…...
Java:XML被自动转义
在Java中处理XML响应被自动转义的问题时,需结合XML规范及工具特性进行针对性处理。以下是常见原因及解决方案的总结: 一、XML自动转义的原因 字符安全性处理 XML中的保留字符(如 <、>、&)会被自动转义为实体&a…...
Day-3 应急响应实战
应急响应实战一:Web入侵与数据泄露分析 1. Web入侵核心原理 漏洞利用路径 未授权访问:弱口令(如空密码/默认口令)、目录遍历漏洞代码注入攻击:JSP/ASP木马、PHP一句话木马(利用eval($_POST[cmd])&…...
【软件设计师】模拟题一
以下是 10道软考-软件设计师模拟试题,涵盖高频考点和易错点,附带答案和解析: 一、软件工程 1. 在软件开发生命周期中,瀑布模型的主要特点是( ) A. 强调快速原型迭代 B. 阶段间有明…...