10个牛逼的编程范式,你已经用过了几个?

news2025/2/27 4:30:42

《10个牛逼的编程范式,你已经用过了几个?》

编程范式是计算机编程中的基本思想和方法论,它描述了不同的编程风格和抽象层次。随着计算机科学的不断发展,编程范式也在不断演进和扩展,从最早的命令式编程到面向对象、声明式和函数式编程等不同的范式相继涌现。本文将介绍编程范式的发展历程,并探讨各个范式的特点和应用领域。

一、命令式编程

命令式编程(Imperative Programming Paradigm)是计算机编程中最早出现的编程范式之一。它的核心思想是通过一步步的指令来描述计算机执行的过程。在命令式编程中,程序员需要详细指定计算机执行的每一个操作,包括控制流程、数据存储和处理。

主要特点和特征:

  1. 易于理解:命令式编程以类似于自然语言的形式描述计算机执行的过程,因此易于理解和阅读。
  2. 易于实现:由于命令式编程描述的是计算机的具体执行过程,因此易于在计算机上实现。
  3. 顺序执行:在命令式编程中,计算机按照给定的顺序依次执行指令,从上到下逐行执行。
  4. 可变状态:命令式编程中,计算机内部的状态可以被修改,程序可以通过改变变量的值来改变计算的结果。
  5. 控制流程:命令式编程使用条件语句(如if-else)和循环语句(如for和while)来控制计算机的执行流程。

示例代码:使用命令式编程实现计算1到n的和

def calculate_sum(n):
    sum = 0
    for i in range(1, n+1):
        sum += i
    return sum

n = 10
result = calculate_sum(n)
print("Sum from 1 to", n, "is:", result)

尽管命令式编程易于理解和实现,但在面对复杂的问题时,往往会导致代码冗长且难以维护。这促使计算机科学家和软件工程师探索其他编程范式,如面向对象编程和声明式编程,以提高代码的可维护性和重用性。然而,命令式编程仍然在许多应用场景中得到广泛应用,并且作为其他编程范式的基础,为程序员提供了编程的起点。

二、结构化编程

结构化编程(Structured Programming Paradigm):旨在提高程序的可读性和可维护性。它主要通过引入结构化控制流程(顺序、选择、循环)来改进传统的无限制的GOTO语句,使得程序的逻辑结构更加清晰和易于理解。

主要特点和原则:

  1. 顺序结构:结构化编程中,程序的执行按照代码的书写顺序逐行执行。每一行代码执行完后,程序自动进入下一行的执行。这样确保了程序逻辑的连续性和一致性。
  2. 选择结构:结构化编程引入条件语句(如if-else语句),根据条件的真假来决定程序的执行路径。这样可以根据不同的条件执行不同的代码块,提高程序的灵活性。
  3. 循环结构:结构化编程支持循环语句(如for和while循环),使得代码块可以重复执行,减少了代码的冗余和重复。
  4. 前进式设计:结构化编程倡导程序设计时采用前进式设计,即从上到下依次设计代码,而不是通过跳转语句来改变程序的执行流程。这样有利于程序的理解和维护。

结构化编程范式的典型代表是Dijkstra的"结构化程序设计"(Structured Programming)理论。在20世纪60年代末和70年代初,Dijkstra等人提出了结构化程序设计理论,将结构化控制流程作为编程的基本单元,以取代过去不受限制的GOTO语句。

示例代码:使用结构化编程实现计算1到n的和

def calculator():
    print("Simple Calculator")
    print("Supported Operations: +, -, *, /")
    
    num1 = float(input("Enter the first number: "))
    operator = input("Enter the operator (+, -, *, /): ")
    num2 = float(input("Enter the second number: "))
    
    if operator == '+':
        result = add(num1, num2)
    elif operator == '-':
        result = subtract(num1, num2)
    elif operator == '*':
        result = multiply(num1, num2)
    elif operator == '/':
        result = divide(num1, num2)
    else:
        result = "Error: Invalid operator."
    
    print("Result:", result)

calculator()

