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

声明式编程Declarative Programming

接下来要介绍第五种编程范式 -- 声明式编程。分别从它的优缺点、案例分析和适用的编程语言这三个方面来介绍这个歌编程范式。

声明式编程是一种编程范式,其核心思想是通过描述问题的性质和约束,而不是通过描述解决问题的步骤来进行编程。这与命令式编程范式形成对比,后者强调如何到达某个目标。以下是声明式编程的优缺点:

优点

1. 抽象程度高:声明式编程更加抽象,开发者更专注于问题的本质,而不是具体的实现步骤。这有助于提高代码的可读性和可维护性。

2. 简洁性:声明式代码通常更为简洁,因为它关注于“做什么”而不是“如何做”,减少了样板代码和冗余。

3. 可移植性:由于声明式编程更加抽象,程序的逻辑和结构与底层实现解藕,因此更容易实现跨平台和可移植的代码。

4. 并行化:由于声明式编程强调问题的本质而不是解决步骤,一些声明式编程模型更容易进行并行计算,提高性能。

5. 自动化优化:编译器和执行引擎可以更容易得进行优化,因为它们了解代码的目标而不是特定的实现路径。

缺点:

1. 学习曲线:对于习惯命令式编程的开发者来说,学习声明式编程的概念和语法可能需要一些时间。

2. 不适用于所有场景:声明式编程并不是适用于所有问题的通用解决方案。在某些情况下,特定问题可能更适合通过命令式的方式来解决。

3. 难以调试:由于声明式代码隐藏了实现细节,当出现问题时,调试可能会变得更加困难,因为开发者可能无法直观地查看到底层的运行过程。

4. 性能问题:有时声明式编程可能导致性能损失,因为它强调抽象而不是特定的实现方式,这可能使得一些优化不那么明显。

5. 限制灵活性:在某些情况下,声明式编程可能限制了开发者对底层实现的灵活性,因为它更多地依赖于框架和库的约定。

总体来说,选择声明式编程还是命令式编程通常取决于具体的问题和开发者的偏好。在某些领域,声明式编程可以提供更简洁、抽象、可维护的解决方案,而在其他情况下,命令式编程可能更为直观和灵活。

案例分析:待办事项列表

这是一个简单的声明式编程案例分析,以及适用React框架的代码示例。React是一个流行的声明式JavaScript库,用于构建用户界面。在React中,你通过声明组件的状态和UI的期望状态,而不是指定每个状态的具体更新步骤。

假设我们要创建一个简单的待办事项列表,用户可以添加、删除和标记已完成的任务。

1. 声明组件状态:

import React, { useState } from 'react';const TodoList = () => {// 使用 useState 声明状态const [tasks, setTasks] = useState([]);const [newTask, setNewTask] = useState('');// 声明处理添加任务的函数const addTask = () => {setTasks([...tasks, {text: newTask, completed: false }]);setNewTask(''); //清空输入框};// 声明处理删除任务的函数const deleteTask = (index) => {const updatedTasks = [...tasks];updatedTasks.splice(index, 1);setTasks(updatedTasks);};// 声明处理标记任务完成的函数const toggleTask = (index) => {const updatedTasks = [...tasks];updatedTasks[index].completed = !updatedTasks[index].completed;setTasks(updatedTasks);};return (<div><ul>{/* 显示任务列表 */}{task.map((task, index) => (<li key={index}><inputtype="checkbox"checked={task.completed}onChange={() => toggleTask(index)}/><span style={{ textDecoration: task.completed ? 'line-                through': 'none' }}>{task.text}</span><button onCLick={() => deleteTask(index)}>删除</button></li>))}</ul>{/* 输入框和添加按钮 */}<inputtype="text"value={newTask}onChange={(e)=>setNewTask(e.target.value)}/><button onClick={addTask}>添加任务</button></div>);
};
export default TodoList;

2. 代码解释:

  • 'useState'函数用于声明组件的状态,如'tasks'(任务列表)和'newTask'(新任务的文本)。
  • 'addTask'、'deleteTask'和'toggleTask'是用于修改状态的声明式函数。它们不直接操作DOM或执行具体的步骤,而是描述状态的变化。
  • JSX中使用'{}'语法嵌入JavaScript表达式,以根据状态动态生成任务列表和更新UI。

