ROS2 库包设置和使用 Catch2 进行单元测试

说明

        本文的目的是了解如何在 ROS2 中创建库,以供其他 ROS2 包使用。除此之外,本文还介绍了如何使用 catch2 框架编写单元测试。本文的第 1 部分将详细介绍如何创建库包。第 2 部分将介绍 ROS2 软件包如何利用创建的库

上篇  ROS2 库包设置和使用 Catch2 进行单元测试

一、项目结构大纲

库的流程

  1. 在包含/点下为 2d 点创建标题.hpp
  2. 在 src/point 下为 2d 点添加实现类.cpp
  3. 为测试下的测试类/主类创建入口点.cpp
  4. 在测试/test_point.cpp下添加单元测试
  5. 在 cmake/try_out_utils-config.cmake.in 下为 cmake 添加命名空间配置
  6. 在根项目目录下创建 CMakeLists.txt (此处指定了 lib 的配置)
  7. 在根项目目录下创建包.xml

 二、程序代码实现

2.1 为 2d 点创建标题.hpp

// include/try_out_utils/point.hpp#ifndef TRY_OUT_UTILS__POINT_HPP_
#define TRY_OUT_UTILS__POINT_HPP_namespace try_out_utils
{
class Point
{
private:double x_;double y_;public:Point(double x, double y);double get_x();double get_y();
};
}  // namespace try_out_utils#endif  // TRY_OUT_UTILS__POINT_HPP_

 2.2 为 2d 点添加实现类.cpp

        具有两个私有变量 x 和 y 的标头类,用于表示 2d 中的点及其 getter 和 setter 方法

// src/point.cpp
#include <try_out_utils/point.hpp>
Point::Point(double x, double y)
{this->x_ = x;this->y_ = y;
}
double Point::get_x()
{return this->x_;
}
double Point::get_y()
{return this->y_;
}

之前在标头类中声明的 2d 点的实现类

// test/main.cpp
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

测试用例的 Catch2 入口点

// test/test_point.cpp
#include <catch2/catch.hpp>
#include <try_out_utils/point.hpp>
TEST_CASE("Test for point", "[]")
{SECTION("Test for point with object creation"){Point p(11, 10);REQUIRE(p.get_x() == 11);REQUIRE(p.get_y() == 10);}
}

对点类进行单元测试以创建新的点对象

@PACKAGE_INIT@get_filename_component(try_out_utils_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)include(CMakeFindDependencyMacro)if(NOT TARGET try_out_utils::try_out_utils)include("${try_out_utils_CMAKE_DIR}/try_out_utils-targets.cmake")
endif()check_required_components(try_out_utils)

三、编译文件CMake

Cmake 配置别名,以便外部包可以引用该库作为 try_out_utils::try_out_utils

