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

unittest测试模块:Python 标准库中的单元测试利器

在当今的软件开发中,测试的必要性不言而喻。为了确保代码的质量和稳定性,开发者需要一种高效的方式去编写和运行单元测试。Python 提供了一个强大的工具——unittest。这是一个标准库模块,专为编写和运行测试而设计,帮助开发者减少错误并提高代码的可维护性。

为什么选择 unittest?

  1. 内置支持: 作为标准库的一部分,unittest 与 Python 语言的兼容性极高,无需额外安装。
  2. 功能强大: 提供丰富的断言方法、测试夹具和错误报告,方便调试。
  3. 易于使用: 结构清晰,便于组织和运行测试。

如何使用unittest

使用 unittest 进行单元测试的基本步骤如下:

  1. 导入 unittest 模块
  2. 创建测试类,并让其继承自 unittest.TestCase
  3. 编写测试方法,方法名需以 test_ 开头。
  4. 使用断言方法,确保输出结果与预期一致。
  5. 运行测试

安装和导入

unittest 是 Python 标准库的一部分,所以不需要额外安装,可以直接导入并使用它。

import unittest

示例代码

假设我们有一个简单的函数 add,我们需要编写测试用例来验证它的正确性。文件存盘为my_math.py:

# my_math.py
def add(a, b):return a + b

现在我们编写测试用例,文件存盘为test_my_math.py:

# test_my_math.py
import unittest
from my_math import addclass TestAddFunction(unittest.TestCase):def test_add_positive_numbers(self):self.assertEqual(add(1, 2), 3)def test_add_negative_numbers(self):self.assertEqual(add(-1, -2), -3)def test_add_mixed_numbers(self):self.assertEqual(add(-1, 2), 1)def test_add_zero(self):self.assertEqual(add(0, 0), 0)def test_add_floats(self):self.assertEqual(add(1.5, 2.5), 4.0)if __name__ == '__main__':unittest.main()

 

解释

  1. 导入模块: 导入 unittest 模块和需要测试的函数 add
  2. 定义测试类TestAddFunction 继承自 unittest.TestCase
  3. 编写测试方法: 每个方法名以 test_ 开头,用于标识这是一个测试方法。
  4. 使用断言方法: 使用 assertEqual 方法来验证 add 函数的输出是否符合预期。
  5. 运行测试: 使用 unittest.main() 来运行测试。

运行测试

可以通过以下命令运行测试:

python -m unittest test_my_math.py

或者直接运行包含测试代码的文件:

python test_my_math.py

输出结果

运行测试后,会看到类似以下的输出:

....
----------------------------------------------------------------------
Ran 5 tests in 0.001sOK

这表示所有测试都通过了。如果有测试失败,会看到具体的错误信息。

其它常用断言方法

  • assertTrue(expr): 确保表达式为 True
  • assertFalse(expr): 确保表达式为 False
  • assertIsNone(expr): 确保表达式为 None
  • assertIsNotNone(expr): 确保表达式不为 None
  • assertIs(expr1, expr2): 确保两个表达式相等。
  • assertIsNot(expr1, expr2): 确保两个表达式不相等。
  • assertIn(member, container): 确保成员在容器中。
  • assertNotIn(member, container): 确保成员不在容器中。
  • assertIsInstance(obj, cls): 确保对象是某个类的实例。
  • assertNotIsInstance(obj, cls): 确保对象不是某个类的实例。

通过这些基本的步骤和方法,我们就可以编写和运行高效的单元测试来确保自己的代码质量。

CNPL解释器的测试:

编辑文件cnpl_interpreter.py 