结构化编程范式对编程的进步做出了重要贡献,它使得程序的逻辑更加清晰和易于理解,提高了代码的可读性和可维护性。尽管现代编程语言和编程范式已经发展到更高级的层面,但结构化编程的基本思想仍然被广泛应用于编程实践中。

三、面向对象编程

面向对象编程(Object-Oriented Programming,OOP)是一种广泛应用的编程范式,它将程序中的数据和对数据的操作封装成对象,并通过类描述对象的行为和属性。面向对象编程强调对象的概念,通过封装、继承和多态等特性来实现数据的抽象和复用。

主要特点和原则:

  1. 对象:对象是面向对象编程的核心概念,代表现实世界中的实体和其行为。对象具有状态(属性)和行为(方法)。
  2. 类:类是对象的抽象描述,是一种模板或蓝图,用于创建对象。一个类可以创建多个对象,这些对象都具有相同的属性和行为。
  3. 封装:封装是将对象的状态和行为封装在一起,对外部隐藏对象的内部实现细节。只暴露必要的接口,提供更好的数据保护和安全性。
  4. 继承:继承是面向对象编程中实现代码复用的一种机制。子类可以继承父类的属性和行为,并可以在此基础上添加新的特性。
  5. 多态:多态允许一个方法在不同的对象上执行不同的操作,提高了代码的灵活性和可扩展性。通过继承和接口,可以实现运行时多态性。

面向对象编程的典型代表是Java和C++等编程语言。它在软件开发中得到广泛应用,尤其是在大型复杂系统的开发中。面向对象编程可以使得代码结构更加清晰、易于理解和维护,同时也提供了良好的代码复用性。

示例代码:使用面向对象编程实现简单的计算器类

class Calculator {
    private int result;

    public Calculator() {
        this.result = 0;
    }

    public void add(int number) {
        result += number;
    }

    public int getResult() {
        return result;
    }
}

public class ObjectOrientedProgrammingDemo {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.add(5);
        calculator.add(10);
        int result = calculator.getResult();
        System.out.println("Result is: " + result); // Output: Result is: 15
    }
}

面向对象编程以对象为核心,通过封装、继承和多态等特性来实现数据的抽象和复用。面向对象编程使得代码结构更加清晰和易于理解,提高了代码的可读性、可维护性和可扩展性。在现代软件开发中,面向对象编程仍然是一种非常流行和广泛应用的编程范式。

四、函数式编程

函数式编程(Functional Programming):它将计算视为数学函数的计算,并避免使用可变状态和改变状态的操作。函数式编程强调使用纯函数(Pure Function),即对于相同的输入,总是产生相同的输出,不会对外部环境产生副作用。函数式编程主要依赖于高阶函数、匿名函数、递归和惰性求值等特性。

主要特点和原则:

  1. 纯函数:函数式编程鼓励使用纯函数,避免副作用和状态改变。纯函数不依赖于外部状态,只依赖于输入,并返回输出,对于相同的输入总是产生相同的输出。
  2. 不可变性:函数式编程中,数据一旦创建就不能再修改。变量和数据结构都是不可变的,而不是可变的。
  3. 高阶函数:函数式编程支持高阶函数,即函数可以作为参数传递给其他函数,也可以返回其他函数。
  4. 递归:函数式编程常常使用递归来进行迭代和循环操作,而不是使用循环结构。
  5. 惰性求值:函数式编程通常采用惰性求值(Lazy Evaluation),只有在需要结果时才进行计算。

函数式编程在数学中有很强的理论基础,尤其是λ演算(Lambda Calculus)。函数式编程在处理数据和并发编程方面有一些优势,并且能够更好地处理大规模和分布式计算。

示例代码:使用函数式编程风格计算列表中所有元素的平方

pythonCopy code
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用map函数对列表中的每个元素进行平方操作
squared_numbers = list(map(lambda x: x * x, numbers))

