当前位置: 首页 > 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是什么…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...