"""
中文同像性编程语言(CNPL)解释器基于主谓宾结构和同像性数据结构的编程语言解释器
"""
import re
import math
import jsonclass CNPLParser:def __init__(self):self.ast = {}def parse(self, tokens):"""将词法单元转换为抽象语法树"""if not tokens:return None# 简单的主谓宾结构解析if len(tokens) >= 3 and tokens[1]['type'] == 'operator':return {'type': 'operation','subject': tokens[0]['value'],'predicate': tokens[1]['value'],'object': ' '.join([t['value'] for t in tokens[2:]]) if len(tokens) > 2 else None}# 处理单操作数函数if len(tokens) == 2 and tokens[1]['type'] == 'operator' and tokens[1]['value'] in ["开方", "正弦", "余弦", "正切"]:return {'type': 'unary_operation','operator': tokens[1]['value'],'operand': tokens[0]['value']}# 默认返回原始token列表return tokensclass CNPLInterpreter:def __init__(self):# 词法单元类型定义self.token_types = {"keywords": ["如果", "否则", "循环", "返回", "抛出", "导入", "从", "函数", "变量", "当", "每次"],"operators": ["加", "减", "乘", "除", "幂", "模", "开方", "正弦", "余弦", "正切"],"delimiters": ["(", ")", "{", "}", "[", "]", ",", ";", ":"],"identifier": r'^[\u4e00-\u9fa5a-zA-Z_][\u4e00-\u9fa5a-zA-Z0-9_]*$',"number": r'^[0-9]+(\.[0-9]+)?$'}# 变量表self.variables = {}# 语法分析器self.parser = CNPLParser()def lexer(self, input_str):"""词法分析器"""tokens = []pos = 0while pos < len(input_str):# 跳过空白字符match = re.match(r'\s+', input_str[pos:])if match:pos += len(match.group())continueif pos >= len(input_str):break# 检查关键字、操作符和分隔符found = Falsefor token_type in ["keywords", "operators", "delimiters"]:for token in self.token_types[token_type]:if input_str[pos:].startswith(token):tokens.append({"type": token_type[:-1], "value": token})pos += len(token)found = Truebreakif found:breakif found:continue# 检查数字(优先检查数字,因为数学函数可能包含数字)match = re.match(self.token_types["number"], input_str[pos:])if match:token = match.group()tokens.append({"type": "number", "value": token})pos += len(token)continue# 检查数学函数(如'开方'等)for op in self.token_types["operators"]:if input_str[pos:].startswith(op):tokens.append({"type": "operator", "value": op})pos += len(op)found = Truebreakif found:continue# 检查标识符match = re.match(self.token_types["identifier"], input_str[pos:])if match:token = match.group()tokens.append({"type": "identifier", "value": token})pos += len(token)continueraise Exception(f"无法识别的字符: {input_str[pos]}")return tokensdef parse_svo(self, code):"""解析主谓宾结构"""parts = code.split(" ")# 处理单操作数的数学函数if len(parts) == 2 and parts[1] in ["开方", "正弦", "余弦", "正切"]:# 先检查操作数是否为数字try:operand = float(parts[0])result = self.execute_operation(parts[0], parts[1], "")if isinstance(result, (int, float)):return float(result)elif isinstance(result, str):try:return float(result)except ValueError:raise Exception("数学函数结果必须是数字")elif isinstance(result, bool):return float(result)elif result is None:return 0.0else:raise Exception(f"无效的数学函数结果类型: {type(result)}")except ValueError:raise Exception("数学函数的操作数必须是数字")if len(parts) < 2:raise Exception("无效的主谓宾结构")subject = parts[0]predicate = parts[1]object_ = " ".join(parts[2:])return self.execute_operation(subject, predicate, object_)def execute_operation(self, subject, predicate, object_):"""执行基本操作"""# 处理条件判断if predicate == "如果":try:condition = self.interpret(subject)if isinstance(condition, bool):if condition:return self.interpret(object_)return Noneelif isinstance(condition, (int, float)):if condition != 0:return self.interpret(object_)return Noneelse:raise Exception(f"条件表达式必须返回布尔值或数字,得到: {type(condition)}")except Exception as e:raise Exception(f"条件判断执行错误: {str(e)}")# 处理循环结构if predicate == "循环" or predicate == "当":try:result = Nonewhile True:condition = self.interpret(subject)if isinstance(condition, bool):if not condition:breakelif isinstance(condition, (int, float)):if condition == 0:breakelse:raise Exception(f"循环条件必须返回布尔值或数字,得到: {type(condition)}")result = self.interpret(object_)return resultexcept Exception as e:raise Exception(f"循环执行错误: {str(e)}")# 处理单操作数函数if predicate in ["开方", "正弦", "余弦", "正切"]:print(f"====执行单操作数函数: {predicate}({subject})")try:subj_num = float(subject)print(f"====操作数转换成功: {subject} -> {subj_num}")result = Noneif predicate == "开方":result = math.sqrt(subj_num)print(f"====开方结果: {result}")elif predicate == "正弦":result = math.sin(subj_num)print(f"====正弦结果: {result}")elif predicate == "余弦":result = math.cos(subj_num)print(f"====余弦结果: {result}")elif predicate == "正切":result = math.tan(subj_num)print(f"====正切结果: {result}")# 确保返回数值类型if isinstance(result, (int, float)):return float(result)elif isinstance(result, str):try:return float(result)except ValueError:raise Exception("数学函数结果必须是数字")elif isinstance(result, bool):return float(result)elif result is None:return 0.0else:raise Exception(f"无效的数学函数结果类型: {type(result)}")except ValueError as e:print(f"====操作数转换失败: {e}")raise Exception("操作数必须是数字")# 转换为数字try:subj_num = float(subject)obj_num = float(object_)except ValueError:raise Exception("操作数必须是数字")# 执行操作if predicate == "加":return subj_num + obj_numelif predicate == "减":return subj_num - obj_numelif predicate == "乘":return subj_num * obj_numelif predicate == "除":return subj_num / obj_numelif predicate == "幂":return subj_num ** obj_numelif predicate == "模":return subj_num % obj_numelse:raise Exception(f"未实现的操作: {predicate}")def execute_homiconic_code(self, code_obj):"""执行同像性代码"""if code_obj["type"] == "代码块":return self.interpret(code_obj["content"])elif code_obj["type"] == "变量":return self.get_variable(code_obj["name"])else:raise Exception(f"未知的代码类型: {code_obj['type']}")def set_variable(self, name, value):"""设置变量"""self.variables[name] = valuedef get_variable(self, name):"""获取变量"""if name in self.variables:return self.variables[name]raise Exception(f"未定义的变量: {name}")def interpret(self, code_block):"""主解释函数"""try:if isinstance(code_block, str):# 处理数学运算表达式if re.match(r'^\d+\s+[加减乘除幂模开方正弦余弦正切]\s+\d+$', code_block) or \re.match(r'^\d+\s+[开方正弦余弦正切]$', code_block):result = self.parse_svo(code_block)print(f"==处理数学运算表达式 code_block:{code_block} 解析结果result: {result} type is:{type(result)}")if isinstance(result, (int, float)):return resulttry:return float(result)except ValueError:if isinstance(result, str) and result.replace('.', '', 1).isdigit():return float(result)raise Exception(f"无法转换为数字的结果: {result}")# 确保数学运算结果返回数值类型if isinstance(result, str) and result.replace('.', '', 1).isdigit():return float(result)elif isinstance(result, (int, float)):return resultelif isinstance(result, bool):return float(result)elif result is None:return 0.0else:raise Exception(f"无法转换为数字的结果: {result}")# 处理纯数字if re.match(r'^\d+$', code_block):return float(code_block)# 先进行词法分析tokens = self.lexer(code_block)# 生成ASTast = self.parser.parse(tokens)# 如果是操作表达式if isinstance(ast, dict) and ast.get('type') in ['operation', 'unary_operation']:return self.execute_ast(ast)# 否则回退到原始解析方式return self.parse_svo(code_block)elif isinstance(code_block, dict):return self.execute_homiconic_code(code_block)else:raise Exception("不支持的代码块类型")except Exception as e:return f"错误: {str(e)}"def execute_ast(self, ast):"""执行AST节点"""if ast['type'] == 'operation':# 处理变量引用subject = self.get_variable(ast['subject']) if ast['subject'] in self.variables else ast['subject']object_ = self.get_variable(ast['object']) if ast['object'] in self.variables else ast['object']return self.execute_operation(subject, ast['predicate'], object_)elif ast['type'] == 'unary_operation':operand = self.get_variable(ast['operand']) if ast['operand'] in self.variables else ast['operand']return self.execute_operation(operand, ast['operator'], "")# 测试代码
if __name__ == "__main__":interpreter = CNPLInterpreter()# 测试基本数学运算print("5加3的结果是:", interpreter.interpret("5 加 3"))print("10减2的结果是:", interpreter.interpret("10 减 2"))print("4乘2的结果是:", interpreter.interpret("4 乘 2"))print("8除2的结果是:", interpreter.interpret("8 除 2"))# 测试同像性数据结构code_obj = {"type": "代码块","content": "5 加 3"}print("同像性代码执行结果:", interpreter.interpret(code_obj))