print("Squared numbers:", squared_numbers) # Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在上述示例中,我们使用函数式编程风格计算了列表numbers中所有元素的平方。我们使用了map高阶函数和匿名函数,将每个元素平方,并将结果存储在squared_numbers列表中。这里没有修改原始数据,而是创建了一个新的列表来保存计算结果,符合函数式编程的不可变性原则。

五、逻辑式编程

逻辑式编程(Logic Programming):是一种基于逻辑推理的编程方法。在逻辑式编程中,程序员描述问题的逻辑规则和关系,而不是显式指定计算步骤。程序通过逻辑推理来求解问题,即根据已知的逻辑规则和事实推导出结果。

主要特点和原则:

  1. 声明式编程:逻辑式编程是一种声明式编程范式,程序员描述问题的逻辑关系,而不是指定计算的具体步骤。
  2. 规则和事实:逻辑式编程使用一组规则(规则库)和已知的事实来求解问题。程序员提供问题的逻辑规则和初始事实,然后系统根据这些规则和事实进行逻辑推理。
  3. 逻辑推理:逻辑式编程使用逻辑推理技术来从已知的规则和事实中推导出新的结论。它尝试通过逻辑推理来找到问题的解决方案。
  4. 形式化:逻辑式编程的规则和事实通常是形式化的,采用一种形式逻辑(如谓词逻辑)来表达问题的逻辑关系。

逻辑式编程的代表性语言包括Prolog(PROgramming in LOGic)和Datalog。在这些语言中,程序员描述问题的逻辑规则和事实,然后通过查询来获取结果。逻辑式编程在人工智能、数据库查询、自然语言处理等领域得到广泛应用。

示例代码:使用Prolog实现一个简单的家庭关系查询

father(john, bob).
father(bob, alice).
father(bob, eve).
mother(lisa, alice).
mother(lisa, eve).

parent(X, Y) :- father(X, Y).
parent(X, Y) :- mother(X, Y).

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).

在上述示例中,我们使用Prolog语言定义了一些家庭关系规则。规则包括father、mother、parent和ancestor,分别表示父亲、母亲、父母和祖先之间的关系。然后我们可以通过查询来查找家庭成员之间的关系,例如查询ancestor(john, alice)将返回true,表示"john"是"alice"的祖先。

六、泛型编程

泛型编程(Generic Programming Paradigm):实现通用、灵活的数据结构和算法,提高代码的复用性和可扩展性。泛型编程通过参数化类型和算法来实现通用性,使得程序员可以编写一次代码,然后在不同的数据类型上重复使用。

主要特点和原则:

  1. 参数化类型:泛型编程使用参数化类型,也称为泛型,来表示通用的数据类型。这使得可以编写适用于多种数据类型的代码,而不需要为每种数据类型编写特定的实现。
  2. 数据结构和算法:泛型编程通常应用于数据结构和算法的实现。通过泛型,可以在同一份代码中处理不同类型的数据,从而提高代码的复用性。
  3. 类型安全:泛型编程在编译时进行类型检查,确保代码的类型安全性。这样可以避免在运行时出现类型错误。
  4. 适用于多种数据类型:泛型编程可以适用于不同的数据类型,包括基本数据类型和自定义数据类型。

泛型编程的代表性语言包括C++和Java。在这些语言中,泛型可以通过模板(Template)机制(C++)或泛型类和泛型方法(Java)来实现。

示例代码:使用泛型编程实现一个通用的栈数据结构

public class GenericStack<T> {
    private List<T> stack;

    public GenericStack() {
        stack = new ArrayList<>();
    }

    public void push(T item) {
        stack.add(item);
    }

    public T pop() {
        if (!isEmpty()) {
            return stack.remove(stack.size() - 1);
        } else {
            throw new RuntimeException("Stack is empty");
        }
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }
}

public class GenericProgrammingDemo {
    public static void main(String[] args) {
        GenericStack<Integer> intStack = new GenericStack<>();
        intStack.push(1);
        intStack.push(2);
        intStack.push(3);

        while (!intStack.isEmpty()) {
            System.out.println(intStack.pop()); // Output: 3, 2, 1
        }

        GenericStack<String> stringStack = new GenericStack<>();
        stringStack.push("Hello");
        stringStack.push("World");

        while (!stringStack.isEmpty()) {
            System.out.println(stringStack.pop()); // Output: "World", "Hello"
        }
    }
}