# setting up cmake minimum version and project name
cmake_minimum_required(VERSION 3.8)
project(try_out_utils VERSION 0.1.0)# setting c++ version standard to 17
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 17)
endif()# adding compiler arguments
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# added to use install directory variables
include(GNUInstallDirs)# adding external dependencies required
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(ament_cmake_catch2 REQUIRED)
find_package(Catch2 REQUIRED)# creating library package with reference to required files
add_library(${PROJECT_NAME} SHAREDsrc/point.cpp
)# including external directories reference for the created library
target_include_directories(try_out_utils PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)# helpers functions for creating config files that can be included by other projects to find and use a package
include(CMakePackageConfigHelpers)set(INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake")
set(PACKAGE_CONFIG_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
set(PACKAGE_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake")# creating version configuration for external package to perform compatibility check
configure_package_config_file("${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"${PACKAGE_CONFIG_FILE}INSTALL_DESTINATION ${INSTALL_CONFIG_DIR}
)# creating version configuration for external package to perform compatibility check
write_basic_package_version_file(${PACKAGE_CONFIG_VERSION_FILE}COMPATIBILITY ExactVersion
)# installing library files
install(TARGETS try_out_utilsEXPORT try_out_utils-targetsDESTINATION lib
)# installing all reference header files
install(DIRECTORY include/try_out_utilsDESTINATION include/
)# installing cmake config files for try_out_utils
install(FILES${PACKAGE_CONFIG_VERSION_FILE}${PACKAGE_CONFIG_FILE}DESTINATION ${INSTALL_CONFIG_DIR}
)# installing cmake config files for try_out_utils-targets
install(EXPORT try_out_utils-targetsFILE try_out_utils-targets.cmakeNAMESPACE try_out_utils::DESTINATION ${INSTALL_CONFIG_DIR}
)# exporting the try_out_utils-target cmake config to build folder
export(EXPORT try_out_utils-targetsFILE ${CMAKE_CURRENT_BINARY_DIR}/try_out_utils-targets.cmakeNAMESPACE try_out_utils::
)# checking whether build includes test
if(BUILD_TESTING)# listing files for testingfile(GLOB_RECURSE unit_test_srcs "test/*.cpp")# adding listed files for testingament_add_catch2(test_try_out_utils ${unit_test_srcs} TIMEOUT 300)# linking libraries required to the current package for testingtarget_link_libraries(test_try_out_utilstry_out_utilsCatch2::Catch2)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()
endif()ament_package()

   让我们详细介绍一下上面创建的cmakelist

  1. include(GNUInstallDirs) — 允许使用 cmake 安装变量
  2. add_library — 使用指定的参照文件创建库
  3. target_include_directories — 要包含在目标中的内部和外部包中的目录
  4. include(CMakePackageConfigHelpers) — 用于创建配置文件的帮助程序函数,其他项目可以包含这些文件来查找和使用包
  5. configure_package_config_file — 在创建用于安装项目或库的 or 文件时,应使用代替普通命令。它通过避免已安装文件中的硬编码路径来帮助使生成的包可重定位configure_package_config_file()configure_file()<PackageName>Config.cmake<PackageName>-config.cmakeConfig.cmake
  6. write_basic_package_version_file — 应该用于创建版本配置文件,以便导入此库的外部包可以执行与此处提供的版本兼容性检查
  7. 在目标位置安装目录 — 表单将一个或多个目录的内容安装到给定目标DIRECTORY
  8. 在目标位置安装文件 — 表单指定为项目安装文件的规则。在指定目标中安装文件FILES
  9. 在目标位置安装导出 — 该窗体生成并安装一个 Make 文件,其中包含用于将目标从安装树导入到另一个项目中的代码EXPORT
  10. 出口 — 创建一个可能由外部项目包含的文件,以从当前项目的生成树中导入命名的目标。这在交叉编译期间非常有用,可以生成实用程序可执行文件,这些实用程序可执行文件可以在一个项目中的主机平台上运行,然后将它们导入到为目标平台编译的另一个项目中。将字符串附加到写入文件的所有目标名称前面<filename><target>...(NAMESPACE)<namespace>
  11. 使用导出在目标位置安装目标 — 在指定目标位置安装目标的代码段。选项将已安装的目标文件与名为EXPORT<export-name>
  12. ament_add_catch2 — 使用为测试提供的测试文件创建测试目标
  13. target_link_libraries — 将目标与指定的
    库链接起来(Ament 是一个用 Cmake 编写的包装器,用于简化 colcon 构建的一些功能)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>try_out_utils</name><version>0.1.0</version><description>Utility package for commonly used functions</description><maintainer email="sample@email.com">santosh balaji</maintainer><license>Apache License 2.0</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><test_depend>ament_cmake_catch2</test_depend><test_depend>ament_cmake_uncrustify</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

  四、包依赖关系

      用于指定依赖项的包文件

# To build created package
colcon build --packages-select try_out_utils# To run tests on package
colcon test --event-handlers console_direct+ --packages-select try_out_utils

        运行上述命令以构建和测试库包

执行后的测试结果

下篇 ROS2 库包设置和使用 Catch2 进行单元测试

五、项目结构大纲

六、库的流程

  1. 在包含/try_out/point_checker.hpp 下为逻辑函数创建标头
  2. 在 src/point_checker.cpp 下为逻辑函数添加实现类
  3. 为测试下的测试类/主类创建入口点.cpp
  4. 在测试/test_point_checker.cpp下添加单元测试
  5. 在根项目目录下创建 CMakeLists.txt
  6. 在根项目目录下创建包.xml

七、程序实现

// include/try_out/point_checker.hpp
#ifndef TRY_OUT__POINT_CHECKER_HPP_
#define TRY_OUT__POINT_CHECKER_HPP_#include <try_out_utils/point.hpp>
#include <memory>
#include <cmath>
#include <vector>class PointChecker
{
private:std::vector<try_out_utils::Point *> points_;public:void add_point(double x, double y);std::vector<std::vector<double>> find_distance_matrix();
};#endif  // TRY_OUT__POINT_CHECKER_HPP_

带有向量的标头类,用于存储点和逻辑函数

// src/point_checker.cpp#include <try_out/point_checker.hpp>#include <vector>void PointChecker::add_point(double x, double y)
{try_out_utils::Point * point = new try_out_utils::Point(x, y);this->points_.push_back(point);
}std::vector<std::vector<double>> PointChecker::find_distance_matrix()
{std::vector<std::vector<double>> overall_vect;for (unsigned int i = 0; i < this->points_.size(); i++) {std::vector<double> inner_vect;for (unsigned int j = 0; j < this->points_.size(); j++) {double x_compute =(this->points_[j]->get_x() - this->points_[i]->get_x()) *(this->points_[j]->get_x() - this->points_[i]->get_x());double y_compute =(this->points_[j]->get_y() - this->points_[i]->get_y()) *(this->points_[j]->get_y() - this->points_[i]->get_y());double distance = std::sqrt(x_compute + y_compute);inner_vect.push_back(distance);}overall_vect.push_back(inner_vect);}return overall_vect;
}int main()
{PointChecker point_checker;point_checker.add_point(5, 5);return 0;
}

前面在标头中声明的逻辑类的实现类。此处添加了距离计算逻辑

// test/main.cpp
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

测试用例的 Catch2 入口点

// test/test_point_checker.cpp#include <catch2/catch.hpp>
#include <try_out/point_checker.hpp>
#include <vector>
#include <cmath>
TEST_CASE("Test for point checker", "[]")
{SECTION("Test for distance matrix computation"{PointChecker point_checker;point_checker.add_point(1, 1);point_checker.add_point(2, 2);point_checker.add_point(3, 3);std::vector<std::vector<double>> result = point_checker.find_distance_matrix();REQUIRE(result.size() == 3);REQUIRE(result[0].size() == 3);REQUIRE(result[1].size() == 3);REQUIRE(result[2].size() == 3);REQUIRE(result[0][0] == 0);REQUIRE(std::round(result[0][1] - 1.4142135624) == 0);REQUIRE(std::round(result[0][2] - 2.8284271247) == 0);REQUIRE(std::round(result[1][2] - 1.4142135624) == 0);REQUIRE(result[1][1] == 0);REQUIRE(std::round(result[1][2] - 1.4142135624) == 0);REQUIRE(std::round(result[2][0] - 2.8284271247) == 0);REQUIRE(std::round(result[2][1] - 1.4142135624) == 0); REQUIRE(result[2][2] == 0);}
}

点检查器类的单元测试,用于计算提供的点之间的距离

# setting up cmake minimum version and project name
cmake_minimum_required(VERSION 3.8)
project(try_out VERSION 0.1.0)# setting c++ version standard to 17
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 17)
endif()# adding compiler arguments
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# adding external dependencies required
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(try_out_utils REQUIRED)
find_package(ament_cmake_catch2 REQUIRED)
find_package(Catch2 REQUIRED)# creating library package with reference to required files
add_library(try_out SHAREDsrc/point_checker.cpp
)# including external directory reference for the created library
target_include_directories(try_out PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>${rclcpp_INCLUDE_DIRS})# including external library reference for the created library
target_link_libraries(try_outPUBLICtry_out_utils::try_out_utils
)# creating executables with reference to required files
add_executable(try src/point_checker.cpp)# including external directory reference for the created executable
target_include_directories(try PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>${rclcpp_INCLUDE_DIRS})# including external library reference for the created executable
target_link_libraries(try${rclcpp_LIBRARIES}try_out_utils::try_out_utils
)# installing executable file
install(TARGETS
try
DESTINATION lib})# installing library file
install(TARGETS try_outDESTINATION lib
)# installing all reference header files
install(DIRECTORY include/try_outDESTINATION include/
)# checking whether build includes test
if(BUILD_TESTING)# listing files for testingfile(GLOB_RECURSE unit_test_srcs "test/*.cpp")# adding listed files for testingament_add_catch2(test_try_out ${unit_test_srcs} TIMEOUT 300)# linking libraries required to the current package for testingtarget_link_libraries(test_try_outtry_outtry_out_utils::try_out_utilsCatch2::Catch2)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()
endif()ament_package()

九、编译环节

让我们详细介绍一下上面创建的cmakelist

  1. add_library — 使用指定的参照文件创建库
  2. add_executable — 使用指定文件创建可执行文件
  3. target_include_directories — 要包含在目标中的内部和外部包中的目录。可以使用命令
  4. target_link_libraries — 将目标与指定的库链接
  5. 在目标位置安装目录 — 表单将一个或多个目录的内容安装到给定目标DIRECTORY
  6. 在目标位置安装目标 — 表单指定从项目安装目标的规则TARGETS
  7. ament_add_catch2 — 使用提供的
    测试文件创建测试目标(Ament 是一个用 Cmake 编写的包装器,用于简化 colcon 构建的一些功能)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>try_out</name><version>0.1.0</version><description>Work package which utilizes the created library package</description><maintainer email="santechselva@gmail.com">santosh balaji</maintainer><license>Apache License 2.0</license><buildtool_depend>ament_cmake</buildtool_depend><depend>try_out_utils</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><test_depend>ament_cmake_catch2</test_depend><test_depend>ament_cmake_uncrustify</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

十、单元测试实现

        用于指定依赖项的包文件

# To build created package
colcon build --packages-select try_out# To run tests on package
colcon test --event-handlers console_direct+ --packages-select try_out

运行上述命令以构建和测试库包

执行后的测试结果

参考资料
GitHub - open-rmf/rmf_utils: Internal utilities for RMF libraries (Robotics middleware framework utilities)
GitHub - open-rmf/rmf_traffic: Traffic management libraries for RMF (Traffic management framework which uses the utility library)
CMake Reference Documentation — CMake 3.27.6 Documentation (Cmake documentation)
ament_cmake user documentation — ROS 2 Documentation: Foxy documentation (Enhanced version of Cmake for ROS2 packages)

Source code
GitHub - santoshbalaji/ros2-library-package-medium: Repository which has package used for ROS2 based work package tutorial

罗斯2
克马克
第2条军规
科尔康
阿门特

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GEO生信数据挖掘(一)数据集下载和初步观察

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 GEOquery 简介 安装并加载GEOquery包 getGEO函数获取数据&#xff08;联网下载&#xff09; 更换下载数据源 对数据集进行初步观察处理 GEOquery 简介 GEOquery是一个…

【AntDesign】封装全局异常处理-全局拦截器

[toc] 场景 本文前端用的是阿里的Ant-Design框架&#xff0c;其他框架也有全局拦截器&#xff0c;思路是相同&#xff0c;具体实现自行百度下吧 因为每次都需要调接口&#xff0c;都需要单独处理异常情况&#xff08;code !0&#xff09;&#xff0c;因此前端需要对后端返回的…

联邦学习-Tensorflow实现联邦模型AlexNet on CIFAR-10

目录 Client端 Server端 扩展 Client.py Server.py Dataset.py Model.py 分享一种实现联邦学习的方法&#xff0c;它具有以下优点&#xff1a; 不需要读写文件来保存、切换Client模型 不需要在每次epoch重新初始化Client变量 内存占用尽可能小&#xff08;参数量仅翻一…

1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

项目完整版在&#xff1a; 一、buffer模块&#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块&#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据&#xff0c;取出数据 三、实现思想 1.实现换出去得有一块内存空间&#xff0c;采…

Learning Invariant Representation for Unsupervised Image Restoration

Learning Invariant Representation for Unsupervised Image Restoration (Paper reading) Wenchao Du, Sichuan University, CVPR20, Cited:63, Code, Paper 1. 前言 近年来&#xff0c;跨域传输被应用于无监督图像恢复任务中。但是&#xff0c;直接应用已有的框架&#xf…

【python海洋专题三】图像修饰之画布和坐标轴

【python海洋专题三】图像修饰之画布和坐标轴 海洋与大气科学 上期读取nc水深文件&#xff0c;并出图 但是存在一些不完美&#xff0c;本期修饰 本期内容目录 1&#xff1a;改变画布大小 2&#xff1a;改变画布背景色 3&#xff1a;改变画布在显示屏中的显示位置 4&#xf…

【项目管理】--敏捷开发管理之Scrum

目录 一、前言二、what---敏捷开发是什么2.1、敏捷开发宣言2.2、敏捷开发原则2.3、一句话概述敏捷开发三、why---为什么会有敏捷开发3.1、传统开发模式和敏捷开发模式对比四、how---敏捷开发怎么实践到项目团队4.1、what---Scrum是什么4.2、what---Scrum有哪些内容(1)、Scrum之…

NLP 01(介绍)

一、NLP 自然语言处理 (Natural Language rrocessing,简称NLP) 是计算机科学与语言学中关注于计算机与人类语言间转换的领域。 1.1 发展 规则&#xff1a;基于语法 自然语言处理的应用场景: 语音助手 机器翻译 搜索引擎 智能问答

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…

抓包习讯云院校数据通过PHP解析导入数据库

前言 最近&#xff0c;打卡APP需要这个数据&#xff0c;通过抓包后发现这个数据是固定的&#xff0c;获取很简单&#xff0c;但是数据太多&#xff0c;手动导入不显示&#xff0c;于是分析了json格式后果断通过脚本完成 【推荐】 《【MQTT】Esp32数据上传采集&#xff1a;最…

栈和队列的概念和实现

栈和队列的概念和实现 一.栈二.队列一些题目 一.栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作&#xff0c;进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff0c;栈中的数据元素遵守后进先出LIFO&#x…

UG\NX二次开发 用程序修改“用户默认设置”

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 简介 可以用程序修改“用户默认设置”吗?下面是用代码修改“用户默认设置->基本环境->用户界面->操作记录->操作记录语言”的例子。 效果 代码 #include <uf_defs.h> #include <NXOpen/NXExcept…

angular 在vscode 下的hello world

Angulai 是google 公司开发的前端开发框架。Angular 使用 typescript 作为编程语言。typescript 是Javascript 的一个超集&#xff0c;提升了某些功能。本文介绍运行我的第一个angular 程序。 前面部分参考&#xff1a; Angular TypeScript Tutorial in Visual Studio Code 一…

Kafka-Kerberos票据刷新问题

线上kafka使用了 kerberos 认证&#xff0c;每隔24小时&#xff0c;票据过期&#xff0c;无法自动续期&#xff0c;出现消息发送失败问题。 从日志可以发现会有如下报错&#xff1a; 2023-09-14 17:48:47,144 [kafka-kerberos-refresh-thread-kafka/hdp-1HADOOP.COM] [] WARN …

gitee 远程仓库操作基础(二)

(1&#xff09;clone远端仓库,本地建立分支推送 (基于远程仓库版本库 本地建立分支开发新功能) git clone gitgitee.com:xxxxx/alsa_test.git git remote add origin gitgitee.com:xxxxx/alsa_test.git进入clone过后路径代码,查看本地分支,发现该项目远程仓库有很多分支 基于…

Spring Framework 学习笔记5:事务

Spring Framework 学习笔记5&#xff1a;事务 1.快速入门 1.1.准备工作 这里提供一个示例项目 transaction-demo&#xff0c;这个项目包含 Spring 框架、MyBatis 以及 JUnit。 对应的表结构见 bank.sql。 服务层有一个方法可以用于在不同的账户间进行转账&#xff1a; Se…

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径&#xff0c;因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…

【中秋国庆不断更】OpenHarmony多态样式stateStyles使用场景

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以根…

蓝桥等考Python组别十级003

第一部分&#xff1a;选择题 1、Python L10 &#xff08;15分&#xff09; 已知s Pencil&#xff0c;下列说法正确的是&#xff08; &#xff09;。 s[0]对应的字符是Ps[1]对应的字符是ns[-1]对应的字符是is[3]对应的字符是e 正确答案&#xff1a;A 2、Python L10 &am…

NLP 03(LSTM)

一、LSTM LSTM (Long Short-Term Memory) 也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比&#xff1a; 能够有效捕捉长序列之间的语义关联缓解梯度消失或爆炸现象 LSTM的结构更复杂,它的核心结构可以分为四个部分去解析: 遗忘门、输入门、细胞状态、输出门 LSTM内部结构…