编辑文件测试文件test_parser.py

"""
CNPL解释器测试文件测试词法分析、语法解析和执行功能
"""
import unittest
from cnpl_interpreter import CNPLInterpreterclass TestCNPLInterpreter(unittest.TestCase):def setUp(self):self.interpreter = CNPLInterpreter()def test_basic_math_operations(self):"""测试基本数学运算"""# self.assertEqual(self.interpreter.interpret("5 加 3"), 8)# self.assertEqual(self.interpreter.interpret("10 减 2"), 8)# self.assertEqual(self.interpreter.interpret("4 乘 2"), 8)# self.assertEqual(self.interpreter.interpret("8 除 2"), 4)# self.assertEqual(self.interpreter.interpret("2 幂 3"), 8)# self.assertEqual(self.interpreter.interpret("10 模 3"), 1)def test_math_functions(self):"""测试数学函数"""x = self.interpreter.interpret("4 开方")print(f"====x is {x}, x.type:{type(x)}")self.assertAlmostEqual(self.interpreter.interpret("4 开方"), 2.0)self.assertAlmostEqual(self.interpreter.interpret("0 正弦"), 0.0)self.assertAlmostEqual(self.interpreter.interpret("0 余弦"), 1.0)self.assertAlmostEqual(self.interpreter.interpret("0 正切"), 0.0)def test_variables(self):"""测试变量操作"""self.interpreter.set_variable("变量一", 5)self.assertEqual(self.interpreter.get_variable("变量一"), 5)code_obj = {"type": "变量", "name": "变量一"}self.assertEqual(self.interpreter.interpret(code_obj), 5)def test_homiconic_structures(self):"""测试同像性数据结构"""code_obj = {"type": "代码块","content": "5 加 3"}self.assertEqual(self.interpreter.interpret(code_obj), 8)if __name__ == "__main__":unittest.main()
执行测试:
python test_parser.py