在上述示例中,用泛型编程实现了一个通用的栈(Stack)数据结构GenericStack。通过在类定义中使用泛型参数<T>,我们可以创建适用于不同数据类型的栈对象。在示例中,我们分别创建了一个存储整数的栈和一个存储字符串的栈,并对它们进行了一些操作。

七、并发编程

并发编程(Concurrent Programming Paradigm):充分利用多核处理器和分布式计算环境的优势,使得程序能够更加高效地利用计算资源,提高系统的性能和吞吐量。

主要特点和原则:

  1. 并发性:并发编程关注同时处理多个计算任务,通过同时执行多个任务来提高程序的效率。
  2. 线程和进程:并发编程通常使用线程和进程作为基本执行单位,允许多个任务在同一时间并行执行。
  3. 共享资源:并发编程中的任务可能共享同一资源(如内存、文件等),需要合理地进行协调和同步,避免出现竞态条件和数据不一致问题。
  4. 锁和同步:为了保证共享资源的正确访问,并发编程使用锁和同步机制来实现资源的互斥访问。

示例代码:使用多线程并发编程计算列表中所有元素的平方

def square(num):
    return num * num

def calculate_square(numbers):
    results = []
    for num in numbers:
        results.append(square(num))
    return results

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 创建两个线程来并行计算列表中元素的平方
thread1 = threading.Thread(target=lambda: calculate_square(numbers[:5]))
thread2 = threading.Thread(target=lambda: calculate_square(numbers[5:]))

# 启动线程
thread1.start()
thread2.start()

# 等待两个线程执行完毕
thread1.join()
thread2.join()

# 合并两个线程的结果
results = thread1.result + thread2.result

print("Squared numbers:", results)

在上述示例中,使用多线程并发编程计算列表numbers中所有元素的平方。我们创建了两个线程来分别计算前半部分和后半部分的元素平方,并通过线程的result属性将结果合并。

八、分布式编程

分布式编程:用于开发分布式系统。分布式系统是由多台计算机(或节点)组成的系统,在这些计算机之间共享任务和资源,以完成复杂的任务。分布式编程的目标是协调不同节点之间的通信和合作,使得系统能够高效地工作并具有可扩展性。

主要特点和原则:

  1. 通信:在分布式编程中,节点之间需要通过网络进行通信。节点可以是位于同一地点或全球范围的计算机。
  2. 同步和异步:节点之间的通信可以是同步的(阻塞式)或异步的(非阻塞式)。异步通信常用于提高系统的并发性和性能。
  3. 容错性:分布式系统可能面临节点故障或网络故障。分布式编程需要考虑容错性,确保系统在出现故障时仍能正常工作。
  4. 一致性:分布式系统中的数据可能分布在不同的节点上。分布式编程需要解决一致性问题,确保数据在所有节点上保持一致。

分布式编程在现代计算中非常重要,特别是在云计算、大数据处理和分布式数据库等领域。常见的分布式编程框架包括Apache Hadoop、Apache Spark、Apache Kafka等。这些框架提供了丰富的分布式编程工具和库,使得开发分布式系统更加便捷和高效。

示例代码:使用Java实现一个简单的分布式计算任务

public class DistributedProgrammingDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(4);

        // 定义一个计算任务
        Callable<Integer> task = () -> {
            int result = 0;
            for (int i = 1; i <= 100; i++) {
                result += i;
            }
            return result;
        };

        // 提交任务到线程池进行计算
        Future<Integer> future1 = executorService.submit(task);
        Future<Integer> future2 = executorService.submit(task);

        // 获取计算结果
        int result1 = future1.get();
        int result2 = future2.get();

        // 关闭线程池
        executorService.shutdown();

        // 打印结果
        System.out.println("Result 1: " + result1);
        System.out.println("Result 2: " + result2);
    }
}