这个案例演示了声明式编程的特征,开发者通过声明组件的状态和期望的状态变化,而不是显示地编写每个状态的更新步骤。这种声明式的风格使得代码更易读、易维护,也更符合React的设计理念。

见GitHub例子,它演示了如何使用 Node.js 和 Express 构建一个简单的后端应用。运行“node app.js”,应用将在 http://localhost:3000 上运行。你可以通过浏览器或其他工具访问该地址,应该会看到 "Hello, this is a Node.js backend!" 的消息。

在实际应用中,Node.js 后端可以处理数据库访问、身份验证、API 请求等多种任务,使得 JavaScript 能够成为全栈开发语言。

声明式编程适用的编程语言

声明式编程的概念并不限于特定的编程语言,而是一种编程范式。因此,可以在多种编程语言中使用声明式编程的思想。以下是一些支持声明式编程的主要编程语言:

1. JavaScript/TypeScript: 前端开发中,React和Vue等框架采用了声明式的方式来构建用户界面。

2. Python: 在数据科学和机器学习领域,Python中的Pandas库使用了声明式的数据处理风格。

3. SQL: 结构化查询语言(SQL)是一种声明式查询语言,用于数据库操作。

4. Haskell: Haskell是一种纯函数式编程语言,也支持声明式编程。

5. CSS: 层叠样式表(CSS)是一种用于描述文档样式的声明式语言。

6. HTML: 超文本标记语言(HTML)用于声明性地描述网页结构。

7. Swift: 在iOS开发中,Swift语言采用了声明式的界面构建方式,例如SwiftUI。

需要注意的是,并非所有编程语言都同样强调声明式编程,而有些编程语言更侧重于命令式或其他编程风格。在实际开发中,通常会根据具体的需求和语言特征选择合适的编程范式。

Python的声明式编程

在python中,声明式编程的典型应用包括数据科学领域的一些库和框架。以下是一些使用声明式编程的Python库的例子:

1. Pandas: Pandas是用于数据处理和分析的库。它提供了一组灵活、高效的数据结构,如DataFrame,以及声明式的数据操作方法。通过使用Pandas,你可以使用一些简单的语言来描述数据的变换、过滤和聚合,而无需显式地编写循环和条件语句。

import pandas as pd# 创建DataFrame
df = pd.DataFrame({'A':[1,2,3], 'B':[4,5,6]})# 声明式地选择和过滤数据
selected_data = df[df['A'] > 1]

2. SQLAlchemy: SQLAlchemy是一个流行的Python SQL工具和对象关系映射(ORM)库。在SQLAlchemy中,你可以使用声明式的方式定义数据库模型,而不是直接编写SQL语句。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 创建数据库引擎
engine = create_engine('sqlite:///:memory:')# 声明式定义模型
Base = declarative_base()
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 创建表
Base.metadata.create_all(engine)# 声明式地插入数据
Session = sessionmaker(bind=engine)
session = Session()
new_user = User(name='John Doe')
session.add(new_user)
session.commit()

3. Plotly Express: Plotly Express是一个用于创建交互性可视化图表的库。它通过简单的函数调用和声明性的方式创建图表,而不需要详细的配置。

import plotly.express as px# 使用声明式的方式创建散点图
fig = px.scatter(df, x='A', y='B', color='A', size='B')
fig.show()

这些例子展示了在Python中使用声明式编程的一些情况,其中代码更关注于"做什么"而不是"如何做"。这种风格有助于简化代码,提高可读性,同时通过使用高级抽象提供更高的表达能力。

React、HTML和JavaScript

这部分是对React, HTML和JavaScript这三个概念的定义描述和关系解说。适合于初学者或者对三个概念感兴趣的读者,或者想复习一下的读者,进行阅读。

1. HTML(HyperText Markup Language)是一种标记语言,用于创建网页的结构。在传统的Web开发中,HTML负责定义页面的骨架和结构。与HTML不同,React使用JSX来描述用户界面的结构,而不直接使用HTML。JSM元素最终会被转译为相应的JavaScript代码,以便React运行时能够理解和渲染它们。

2. React是由Facebook开发的一个用于构建用户界面的JavaScript库。它旨在提高开发大型、可交互的Web应用程序的效率。React的核心概念是构建可组合、可重用的组件,使得开发者能够更容易 地管理和更新用户界面。它本身不是一种新的编程语言,而是建立在现有的JavaScript语言基础上。React代码本质上是JavaScript代码,但其中使用了JSX语法,这是一种类似XML的语法扩展,用于声明性地描述UI的结构。