当然现在还没完全调试好,所以测试有报错:

python test_parser.py
.==处理数学运算表达式 code_block:5 加 3 解析结果result: 8.0 type is:<class 'float'>
.====x is 错误: 无法识别的字符: 4, x.type:<class 'str'>
E.
======================================================================
ERROR: test_math_functions (__main__.TestCNPLInterpreter)
测试数学函数
----------------------------------------------------------------------
Traceback (most recent call last):File "E:\work\cntrae\test_parser.py", line 26, in test_math_functionsself.assertAlmostEqual(self.interpreter.interpret("4 开方"), 2.0)File "e:\py310\lib\unittest\case.py", line 876, in assertAlmostEqualdiff = abs(first - second)
TypeError: unsupported operand type(s) for -: 'str' and 'float'----------------------------------------------------------------------
Ran 4 tests in 0.009sFAILED (errors=1)

总结:

通过使用 unittest 模块,Python 开发者可以有效地为他们的代码编写测试,确保功能实现的正确性和代码的健壮性。无论是初学者还是经验丰富的开发者,掌握 unittest 都能为软件开发工作带来极大的帮助。希望本文能够激发你使用 unittest 来提升代码质量的兴趣!


如果你还有其他主题或具体方向想要探讨,随时告诉我!

相关文章:

unittest测试模块:Python 标准库中的单元测试利器

在当今的软件开发中&#xff0c;测试的必要性不言而喻。为了确保代码的质量和稳定性&#xff0c;开发者需要一种高效的方式去编写和运行单元测试。Python 提供了一个强大的工具——unittest。这是一个标准库模块&#xff0c;专为编写和运行测试而设计&#xff0c;帮助开发者减少…...

java后端对时间进行格式处理

时间格式处理 通过java后端&#xff0c;使用jackson库的注解JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")进行格式化 package com.weiyu.pojo;import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; import …...

Spring的简单介绍

Spring的简单介绍 Spring 是一个开源的 Java 企业级应用开发框架&#xff0c;旨在简化企业应用的开发过程。它通过提供全面的基础设施支持&#xff0c;帮助开发人员构建可靠的、高效的、可扩展的企业级应用程序。Spring 提供了多种功能模块&#xff0c;支持开发不同类型的应用…...