在上述示例中,使用Java的ExecutorService来创建一个线程池,然后定义一个计算任务task,该任务计算1到100的和。我们将这个任务提交给线程池进行计算,并通过Future对象来获取计算结果。通过线程池,我们可以将计算任务分布到不同的线程上并行执行,实现了简单的分布式计算。

九、响应式编程

响应式编程(Reactive Programming):主要用于处理异步数据流和事件序列。它通过使用观察者模式或迭代器模式来处理数据的变化,自动传播数据的变化并引起相关依赖项的更新。响应式编程范式的目标是提供一种简洁、灵活和高效的方式来处理异步数据流,同时减少代码中的回调地狱和复杂性。

主要特点和原则:

  1. 数据流:响应式编程将数据视为一系列的事件或数据流,而不是静态的值。这些数据流可以是来自用户输入、网络请求、传感器数据等。
  2. 响应式机制:响应式编程使用观察者模式或迭代器模式来监听数据流的变化,并在数据发生变化时自动更新依赖项。
  3. 异步处理:响应式编程通常用于处理异步操作,例如处理网络请求或用户输入等。它可以避免使用传统的回调函数或回调地狱,提高代码的可读性和可维护性。
  4. 响应式链式操作:响应式编程通常支持链式操作,允许通过一系列操作符对数据流进行转换和处理。这样可以方便地对数据进行过滤、映射、合并等操作。

响应式编程范式在现代编程中越来越受欢迎,尤其在处理复杂的前端应用和响应式UI中,如使用React、Angular和Vue.js等框架。同时,响应式编程也在后端和服务端编程中发挥重要作用,用于处理异步任务和事件驱动的应用。

示例代码:使用响应式编程处理简单的数据流

public class ReactiveProgrammingDemo {
    public static void main(String[] args) {
        // 创建一个包含1到5的数据流
        Observable<Integer> observable = Observable.range(1, 5);

        // 对数据流进行操作,将每个元素都乘以2
        observable
            .map(number -> number * 2)
            .subscribe(
                // 订阅处理每个元素
                number -> System.out.println("Processed number: " + number),
                // 订阅处理错误
                error -> System.err.println("Error: " + error),
                // 订阅完成
                () -> System.out.println("Processing complete!")
            );
    }
}

在上述示例中,使用响应式编程处理一个简单的数据流,其中包含1到5的整数。我们通过Observable创建数据流,然后使用map操作符将每个元素乘以2,最后订阅数据流并处理每个元素。

十、面向领域编程

面向领域编程(Domain-Specific Programming):旨在解决特定领域的问题,并为该领域定义专门的语言和工具。面向领域编程将关注点从通用的编程语言转移到特定领域的需求上,使得程序员可以更专注于解决领域问题,而不是关注实现细节。

主要特点和原则:

  1. 领域特定语言(DSL):面向领域编程使用领域特定语言(DSL),这是一种专门为解决特定领域问题而设计的语言。DSL可以根据领域需求定义领域相关的关键字、语法和语义,使得程序员可以用更接近自然语言的方式表达领域问题。
  2. 领域建模:面向领域编程重视对领域进行建模和抽象,从而更好地理解和解决领域问题。领域建模可以通过定义领域模型和领域对象来实现。
  3. 领域专家参与:面向领域编程鼓励领域专家和程序员之间的密切合作,以确保领域需求得到准确地反映在DSL和程序设计中。

面向领域编程通常应用于特定的领域,如科学计算、金融、医疗、游戏开发等。DSL可以是内部DSL(嵌入在通用编程语言中的DSL)或外部DSL(独立于通用编程语言的DSL)。

示例代码:使用面向领域编程实现一个简单的规则引擎DSL

class RuleEngine:
    def __init__(self):
        self.rules = []

    def add_rule(self, condition, action):
        self.rules.append((condition, action))

    def run(self, data):
        for condition, action in self.rules:
            if condition(data):
                action(data)
                break

                # 面向领域编程实现一个简单的规则引擎DSL
engine = RuleEngine()