关系和应用:
  • React和JavaScript: React 是 JavaScript 库,使用 JavaScript 语言编写。它通过组件化的方式提供了一种更高效、更模块化的方式来构建用户界面。React 的代码本质上是由 JavaScript 组成的,它通过管理组件状态和属性的变化来更新用户界面。

  • React和HTML: React 使用 JSX 语法来描述用户界面的结构,而不是直接使用 HTML。JSX 元素最终会被转译为 JavaScript 代码,React 运行时会使用这些代码来生成和更新DOM元素。React 的虚拟DOM机制使得在更新时能够更高效地计算出需要更新的部分,从而提高性能。

React 主要应用于构建单页应用(SPA)或需要高度交互性的前端应用。它通过组件的方式使得代码更易于组织、维护和测试。React 广泛用于构建现代Web应用,例如社交媒体应用、电子商务平台等。

React使用组件化的编程模式

在React中,应用程序的用户界面被划分为独立且可复用的组件,每个组件负责特定的功能或显示一部分UI。这种组件化的方式带来了许多好处,包括代码重用、可维护性、可测试性等。

React中的组件可以分为两类:类组件(Class Components)和函数组件(Function Components)。不论是类组件还是函数组件,它们都可以接收输入(称为props)并返回React元素来描述在用户界面上展示的内容。

类组件(Class Components):