Python基础知识点(函数2)

#需求 打印stu_info def show_info(name,age): print(f"姓名&#xff1a;{name},年龄&#xff1a;{age}") #1.必要参数 在调用函数的时候必须传值 show_info("tom",3) #注意&#xff01;对于形参&#xff0c;除了个数要匹配&#xff0c;顺序也要匹配 …...

MySQL的左连接、右连接、内连接、外连接

一、前言 MySQL中的左连接、右连接、内连接和全外连接是用于多表关联查询的核心操作。 二、内连接&#xff08;INNER JOIN&#xff09; 定义&#xff1a;返回两个表中完全匹配的行&#xff0c;即只保留两个表连接字段值相等的行。示例场景&#xff1a;查询所有有选课记录的学…...

Springboot JPA ShardingSphere 根据年分表

Spring Boot集成JPA与ShardingSphere实现按年分表&#xff0c;需重点关注分片算法选择、时间字段映射及动态表管理。以下是实现方案&#xff1a; 一、依赖配置 1‌. 核心依赖引入‌ <!-- ShardingSphere JDBC --> <dependency><groupId>org.apache.shardi…...

巧记英语四级单词 Unit1-3【晓艳老师版】

light 光&#xff0c;轻的、 grant v.准予&#xff0c;承认 gr官人&#xff0c;ant蚂蚁&#xff0c;外面下着大雨&#xff0c;官人让蚂蚁进来了grind v.摩擦&#xff0c;磨碎 官人在里面的 磨刀&#xff0c;准备找法海给白娘子报仇slight v.稍微的&#xff0c;有点的 light 光…...

Flink 任务调度机制

一、Task 任务调度执行流程 一、Graph 的概念 Flink 中的执行图可以分为四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图。 StreamGraph:执行用户代码中的 env.execute() 方法后,根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的…...

设计模式之享元模式

1. 概念 享元模式(Flyweight Pattern), 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。 在享元模式中可以共享的相同内容称为内部状态(Intrinsic State)&…...

设计模式 - 策略模式Strategy

设计思想&#xff1a; 策略模式的就是定义一系列算法&#xff0c;将他们一个个封装起来&#xff0c;并且使它们可以相互替换&#xff0c;通常我们的代码中出现大量的if...else...或者switch语句时&#xff0c;我们都可以使用策略模式来优化代码 典型场景&#xff1a; 支付系…...

23种设计模式-行为型模式-策略

文章目录 简介场景解决代码关键实现细节 总结 简介 策略是一种行为设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#xff0c;以使算法对象能够被替换。 场景 你在开发一款导航应用&#xff0c;类似高德。你要实现自动路线规划的功…...

Ubuntu16.04配置远程连接

配置静态IP Ubuntu16.04 修改超管账户默认密码 # 修改root账户默认密码 sudo passwd Ubuntu16.04安装SSH # 安装ssh服务&#xff1a; sudo apt-get install ssh# 启动SSH服务&#xff1a; sudo /etc/init.d/ssh start # 开机自启 sudo systemctl enable ssh# 如无法连接&…...

window部署虚拟机VirtualBox来部署flink

window通过Cygwin部署flink-1.15.0失败 按理来说Cygwin可以在window模拟unix环境来部署运行flink&#xff0c; 但是在flink 不知从哪个版本开始&#xff0c;flink启动时会在window时创建临时文件夹&#xff0c;传递的文件夹名称参数中有冒号&#xff0c;导致文件夹创建失败&a…...

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…...

java基础使用- 泛型

泛型 泛型作用泛型语法(1) 泛型类/接口(2) 泛型方法 类型参数命名习惯类型通配符&#xff08;Wildcards&#xff09;(1) 无界通配符 <?>表示“未知类型”(2) 上界通配符 <? extends T>表示“T 或 T 的子类”。(3) 下界通配符 <? super T>表示“T 或 T 的父…...

Appium的学习总结-Inspector参数设置和界面使用(5)

环境搭建好后&#xff0c;怎么使用呢&#xff1f; 环境这里使用的是&#xff1a; Appium的Server端GUI 22版本 Inspector需要单独下载安装&#xff0c;GUI里并没有集成。 &#xff08;使用Appium v1.22.0,查看元素信息需要另外安装下载Appium Inspector&#xff09; 操作&…...