# 定义规则
engine.add_rule(lambda data: data["temperature"] > 30,
                lambda data: print("It's hot! Turn on the fan."))

engine.add_rule(lambda data: data["temperature"] < 10,
                lambda data: print("It's cold! Turn on the heater."))

# 运行规则引擎
data = {"temperature": 25}
engine.run(data) # Output: "It's hot! Turn on the fan."

在上述示例中,使用面向领域编程实现了一个简单的规则引擎DSL。我们定义了两个规则,一个用于判断温度是否大于30摄氏度,另一个用于判断温度是否小于10摄氏度。根据输入的数据,规则引擎会根据规则进行条件判断并执行相应的动作。


如果文章对你有帮助,欢迎关注+点赞!

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

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

相关文章

VTK学习笔记(二十一)

显示立方体已经做过了&#xff0c;现在想简单处理一下立方体&#xff0c;比如每个面上增加一些文字。效果如下。 #include <vtkAnnotatedCubeActor.h> #include <vtkCamera.h> #include <vtkNamedColors.h> #include <vtkNew.h> #include <vtkPrope…

连续两年增收不增利,比亚迪电子靠新能源汽车业务再次起飞?

在净利润连续两年下挫之后&#xff0c;比亚迪电子&#xff08;00285.HK&#xff09;终于迎来了好消息。 不久前比亚迪电子发布2023年中期盈利预告显示&#xff0c;上半年净利润同比增加115%-146%&#xff08;2022年上半年的净利润显示6.34亿元&#xff09;。 这主要受益于大客…

H5 防止安卓手机软键盘弹出挤压页面导致变形的方法

一、问题&#xff1a; 在做移动端h5页面时&#xff0c;安卓端软键盘会导致页面压缩变形的问题&#xff1a;&#xff08;安卓端有问题&#xff0c;IOS端没问题&#xff09; 二、原因分析 安卓端&#xff1a;安卓中&#xff0c;如果将footer元素设置为position:fixed或absolute&…

FlashAttention

一、 论文题目&#xff08;发表处-时间&#xff09; FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 二、主要方向 新型注意力机制 三、细化任务 一种具有 IO 感知&#xff0c;且兼具快速、内存高效的新型注意力算法 四、论文动机 一般对…

DQNs【Vanilla DQN Double DQN Dueling DQN】

DQNs 文章目录 DQNs1. DQN及其变种介绍1.1 Vanilla DQN1.2 Double DQN1.3 Dueling DQN 2. Gym环境介绍2.1 Obseravtion Space2.2 Reward Function2.3 Action Space 3. DQNs Code3.1 Vanilla DQN效果3.2 Double DQN效果3.3 Dueling DQN效果 Reference ​ 在 Reinforcement Lear…

14 | 菜品订单分析

本次研究将以菜品订单分析为主题,探讨如何从订单数据中获取有价值的见解。我们将借助数据分析技术,深入研究菜品的销售情况、客户的点餐偏好、订单的时间分布等方面,从而帮助餐厅更好地了解消费者需求,优化经营策略,提升客户体验。通过对菜品订单数据的深入分析,我们可以…

移动电子商务多用户B2B2C商城系统开发

多用户B2B2C商城pc端区块链应用开发的数据运营是为了更好地利用数据&#xff0c;提高商城的运营效率和用户体验。以下是数据运营的六个步骤&#xff1a; 数据采集 数据采集是数据运营的基础。在商城开发过程中&#xff0c;需要采集用户数据、交易数据、商品数据等。这些数据可…

APP备案明明是好事,为啥有些人反对呢?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; APP和小程序备案&#xff0c; 这事在网上闹的沸沸扬扬&#xff0c;明明是好事&#xff0c;可为啥那么多人反对呢?而且最近出现了好多阴阳怪气的声音。 话说从2005年3月起&#xff0c;国内所有的网…

linux 查询后台任务及杀掉进程

查看后台任务命令 jobs -l删除后台进程命令 kill -9 28719

Linux 发行版 Debian 12.1 发布