import React, { Component } from 'react';class MyComponent extends Component{render(){return <div>Hello, I'm a class component!</div>;}
}export default MyComponent;

在类组件中,我们继承自'React.Component', 并实现了'render'方法。'render'方法返回一个React元素,描述了组件的外观。

import React from 'react';是一种从‘react’模块中引入特定导出的语法,被称为对象解构(Object Destructing)。在这个特定的语法中,'React'对象被作为默认导出,‘React’实际上就是整个React库的主要对象。而'Component'被作为具名导出,这意味着它不死默认导出的一部分,需要通过花括号{}显式指定。Component 是 React 类组件的基类,用于创建类组件。使用这种导入方式后,你可以在代码中直接使用React对象和 Component 类。

总之,一个模块只能由一个默认导出,用“export default”语法。但是可以有多个具名导出,使用"export"语法。并且模块中必须存在导出才能被导入,否则会出现引用错误。

函数组件(Function Components):
import React from 'react';const MyComponent = () => {return <div>Hello, I'm a function component!</div>
};export default MyComponent;

上面的例子,虽然导入了React,但是在组件内部却是没有直接使用'React'对象。这是因为在函数式组件中,你并不总是需要直接使用‘React’对象。

在类组件中,通过需要继承"React.Component",并使用'this'来调用‘React’对象的方法。而在函数式组件中,你通常只需要直接返回JSX,而不需要显示地使用‘React’对象。在函数式组件内部,React会自动处理JSX,并在背后使用‘React.createElement’。因此,尽管我们没有在函数式组件中显式使用‘React’对象,实际上React仍然在幕后发挥作用。在这种情况下,‘import React from ‘react’;’主要是为了确保JSX语法能够正确转译。

3. JavaScript是一种高级的、解释性的、面向对象的编程语言。它是一种用于构建交互式、动态网页的脚本语言,通常用于在Web浏览器中实现客户端的逻辑。JavaScript也可以在服务器端使用,例如通过Node.js。

以下是JavaScript的一些关键特点:

  1. 脚本语言:JavaScript是一种脚本语言,它的代码是逐行解释执行的,而不需要编译成机器码。这使得它非常适合用于网页上的动态交互。
  2. 弱类型语言:JavaScript是一种弱类型语言,变量的数据类型可以在运行时动态改变。这与强类型语言(如Java或C++)不同,它们在编译时要求变量的类型是明确的。
  3. 面向对象:JavaScript是一种面向对象的语言,它支持基于原型的面向对象编程。对象在JavaScript中起着关键的作用,而且你可以创建和操作对象来实现代码的结构和逻辑。
  4. 事件驱动:JavaScript通常用于处理用户与网页的交互。它是一种事件驱动的语言,能够响应用户的动作(如点击、输入等),并执行相应的逻辑。
  5. 跨平台: JavaScript是一种跨平台的语言,可以在不同的操作系统上运行。它的主要应用领域是Web开发,但也可以用于构建移动应用、桌面应用和服务器端应用。
  6. ECMAScript: JavaScript的标准规范由ECMAScript定义。ECMAScript规定了语言的基本特性和行为,而浏览器或其他宿主环境通过实现这些规范来提供JavaScript的功能。

JavaScript的发展使得它成为Web开发的关键技术之一,它可以与HTML和CSS结合使用,用于构建动态、交互式的用户界面。随着Node.js的出现,JavaScript还可以在服务器端运行,使得它成为全栈开发的语言。

4. Node.js 是一个基于Chrome V8引擎的JavaScript运行时,用于构建可伸缩的网络应用。它是一个开发源代码、跨平台的JavaScript运行时环境,使得开发者可以使用JavaScript运行在服务器端,而不仅仅局限于浏览器中。

以下是Node.js的一些主要特点和用途:

1. 服务器端JavaScript:Node.js是一种服务器端运行环境,它允许开发者使用JavaScript编写后端服务和应用。这种能力扩展了JavaScript的用途,使其不仅仅是浏览器端的脚本语言。

2. 事件驱动和非阻塞I/O: Node.js使用事件驱动和非阻塞I/O模型,使其能够高效处理大量并发连接。这使得Node.js特别适合构建实时应用程序,如聊天应用、在线游戏等。

3. 轻量和高效:Node.js是一个轻量级的运行时环境,具有快速的启动时间和低资源消耗。这使得它适用于构建高性能的应用程序。

4. 包管理工具npm: Node.js附带了一个强大的包管理工具npm(Node Package Manager), 使得开发者可以轻松地安装、共享和管理依赖包。npm是世界上最大的开源软件注册表之一。

5. 跨平台: Node.js可以在多个操作系统上运行,包括Windows、Linux和macOS。这使得开发者可以轻松在不同的环境中开发和部署应用程序。

6. 社区支持:Node.js拥有庞大且活跃的开发者社区,为开发者提供了大量的工具、模块和资源。这使得Node.js成为构建现代Web应用、API、微服务等的流行选择。

Node.js的出现改变了前后端开发的格局,使得开发者可以使用一种语言(JavaScript)在整个应用程序栈上工作,从而实现全栈开发。

运行在前后端的JavaScript应用的区别

运行在前端和后端的JavaScript应用有一些关键的区别,区别在于运行的环境和目的。

1. 运行环境:

  • 前端JavaScript:运行在在浏览器中,用于构建和控制用户界面。前端JavaScript主要用于处理与用户的交互、动态页面更新和与后面通信。
  • 后端JavaScript:运行在服务器端,用于处理业务逻辑、数据库访问等服务端任务。Node.js是一个常见的后端JavaScript运行时,但也有其他选择。

2. 主要任务:

  • 前端JavaScript:主要负责构建用户界面和处理用户交互。它通常包括DOM操控、事件处理、Ajax请求等,用于使网页具有动态性和交互性。
  • 后端JavaScript:主要用于处理服务器端的业务逻辑,例如处理HTTP请求、数据库操作、身份验证等。后端JavaScript应用可以用于构建Web服务器、微服务等。

3. 开发框架:

  • 前端JavaScript:常用的前端框架包括React、Angular、Vue等,用于构建单页面应用(SPA)和复杂的用户界面。
  • 后端JavaScript:常用的后端框架包括Express.js、Koa.js、Next.js等,用于搭建服务器和处理HTTP请求。

4. 数据存储:

  • 前端JavaScript:主要负责从后端获取数据并在用户界面上展示。可以使用浏览器本地存储(如LocalStorage)或通过Ajax请求从服务器获取数据。
  • 后端JavaScript:可以连接数据库、进行数据处理和持久化存储。常见的数据库如MongoDB、MySQL等。

5. 安全性:

  • 前端JavaScript: 运行在用户的浏览器中,因此应该注意安全性问题,如防范跨站脚本攻击(XSS)等。
  • 后端JavaScript: 运行在服务器端,需要处理很多安全问题,包括防范SQL注入、身份验证、授权等。

6. 构建和部署:

  • 前端JavaScript: 前端应用通常需要通过构建工具(如Webpack、Babel)进行打包和优化,然后通过CDN或静态文件服务器部署。
  • 后端JavaScript: 后端应用可以通过Node.js内置的HTTP服务器部署,也可以使用类似Nginx或Apache的反向代理服务器来处理请求。

7. 访问方式:

前端JavaScript:

  1. 浏览器环境:前端JavaScript运行在用户的浏览器中,主要负责构建和控制用户界面。
  2. 访问DOM:前端JavaScript可以直接访问和操作浏览器中的DOM文件对象模型,以实现动态页面效果。
  3. 处理用户输入:监听用户的交互事件(如点击、输入),并执行相应的逻辑。
  4. Ajax请求:通过XMLHttpRequest对象或更现代的Fetch API,前端JavaScript可以向后端发送Ajax请求获取数据。
  5. 访问本地存储:可以使用本地存储(如LocalStorage、SessionStorage)存储数据。
  6. 与后端通信:通过HTTP请求向后端发送数据,常见的方式包括使用Fetch API或类库(如Axios)。

后端JavaScript:

  1. 服务器环境: 后端JavaScript运行在服务器端,主要负责处理业务逻辑、数据库访问等服务端任务。
  2. Node.js环境:后端JavaScript通常使用Node.js作为运行时环境。
  3. 处理HTTP请求:后端JavaScript可以监听和处理来自前端或其他服务的HTTP请求。
  4. 数据库访问:后端JavaScript可以连接数据库,执行查询、更新、删除等操作。
  5. 身份验证和授权:处理用户身份验证,确保只有授权的用户能够访问特定资源。
  6. 生成动态内容:生成动态的HTML、JSON或其他格式的响应,以供前端使用。

在实际的应用中,前端和后端 JavaScript 通过HTTP协议进行通信。前端通过浏览器向后端发送HTTP请求,后端处理这些请求并返回相应的数据。这种通信方式使得前后端可以独立开发和部署,提高了应用的灵活性和可维护性。

虽然前端和后端 JavaScript 在技术上有所不同,但随着全栈开发的兴起,使用相同的语言和技术堆栈(例如JavaScript和Node.js)来开发前后端应用已经变得越来越普遍。这种趋势有助于简化开发流程、提高代码的可维护性和复用性。

脚本语言和其他类型语言集合

脚本语言是一种通过解释器逐行执行而不需要编译的编程语言。它的执行是逐行进行的,而不是先将整个程序编译成机器代码再执行。脚本语言通常用于自动化任务、批处理、Web开发等领域。

其他类型的语言主要可以分为编译型语言和解释型语言:

  1. 编译型语言: 这些语言在程序执行之前需要通过编译器将源代码转换成机器代码或者中间代码。编译过程会生成可执行文件,然后运行这个文件。例如,C、C++、Java(部分编译为字节码)等都是编译型语言。

  2. 解释型语言: 这些语言在程序执行时通过解释器逐行翻译并执行源代码。不生成独立的可执行文件,而是在运行时逐行执行。例如,Python、JavaScript、Ruby、PHP 等都是解释型语言。

  3. 半编译型语言: 有些语言介于编译型和解释型之间,使用一种中间形式,即字节码。Java 和 C# 就是这种类型的语言,它们会将源代码编译成字节码,然后在运行时由虚拟机进行解释执行。

  4. 汇编语言: 汇编语言是与特定计算机体系结构相关的低级语言,它直接映射到机器指令。程序员通过编写汇编语言来控制计算机硬件。与高级语言相比,汇编语言更接近计算机硬件层次。

  5. 特定领域语言(DSL): 这类语言专注于解决特定领域的问题,通常为特定领域的需求提供了更高层次的抽象。例如,SQL 用于数据库查询,HTML 和 CSS 用于构建Web页面。

这些不同类型的语言各自有其优点和适用场景。编译型语言通常执行速度更快,但开发过程中需要额外的编译步骤。解释型语言更具灵活性,但可能牺牲一些执行效率。不同的语言类型适用于不同的应用场景和开发需求。

脚本语言和解释型语言有一定的关联,但它们并不完全相同。

脚本语言: 通常,脚本语言是一种设计用于快速开发和简化特定任务的编程语言。脚本语言的脚本文件通常包含一系列按顺序执行的命令或操作,用于完成某个任务。这些脚本文件可以由解释器逐行解释和执行,而不需要事先编译为机器码。脚本语言的特点包括灵活性、易读性和快速开发。

解释型语言: 解释型语言是一种在运行时由解释器逐行解释并执行的编程语言。与编译型语言不同,解释型语言的代码不会被提前编译成机器码,而是在运行时逐行解释。这意味着在执行程序之前,不需要显式地进行编译步骤。解释型语言的优势在于更容易实现跨平台性,因为解释器可以针对不同的操作系统解释相同的源代码。

因此,脚本语言和解释型语言的概念在某种程度上有交叉。很多脚本语言是解释型的,而解释型语言的一部分也可以被认为是脚本语言。但并不是所有脚本语言都是解释型的,也不是所有解释型语言都是脚本语言。

举例来说,JavaScript 是一种脚本语言,通常在浏览器中通过解释器执行。而 Python 也可以被认为是一种脚本语言,但它同时也可以通过编译器生成字节码,在一些场景中以解释型方式执行。

相关文章:

声明式编程Declarative Programming

接下来要介绍第五种编程范式 -- 声明式编程。分别从它的优缺点、案例分析和适用的编程语言这三个方面来介绍这个歌编程范式。 声明式编程是一种编程范式&#xff0c;其核心思想是通过描述问题的性质和约束&#xff0c;而不是通过描述解决问题的步骤来进行编程。这与命令式编程…...

人工智能与天文:技术前沿与未来展望

人工智能与天文&#xff1a;技术前沿与未来展望 一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛。在天文领域&#xff0c;AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合&#xff0c;以及这种结合带…...

JeecgBoot 框架升级至 Spring Boot3 的实战步骤

JeecgBoot 框架升级 Spring Boot 3.1.5 步骤 JEECG官方推出SpringBoot3分支&#xff1a;https://github.com/jeecgboot/jeecg-boot/tree/springboot3 本次更新由于属于破坏式更新&#xff0c;有几个生态内的组件&#xff0c;无法进行找到平替或无法升级&#xff0c;目前尚不完…...

论文阅读——Semantic-SAM

Semantic-SAM可以做什么&#xff1a; 整合了七个数据集&#xff1a; 一般的分割数据集&#xff0c;目标级别分割数据集&#xff1a;MSCOCO, Objects365, ADE20k 部分分割数据集&#xff1a;PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…...

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…...

【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

文章目录 &#x1f339;概念⭐作用 &#x1f384;快速入门⭐入门案例代码实现 &#x1f6f8;拦截路径&#x1f354;拦截器interceptor和过滤器filter的区别&#x1f386;登录校验 &#x1f339;概念 拦截器&#xff08;Interceptor&#xff09;是一种软件设计模式&#xff0c;…...

conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义

一般情况下&#xff0c;我们通过self.version字段定义conan 包的版本号如下&#xff1a; class PkgConan(ConanFile):name "pkg"version "1.7.3"因为版本号是写死的&#xff0c;所以这种方式有局限性&#xff1a; 比如我的java项目中版本号是在pom.xml中…...

为什么 GAN 不好训练

为什么 GAN 不好训练&#xff1f;先看 GAN 的损失&#xff1a; 当生成器固定时&#xff0c;堆D(x)求导&#xff0c;推理得到&#xff08;加号右边先对log求导&#xff0c;再对负项求导&#xff09; 然后在面对最优Discriminator时&#xff0c;Generator的优化目标就变成了&…...

select、poll、epoll 区别有哪些

文章目录 select、poll、epoll 区别有哪些&#xff1f;select&#xff1a;poll&#xff1a;epoll&#xff1a; select、poll、epoll 区别有哪些&#xff1f; select&#xff1a; 它仅仅知道了&#xff0c;有 I/O 事件发生了&#xff0c;却并不知道是哪那几个流&#xff08;可…...

大模型下开源文档解析工具总结及技术思考

1 基于文档解析工具的方法 pdf解析工具 导图一览&#xff1a; PyPDF2提取txt&#xff1a; import PyPDF2 def extract_text_from_pdf(pdf_path):with open(pdf_path, rb) as file:pdf_reader PyPDF2.PdfFileReader(file)num_pages pdf_reader.numPagestext ""f…...

【华为数据之道学习笔记】5-4 数据入湖方式

数据入湖遵循华为信息架构&#xff0c;以逻辑数据实体为粒度入湖&#xff0c;逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上&#xff0c;一个逻辑数据实体的所有属性应该一次性进湖&#xff0c;避免一个逻辑实体多次入湖&#xff0c;增加入湖工作量。 数据入湖的方式…...

Vue3-03-reactive() 响应式基本使用

reactive() 的简介 reactive() 是vue3 中进行响应式状态声明的另一种方式&#xff1b; 但是&#xff0c;它只能声明 【对象类型】的响应式变量&#xff0c;【不支持声明基本数据类型】。reactive() 与 ref() 一样&#xff0c;都是深度响应式的&#xff0c;即对象嵌套属性发生了…...

OpenAI开源超级对齐方法:用GPT-2,监督、微调GPT-4

12月15日&#xff0c;OpenAI在官网公布了最新研究论文和开源项目——如何用小模型监督大模型&#xff0c;实现更好的新型对齐方法。 目前&#xff0c;大模型的主流对齐方法是RLHF&#xff08;人类反馈强化学习&#xff09;。但随着大模型朝着多模态、AGI发展&#xff0c;神经元…...

TeeChart.NET 2023.11.17 Crack

.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件&#xff0c;可满足无数的图表需求&#xff0c;也针对重要的垂直领域&#xff0c;例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器&#xff0c;以及完整的功能集&#xff0c…...

计算机网络常见的缩写

计算机网络常见缩写 通讯控制处理机&#xff08;Communication Control Processor&#xff09;CCP 前端处理机&#xff08;Front End Processor&#xff09;FEP 开放系统互连参考模型 OSI/RM 开放数据库连接&#xff08;Open Database Connectivity&#xff09;ODBC 网络操作系…...

vue cli 脚手架之配置代理

方法二...

STM32启动流程详解(超全,startup_stm32xx.s分析)

单片机上电后执行的第一段代码 1.初始化堆栈指针 SP_initial_sp 2.初始化 PC 指针Reset_Handler 3.初始化中断向量表 4.配置系统时钟 5.调用 C 库函数_main 初始化用户堆栈&#xff0c;然后进入 main 函数。 在正式讲解之前&#xff0c;我们需要了解STM32的启动模式。 STM32的…...

小程序接口OK,桌面调试接口不行

手机小程序OK,桌面版出现问题&#xff1b; 环境&#xff1a;iis反向url的tomcat服务&#xff0c;提供接口。 该接口post了一个很大的数组&#xff0c;处理时间比较久。 1&#xff09;桌面调试出现错误,提示 用apipost调用接口同样出错, 502 - Web 服务器在作为网关或代理服…...

【贪心】LeetCode-406. 根据身高重建队列

406. 根据身高重建队列。 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新…...

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…...

springboot(ssm宠物美容机构CRM系统 宠物服务商城系统Java系统

springboot(ssm宠物美容机构CRM系统 客户关系管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff…...

LSTM 双向 Bi-LSTM

目录 一.Bi-LSTM介绍 二.Bi-LSTM结构 Bi-LSTM 代码实例 一.Bi-LSTM介绍 由于LSTM只能从序列里由前往后预测,为了既能够从前往后预测,也能从后往前预测,Bi-LSTM便被发明了出来。简单来说,BiLSTM就是由前向LSTM与后向LSTM组合而成。 二.Bi-LSTM结构 转自:...

2024测试开发面试题完整版本(附答案)

目录 1. 什么是软件测试&#xff0c; 谈谈你对软件测试的了解 2. 我看你简历上有写了解常见的开发模型和测试模型, 那你跟我讲一下敏捷模型 3. 我看你简历上还写了挺多开发技能的, 那你给我讲讲哈希表的实现流程 4. 谈一谈什么是线程安全问题, 如何解决 5. 既然你选择走测…...

MySQL作为服务端的配置过程与实际案例

MySQL是一款流行的关系型数据库管理系统&#xff0c;广泛应用于各种业务场景中。作为服务端&#xff0c;MySQL的配置过程对于数据库的性能、安全性和稳定性至关重要。本文将详细介绍MySQL作为服务端的配置过程&#xff0c;并通过一个实际案例进行举例说明。 一、MySQL服务端配…...

Appium 自动化自学篇 —— 初识Appium自动化!

Appium 简介 随着移动终端的普及&#xff0c;手机应用越来越多&#xff0c;也越来越重要。而作为测试 的我们也要与时俱进&#xff0c;努力学习手机 App 的相关测试&#xff0c;文章将介绍手机自动化测试框架 Appium 。 那究竟什么是 Appium 呢? 接下来我们一起来学习PythonS…...

Linux基本操作指令

哈喽小伙伴们&#xff0c;从这篇文章开始&#xff0c;在学习数据结构的同时&#xff0c;我们开启一个新的篇章——Linux操作系统的学习&#xff0c;这将会是又一个新的开始&#xff0c;希望小伙伴们能够认真细心&#xff0c;不要掉队哦。 目录 一.什么是Linux 二.为什么要学习…...

探索SD-WAN技术对传统制造业实现智能制造的作用

在智能制造背景下&#xff0c;传统制造业面临着日益增长的信息化建设需求。随着企业趋向数字化转型&#xff0c;构建稳定、高效的网络基础设施成为提升企业核心竞争力的重要一环。 制造业企业信息化建设中的组网需求&#xff1a; 第一&#xff0c;连接多地分支机构&#xff0c…...

C++基础-this指针详解

本文详细讲解C++this指针 定义 this 是 C++ 中的一个关键字,一个特殊的指针,它指向当前对象地址(换句话说,其值为 &object),通过它可以访问当前对象的所有成员。 类定义好后我们就可以通过类来创建多个实例对象,每个对象都有各自的实例属性(实例变量),但是非内…...

如何一键生成多个文件二维码?批量文件二维码制作技巧

文件能批量生成二维码吗&#xff1f;现在的二维码用途范围越来越广&#xff0c;比如常见的有图文、文件、问卷、音频或者视频等内容生成二维码图片&#xff0c;扫码查看内容。那么当需要将很多的文件每个都单独生成一个二维码时&#xff0c;有没有比较简单快捷的操作方法吗&…...

SQL连续

SQL连续 1、连续概述2、SQL连续及应用2.1、静态连续2.2、动态连续1、连续概述 连续问题是实际数据开发中比较常见的场景。例如,统计用户连续活跃天数等 SQL如何解决连续问题?本文主要介绍连续性问题,重点以常见的连续活跃场景为例,抽象出通用的连续问题解决方案。连续问题…...

微网站自己怎么做的吗/百度搜一搜

一、问题 Tomcat为exe安装版。Tomcat 80和443端口配置完成后&#xff0c;80正常访问&#xff0c;443无法访问。 二、解决方法 先检查端口被占用情况。 查看占用的端口&#xff1a; netstat -aon|findstr “443” 假设占用程序的pid为3308 查看对应pid程序&#xff1a; tas…...

给手机开发网站/免费推广产品平台有哪些

今天继续接着CSS盒子模型补充&#xff0c;CSS基础学习十三&#xff1a;盒子模型和CSS基础学习十四&#xff1a;盒子模型补充之display属 性设置都是介绍了盒子模型中的内容概括。开始今天的主题&#xff1a;外边距合并。 外边距合并指的是&#xff0c;当两个垂直外边距相遇时&…...

wordpress空间安装教程/百度网盘提取码入口

在继续学习之前&#xff0c;你需要对下面的知识有基本的了解 1.HTML/XHTML 2.CSS 3.JavaScript/DOM 什么是AJAX&#xff1f; AJAX异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换&#xff0c;AJAX可以使网页实现异步更新。这意…...

海淀公安局网站备案/营销型企业网站有哪些

1.压缩 对于test目录&#xff0c;使用 zip -rq test.zip test r表示递归压缩&#xff0c;q表示不显示过程 2.解压缩 unzip -q test.zip 转载于:https://www.cnblogs.com/huangshiyu13/p/7196309.html...

做企业门户网站都/网络推广软文范文

全文转自&#xff1a;中兴通讯&#xff1a;远端射频模块(RRU)关键技术创新及发展趋势 远端射频模块&#xff08;RRU&#xff09;包含收发信机&#xff08;TRX&#xff09;、功放、射频&#xff08;RF&#xff09;算法、滤波器、天线五大专有关键技术方向。其中TRX主要聚焦高集…...

谷歌企业网站seo/东莞网站公司排名

代理模式是一个十分优秀的软件架构模式&#xff0c;许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不合适或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作…...