多孔介质电化学:原理、应用与展望

引言 多孔介质广泛存在于自然界与人工材料体系中&#xff0c;从土壤、岩石到电池电极、催化剂载体等。多孔介质电化学作为一门交叉学科&#xff0c;融合了电化学与多孔介质理论&#xff0c;聚焦于电流在充满电解液的多孔介质内的传输规律以及电化学反应在复杂多孔结构中的发生…...

使用Prometheus监控systemd服务并可视化

实训背景 你是一家企业的运维工程师&#xff0c;需将服务器的systemd服务监控集成到Prometheus&#xff0c;并通过Grafana展示实时数据。需求如下&#xff1a; 数据采集&#xff1a;监控所有systemd服务的状态&#xff08;运行/停止&#xff09;、资源占用&#xff08;CPU、内…...

网络游戏服务器如何构建全方位防御体系?DDoS与CC攻击实战防护指南

一、DDoS与CC攻击&#xff1a;游戏服务器的两大“隐形杀手” DDoS攻击&#xff1a;通过僵尸网络发起海量流量冲击&#xff0c;常见形式包括SYN Flood&#xff08;占满连接队列&#xff09;、UDP Flood&#xff08;耗尽带宽&#xff09;、DNS放大攻击&#xff08;小查询引发大流…...

geoserver搭建Docker一键直接安装并上传tif影像预览

geoserver搭建Docker一键直接安装 文章目录 geoserver搭建Docker一键直接安装前言一、Docker拉取Geoserver二、运行后使用geoserver进行数据管理进入geoserver调整语言登录geoserver上传一个tif影像建立工作空间并上传自己的tif数据建立图层预览 总结 前言 使用docker安装geos…...

ragflow本地部署(WSL下Ubuntu)

本地docker及 docker-compose版本 安装参考&#xff1a; 实践笔记-docker安装及配置镜像源实践笔记-docker-compose安装 1.下载源码 git clone https://github.com/infiniflow/ragflow.git2.运行docker-compose拉取镜像 cd ragflow/docker docker-compose up -d3.启动报错…...

面试题ing

1、js中set和map的作用和区别? 在 JavaScript 中&#xff0c;Set 和 Map 是两种非常重要的集合类型 1、Set 是一种集合数据结构&#xff0c;用于存储唯一值。它类似于数组&#xff0c;但成员的值都是唯一的&#xff0c;没有重复的值。Set 中的值只能是唯一的&#xff0c;任何…...

我的NISP二级之路-02

目录 一.数据库 二.TCP/IP协议 分层结构 三.STRIDE模型 四.检查评估与自评估 检查评估 自评估 五.信息安全应急响应过程 六.系统工程 七.SSE-CMM 八.CC标准 九.九项重点工作 记背: 一.数据库 关于数据库恢复技术&#xff0c;下列说法不正确的是&#xff1a…...

私有云平台总体建设方案

一、总体规划 二、项目建设...

前端使用正则表达式提取经纬度 度分秒值

经纬度&#xff1a;1240′0.0″&#xff0c;我想提取度分秒 const regex /(\d\.\d)\s*(\d\.\d)′\s*(\d\.\d)″/; const latMatches record.latDegreeMinuteSecond.match(regex); if (latMatches) {record.latDegree latMatches[1]; // 提取度record.latMinute latMatches[…...

如何在 Windows 11 上查找计算机的 IP 地址?

原文&#xff1a;如何在 Windows 11 上查找计算机的 IP 地址&#xff1f; | w3cschool笔记 在开始之前&#xff0c;我们先来了解一下什么是 IP 地址&#xff1a; 假设你住在一栋公寓楼里&#xff0c;快递员需要把包裹送到你家。为了确保快递能准确送到&#xff0c;你需要提供…...

JavaEE vs JavaSE:Java开发的两大世界深度解析

JavaEE vs JavaSE&#xff1a;Java开发的两大世界深度解析 &#x1f310;☕ 前言&#xff1a;Java世界的双子星座 作为一名Java开发者&#xff0c;你是否曾经困惑过JavaSE和JavaEE的区别&#xff1f;是否在选择学习路径时感到迷茫&#xff1f;别担心&#xff01;今天我们将彻…...