导读在今年 6 月初&#xff0c;Debian 12“bookworm”发布&#xff0c;而日前 Debian 迎来了 12.1 版本&#xff0c;主要修复系统用户创建等多个安全问题。 Debian 是最古老的 GNU / Linux 发行版之一&#xff0c;也是许多其他基于 Linux 的操作系统的基础&#xff0c;包括 Ub…

本地oracle登录账号锁定处理,the account is locked

1.打开cmd命令窗口 2.打开sqlplus: sqlplus /nolog(加/nolog是不登录服务器的意思&#xff0c;不加就需要输账号密码) 3.切换到管理员&#xff1a;conn / as sysdba; 第2步第3步可以合并&#xff0c;直接使用sysdba登录&#xff1a;sqlplus / as sysdba; 4.解锁账号&#x…

【BASH】回顾与知识点梳理(二十一)

【BASH】回顾与知识点梳理 二十一 二十一. Linux 的文件权限与目录配置21.1 使用者与群组属主(文件拥有者)属组(群组概念)其他人的概念root(万能的天神)Linux 用户身份与群组记录的文件 21.2 Linux 文件权限概念Linux 文件属性Linux 文件权限的重要性 21.3 如何改变文件属性与权…

数字孪生三剑客来了!MapGIS Earth for Unreal的自述

嗨&#xff0c;大家好&#xff01;我的名字叫MapGIS Earth for Unreal&#xff0c;是MapGIS数字孪生平台产品家族的一员。提起我&#xff0c;大家可能不熟悉&#xff0c;但是提起数字孪生&#xff0c;想必大家倍感兴趣。 数字孪生是充分利用物理模型、传感器更新、运行历史等数…

ApacheCon - 云原生大数据上的 Apache 项目实践

Apache 软件基金会的官方全球系列大会 CommunityOverCode Asia&#xff08;原 ApacheCon Asia&#xff09;首次中国线下峰会将于 2023 年 8 月 18-20 日在北京丽亭华苑酒店举办&#xff0c;大会含 17 个论坛方向、上百个前沿议题。 字节跳动云原生计算团队在此次 CommunityOve…

微信公众号模板消息推送测试Python版无需服务器-保姆级教程

手上有个项目&#xff0c;是服务器挂着自动化的爬虫的&#xff0c;但我用的那个IP代理商没有用尽报警&#xff0c;导致几次IP用尽&#xff0c;程序爬不到数据&#xff0c;进程死循环了。之前想过发邮箱提醒我&#xff0c;但是邮箱把又不及时&#xff0c;老忘记看&#xff0c;因…

QGIS开发五:VS使用QT插件创建UI界面

前面我们说了在创建项目时创建的是一个空项目&#xff0c;即不使用 Qt 提供的综合开发套件 Qt Creator&#xff0c;也不使用 Qt Visual Studio Tools 这类工具。 但是后面发现&#xff0c;如果我想要有更加满意的界面布局&#xff0c;还是要自己写一个UI文件&#xff0c;如果不…

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…

c++11 标准模板(STL)(std::basic_fstream)(四)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_fstream : public std::basic_iostream<CharT, Traits> 类模板 basic_fstream 实现基于文件的流上的高层输入/输出。它将 std::basic_i…

超快软恢复二极管的特点与应用,你必须看的好文章~

什么是超快软恢复二极管&#xff1f; 超快软恢复二极管&#xff08;Ultrafast Soft Recovery Diode&#xff09;是一种特殊的二极管&#xff0c;它具有较快的恢复速度和较低的反向恢复电荷。它通常用于高频开关电路和电源应用中&#xff0c;以提高效率和降低开关损耗。 超快软…

多人协同编辑文档:实现无限制的团队协作!

什么是多人协同编辑文档&#xff1f; 多人协同编辑文档是指两个或以上的用户同时对同一文件进行修改、编辑等操作。 多人协同编辑文档的优点 1、提高办公效率&#xff1a;多人协同编辑文档的出现&#xff0c;避免了传统的文件共享方式中的效率低以及文件版本不一致的问题。 …