[环境配置] 2. 依赖库安装

依赖库安装 本文档详细介绍深度学习项目所需的核心依赖库安装过程&#xff0c;包括 CUDA、PyTorch 等组件的安装和配置。 CUDA和cuDNN安装 CUDA安装 检查显卡是否支持CUDA&#xff1a; 访问NVIDIA官网查看支持列表使用命令 nvidia-smi 查看显卡信息 下载安装CUDA Toolkit&a…...

No module named ‘keras.api._v2‘

No module named keras.api._v2 解解方法&#xff0c;同&#xff1a; No module named ‘keras.engine‘-CSDN博客...

线性方程组的解法

文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式&#xff1a;设有以下的 n n n阶线性方程组&#xff1a; A x b \mathbf{Ax}\mathbf{b} A…...

OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1

OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1 参考laval社区的文章&#xff1a;OpenHarmony带你玩转DeepSeekR1大模型 文章目录 OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1前言一、前期准备二、获取源码1.错误示范2.下载 三、编译llama.cpp1.生成makefile2.编译 四、模型文…...

Elixir语言的函数定义

Elixir语言的函数定义 Elixir是一种基于Erlang虚拟机&#xff08;BEAM&#xff09;的函数式编程语言&#xff0c;因其并发特性及可扩展性而受到广泛欢迎。在Elixir中&#xff0c;函数是程序的基本构建块&#xff0c;了解如何定义和使用函数对于掌握这门语言至关重要。本文将深…...

Spring MVC 数据绑定教程

一、数据绑定概述 将HTTP请求中的表单数据自动映射到Controller方法的参数中&#xff0c;支持多种数据类型绑定。 二、自动绑定数据类型 2.1 基本数据类型绑定 支持类型 基本类型&#xff1a;int, double 等包装类&#xff1a;Integer, Double 等String 类型 实现步骤 创…...

可发1区的超级创新思路(python 实现):基于时空解耦和对比学习的可解释性模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 目录 首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 二、模型解析 1.1 创新点深度解读 (1) 双路空间解耦架构(双路编码器…...

一个简单的php加密的理解

前言 原帖子 https://www.52pojie.cn/thread-1991616-1-1.html 一段简单的 php 代码加密&#xff0c;大佬使用了一段 python 代码给解密出来了&#xff0c;但是我没太理解整个逻辑 于是在本地跑了一遍&#xff0c;尝试理解整个解密流程&#xff0c;这里记录下整个学习过程 …...

基于微信小程序的高校寝室快修小程序研究

标题:基于微信小程序的高校寝室快修小程序研究 内容:1.摘要 随着高校规模的不断扩大&#xff0c;学生寝室数量增多&#xff0c;寝室设施维修需求日益增长。传统的维修报修方式效率低下&#xff0c;易出现信息传递不及时等问题。本文旨在研究基于微信小程序的高校寝室快修小程序…...

windows11在连接第二屏幕之后没有声音问题

博主在使用HDMI线连接第二个屏幕之后发现没有声音了。经过翻阅资料总结以下几个步骤。 1、拔开HDMI线&#xff0c;观察是否有声音&#xff0c;如果有声音就是HDMI线插上之后的声音输出设备选择问题。 观察下图&#xff1a; 声音输出设备&#xff1a;1、电脑麦克风&#xff0…...

手撕Tomcat

后端开发进阶&#xff1a;Web APP -> Web 服务器 Jerrymouse Server设计目标如下&#xff1a; 1、支持Servlet 6的大部分功能&#xff1a; 支持Servlet组件&#xff1b; 支持Filter组件&#xff1b; 支持Listener组件&#xff1b; 支持Sesssion&#xff08;仅限Cookie模式&a…...

oracle 快速创建表结构

在 Oracle 中快速创建表结构&#xff08;仅复制表结构&#xff0c;不复制数据&#xff09;可以通过以下方法实现&#xff0c;适用于需要快速复制表定义或生成空表的场景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 复制源表的全部列和数据类型&#xff0c;但不复制数据 C…...

InnoDB存储引擎的三大特性

InnoDB存储引擎的三大特性 Buffer Pool 原理&#xff1a;Buffer Poo 是InnoDB存储引擎用于缓存数据页和索引页的内存区域。他提高了数据库的读写性能&#xff0c;因为数据也和索引页在内存中读写比磁盘上快得多。需要访问数据时&#xff0c;InnoDB会在Buffer Pool 中查找&…...

算法初识-时间复杂度空间复杂度

注&#xff1a;观看Adbul Bari算法视频 算法概念 算法&#xff1a;先验分析&#xff0c;不依托于硬件&#xff0c;无语言限制&#xff0c;逻辑。 程序&#xff1a;后验测试&#xff0c;依托硬件&#xff0c;语言限制&#xff0c;实现。 特点&#xff1a; 输入-0或多个输出-至…...

MySQL8.0.40编译安装(Mysql8.0.40 Compilation and Installation)

MySQL8.0.40编译安装 近期MySQL发布了8.0.40版本&#xff0c;与之前的版本相比&#xff0c;部分依赖包发生了变化&#xff0c;因此重新编译一版&#xff0c;也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号&#xff0…...

一个简单的跨平台Python GUI自动化 AutoPy

象一下&#xff0c;你坐在电脑前&#xff0c;手指轻轻一点&#xff0c;鼠标自己动了起来&#xff0c;键盘仿佛被无形的手操控&#xff0c;屏幕上的任务自动完成——这一切不需要你费力&#xff0c;只靠几行代码就能实现。这就是AutoPy的魅力&#xff0c;一个简单却强大的跨平台…...

C++中常见函数

目录 stringstream ss(line); 为什么使用 stringstream while(ss>>num){} arr.push_back(num); numeric_limits ::min() pair result throw invalid_argument(""); vector arr;和int arr[];有什么区别&#xff1f; 数据结构的本质 内存管理 功能与易用…...

C++: 类型转换

C: 类型转换 &#xff08;一&#xff09;C语言中的类型转换volatile关键字 修饰const变量 &#xff08;二&#xff09;C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI &#xff08;一&#xff09;C语言中的类型转换 在C语言中…...

Linux驱动开发进阶(五)- 系统调用

文章目录 1、前言2、阻塞与非阻塞IO2.1、阻塞方式2.2、非阻塞方式2.3、小结 3、异步IO3.1、poll3.2、select3.3、epoll3.4、poll和epoll示例比较3.5、异步通知 4、unlocked_ioctl5、sysfs_notify 1、前言 学习参考书籍以及本文涉及的示例程序&#xff1a;李山文的《Linux驱动开…...

深度解析:文件或目录损坏且无法读取的应对之道

引言 在数字化办公与数据存储日益普及的今天&#xff0c;我们时常会遭遇各种数据问题&#xff0c;其中“文件或目录损坏且无法读取”这一状况尤为令人头疼。无论是个人用户存储在电脑硬盘、移动硬盘、U盘等设备中的重要文档、照片、视频&#xff0c;还是企业服务器上的关键业务…...

农业股龙头公司有哪些?

农业股票的龙头公司通常是指在农业领域具有较高市场份额、较强品牌影响力和较好财务表现的企业。以下是一些国内外知名的农业龙头公司&#xff1a; 国内农业龙头公司 中国中化 - 作为国内最大的化肥生产企业之一&#xff0c;主要从事化肥、种子、农药等产品的生产和销售。丰乐…...

【正点原子】如何设置 ATK-DLMP135 开发板 eth0 的开机默认 IP 地址

开机就想让 eth0 乖乖用静态 IP&#xff1f;别再被 DHCP 抢走地址了&#xff01; 三步教你彻底掌控 ATK-DLMP135 的网络启动配置&#xff0c;简单粗暴&#xff0c;实测有效&#xff01; 正点原子STM32MP135开发板Linux核心板嵌入式ARM双千兆以太网CAN 1. 删除 dhcpcd 自动获取…...

pyenv-virtualenv(python 版本管理工具)

推荐参考&#xff08;本人实测有用&#xff09; 参考文章pyenv 和 pyenv-virtualenv 的安装、配置和使用&#xff08;仅供参考&#xff09; 参考文章 pyenvpyenv-virtualenv&#xff08;仅供参考&#xff09; pyenv (windows)安装 手动安装 git clone https://github.com/pye…...