69、Python番外篇:从编程范式看如何学习一门编程语言的精髓

news2024/11/17 21:20:47

引言

在之前的文章中,我们曾聊过如何学习一门编程语言,当时是从程序的构成的角度来分析、展开的,主要提及了数据的表达 + 数据的处理,也就是数据结构 + 算法的内容。这个角度对应到所有编程语言,基本都是适用的。但是,实际上编程语言的种类有很多,每种语言又有各自所独有的特性。如果我们不能掌握到一门编程语言所独有的特性,有时候,甚至不能说我们真正学会了这门语言。

所以,今天这篇文章,我打算从编程范式的角度切入,继续聊聊关于如何学习编程语言的话题。

本文的主要内容有:

1、什么是编程范式

2、常见的编程范式的特点及适用场景

3、结合编程范式深入学习编程语言

什么是编程范式

所谓“范式”,可以简单理解为“示范”、“样板”等,也可以理解为对一些相对固定的问题域所总结、形成的最佳实践所需要遵从的基本原则、模式等。

所谓“编程范式(Programming Paradigms)”是在组织和构建程序中所应用的思维模式、方法论或者是一套需要遵循的实践原则。理解和掌握编程范式有助于程序员快速选择最合适的方法来进行编程,以解决特定的问题。

需要说明的是,由于具体的业务场景、问题域的不同,对应就存在多种不同的编程范式。如同我们选择编程语言时,语言之间没有绝对的高下之分。编程范式也是一样的,各自有其使用的场景和领域。因此,选择了适合的编程范式,可以编写出更加高效、可扩展、易于维护的程序。但是,如果选择了不太适合的编程范式,则可能是“削足适履”,处处都显得拧巴。

编程范式与编程语言是多对多的关系,一个编程语言可能支持一种编程范式,也可能支持多种编程范式。不同的编程语言,可能同属于同一种编程范式。

常见的编程范式的特点及适用场景

虽然在之前的文章中,我们从来没有特别提到“编程范式”的概念。其实,编程范式类似于“道”的概念,属于一种“日用而不自知”的状态。我们至少已经应用过过程式编程、面向对象编程,其实它们就是两种最常见的编程范式。

常见的编程范式大概有如下几种:

1、过程式编程(Procedural Programming):是基于函数和过程的,强调的是执行顺序及状态的共享。这个范式也是大多数编程新手最先接触、并且使用最多的一种编程范式。

2、面向对象编程(Obejct-Oriented Programming, OOP):基于类和对象,通过类的抽象、封装、继承、多态等特性,构建更加可扩展、易维护的软件系统。

3、函数式编程(Functional Programming, FP):以纯函数为基础,强调数据的不变性和函数的组合。

4、声明式编程(Declarative Programming):强调描述需要的结果,而不是如何去实现它。

5、逻辑编程(Logic Programming):以逻辑声明和规则为基础,进行程序的构建,通过推理引擎获得计算结果。

6、并发编程(Concurrent Programming):以并发概念为基础,通过多线程、多进程模型来构建并发执行的程序。

7、反应式编程(Reactive Programming):以系统能够对外部事件做出快速响应为出发点,关注数据流和变化的传播。

接下里,分别介绍一下这些编程范式的主要特征、适用的场景,以及支持该编程范式的典型的编程语言。

过程式编程

主要特征:

1、基于过程:程序之间是通过过程(函数、子程序等)来组织的。

2、顺序执行:代码按照顺序执行,依赖控制流程的循环、分支判断。

3、状态共享:过程之间通过全局变量、局部变量等来实现程序的状态共享。

适用场景:

1、系统编程:比如操作系统、中间件等的开发。

2、嵌入式系统:如设备驱动程序、软硬件的接口等。

3、简单的工具、脚本:日常重复的工作内容的自动化脚本、数据处理脚本等。

典型的编程语言:

1、C语言:最典型的过程式编程语言,科班出身的开发者的入门语言。需要特别说明的是,C语言始终没有过时,关键看适用场景,系统编程、嵌入式系统中还是在广泛使用C语言编程。

2、Pascal、Fortran:古董级编程语言,除了特定领域、历史系统维护,应该较少被使用了。

面向对象编程

主要特征:

1、类和对象:程序通过类和对象来进行组织。

2、抽象:强调从业务中的实体、功能进行抽象,定义类。

3、封装:将属性、状态和操作、功能封装在对象的内部。

4、继承:通过继承机制实现共性的复用。

5、多态:同一个操作作用于不同类型的对象,呈现出不同的行为。

适用场景

1、大型复杂系统:不同于系统编程,更强调的是复杂业务系统。

2、游戏开发:游戏角色、逻辑、引擎等。

3、图形图像处理:如CAD、图像编辑等。

典型的编程语言

1、Java/C#:企业级应用,可以说被最广泛地使用。

2、C++:游戏开发等对性能有所要求的场景。

3、Python:一切皆对象的设计理念,对面象对象范式的支持最为彻底。
 

函数式编程

主要特征:

1、纯函数:强调使用没有副作用的纯函数,不会改变外部状态。

2、不可变性:数据不可变,所有的操作均返回新的数据。

3、高阶函数:函数可以作为参数、返回值进行传递。

4、组合:通过对函数的组合实现更加复杂的操作。

适用场景

1、数据的处理和分析:比如流式数据处理。

2、并行计算:由于不可变性的特征,天然具备线程安全特性,适合并行计算。

3、递归算法:比如对复杂数据结构,如树、图的处理等。

典型的编程语言

1、Lisp、Haskell

2、Scala

3、Python

声明式编程

主要特征:

1、描述结果:描述需要什么,无需考虑如何实现。

2、不可变性:通常数据是不可变的。

3、高抽象:代码高度抽象,减少样板代码。

适用场景

1、数据库查询:比如SQL查询。

2、配置管理:如mvn、yaml等配置文件管理。

3、用户界面构建:如html、css等。

典型的编程语言

1、SQL:这里需要为SQL正名,有些人不把SQL当做一门编程语言。但是,SQL是一门特别实用、半衰期最长的一门编程语言。在数据库查询、管理方面始终是最实用的。

2、HTML:也是编程语言啊,早期被误解为美工的语言。

逻辑编程

主要特征:

1、基于逻辑:由逻辑声明和规则组成。

2、推理引擎:通常需要通过推理引擎计算结果。

3、声明式:程序员描述逻辑关系,推理引擎负责求解。

适用场景

1、机器学习与人工智能:自然语言处理、各种专家系统。

2、数学建模:线性规划、调度等问题。

典型的编程语言

1、Prolog

2、Datalog

并发编程

主要特征:

1、多线程、多进程:通过线程和进程实现并发执行。

2、同步、异步协作:通过同步、异步机制进行子任务之间的协同。

3、并发数据结构:锁、信号量、消息队列等。

适用场景

1、网络服务器:如http服务器、数据库服务器等。

2、实时系统:如嵌入式系统、控制系统。

3、高性能计算:科学计算、金融分析等。

典型的编程语言

1、Go

2、Erlang

3、Java、Python

反应式编程

主要特征:

1、数据流和变化传播:关注数据流和变化的传播。

2、响应式:系统能对外部事件做出快速响应。

3、组合和变换:通过组合和变换操作处理数据流。

适用场景

1、GUI开发:前端开发、桌面应用等。

2、实时数据处理:物联网、金融等。

3、事件驱动系统:监控系统、通知系统等。

典型的编程语言

1、JavaScript

2、Scala

3、Java

结合编程范式深入学习编程语言

在对编程语言相关语法特性已经有所掌握的基础上,想要进一步深入学习一门编程语言,可以尝试通过以下步骤:

1、了解编程语言所支持的编程范式,选择支持最好的编程范式。

2、深入理解该编程范式的主要特征,并探究该编程语言对当前编程范式各个特性的实现机制。

3、结合编程范式的核心特性进行大量的编码实践,一方面加深对编程语言相关特性的掌握程度,另一方面,基于实践反复印证编程范式的特性以及加深对这些特性存在必要性的理解。

4、基于对编程范式的深入理解,应用到实际的业务场景中的项目实战。进一步思考该编程范式的契合点,以及如果使用其他范式,会产生的难以实现的阻塞点。

5、在对该语言、该编程范式的熟练掌握基础上,继续学习其他范式,通过对比分析,更加深刻体会不同范式各自的特征、使用场景及不足之处。在后续的工作中,更加自然地应用最适合的编程范式。

总结

本文简单介绍了编程范式的概念,然后列举了一些常见的编程范式,并比较了各个编程范式的主要特性、适用场景以及有代表性的编程语言。最后结合编程范式深入学习一门编程语言所建议遵循的学习步骤。

感谢您的拨冗阅读,希望对您有所帮助。

b26701ae518093b4d36d6783ea231afa.jpeg

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

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

相关文章

认识泛型和包装类

认识泛型和包装类 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 什么是泛型引出泛型语法 泛型类的使用语法示例类型推导 裸类型(Raw Type)说明 泛型如何编译的擦除机制 泛型的上界语法示例复杂示例 泛型方法定义方法示例使用类型推导和不用类型推导静态的泛型…

电脑安装OpenWRT系统

通过网盘分享的文件:OpenWRT 链接: https://pan.baidu.com/s/1nrRBeKgGviD31Omji480qA?pwd9900 提取码: 9900 下面开始教程: 1.先把普通U盘制作成一个PE启动盘,我用的是微PE工具箱,直接安装PE到U盘。 2.把写盘工具和openWRT系统…

项目中使用简单的立体3D柱状图,不用引入外部组件纯css也能实现

在一些项目需求中&#xff0c;可能会遇到下面这种场景&#xff0c;3d柱状图来展示百分比&#xff0c;但是又不想引入外部组件&#xff0c;下面就用纯css给大家封装了一个组件 先赞后看&#xff0c;养成习惯 <template><view class"lui-column-bg" :sty…

DApp开发入门指南:从概念到实践

随着区块链技术的不断发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为科技领域的热门话题。DApp不仅打破了传统应用的中心化控制&#xff0c;还为开发者和用户提供了更高的安全性、透明度和自治性。本文将带你深入了解DApp的开发流程以及如何设计合理的DApp…

SIMCOM-A4767C-4G模块ARM开发板上网配置流程

进入linux系统命令行后。 配置4G网卡 1、打开串口&#xff0c;会进入编辑模式。 busybox microcom /dev/ttyUSB22、设置网络模式&#xff0c;回复OK表示设置成功。 ATDIALMODE03、设置ECM模式&#xff0c;回复OK表示设置成功。设置成功后4g会重启。 AT$MYCONFIG"USB…

Vue3:el-table实现日期的格式化

后端如果返回的是时间戳&#xff0c;需要我们进行日期格式化 例如&#xff1a;2024-09-11T14:19:14 定义一个日期解析的工具组件 export function formatDateAsYYYYMMDDHHMMSS(dateStr: any) {const date new Date(dateStr);const year date.getFullYear();const month S…

【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决

1. xxl-job 报错日志 2024-09-11 17:19:04 [com.xxl.job.core.thread.JobThread#run]-[133]-[xxl-job, JobThread-3-1726046344528] <br>----------- xxl-job job execute start -----------<br>----------- Param: 2024-09-11 17:19:04 [com.xxl.job.core.thread…

使用mingw64 编译 QT开发流程

1. 安装QT5 QT5.12.12 安装时选择mingw的开发包 2. 使用qtdesigner 进行ui设计 生成ui文件 3. 将ui文件转换为.h 文件 uic mywindow.ui -o ui_mywindow.h代码中指向生成的 UI 对象的地方 要改成这个Form 4. 编译 创建mainwindow.cpp #include "mainwindow.h"…

PROTOTYPICAL II - The Practice of FPGA Prototyping for SoC Design

The Art of the “Start” The semiconductor industry revolves around the “start.” Chip design starts lead to more EDA tool purchases, more wafer starts, and eventually to more product shipments. Product roadmaps develop to extend shipments by integrating…

Ton的编译过程(上)

系列文章目录 FunC编写初始准备 文章目录 系列文章目录预先准备第一个FunC合约深入compileFunc的内部compileFunc初探艾丽卡的疑惑package.json 初览index.js 预先准备 首先请大家跟着艾丽卡一步一步的完成FunC编写初始准备 这里面环境的搭建。 接下来&#xff0c;请做好下面…

博弈论中纳什均衡和囚徒困境的探索性分析

一. 纳什均衡求解 纳什均衡&#xff0c;又称为非合作博弈均衡&#xff0c;是博弈论中的一个核心概念。纳什均衡描述的是在非合作博弈中&#xff0c;每个参与者都选择了自己的最优策略&#xff0c;并且考虑到了其他参与者的策略选择。在这种状态下&#xff0c;没有任何一个参与…

HAL库学习梳理——SPI

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关 SPI 课程知识和应用做一个梳理。 无流可省 1、SPI 总线基本原理 SPI总线&#xff08;Series Peripheral Interface&#xff09;串行外设接口&#xff0c;适用于高速、双向数据传输场景。 MOSI MISO SCK …

提权——Linux

一、系统漏洞提权 #kali的nmap命令 nmap -O 目标ip 通过当前系统的内核版本搜索当前系统的漏洞&#xff0c;进行利用 搜索漏洞 对linux系统的漏洞进行利用&#xff08;脏牛、脏管道等&#xff09; 利用漏洞搜索工具&#xff0c;搜索当前系统是否存在一些漏洞 linux-exp…

单值二叉树--(C语言)

题目如下&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&a…

Linux - 探秘/proc/sys/net/ipv4/ip_local_port_range

文章目录 Pre概述默认值及其意义评估需求如何调整临时修改永久修改测试和验证 修改的潜在影响 Pre Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置 计划&#xff1a; 简要解释 /proc/sys/net/ipv4/ip_local_port_range 文件的功能和作用。介绍该文件的默认值及其影响。说明…

Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)

文章目录 3.3 依赖倒转原则(DIP)3.3.1概述3.3.2 案例 3.3 依赖倒转原则(DIP) Dependency Inversion Principle&#xff0c;DIP 3.3.1概述 高层模块不应该依赖低层模块&#xff0c;两者都应该依赖其抽象&#xff1b;抽象不应该依赖细节&#xff0c;细节应该依赖抽象。简单的说…

C++——深部解析哈希

好久不见给大家分享一张图片吧 目录 前言 二、库文件 1、哈希冲突 2 哈希函数 3、闭散列 三 、闭散列的实现和底层逻辑 1、哈希表&#xff08;闭散列&#xff09;的定义 2、哈希表&#xff08;闭散列&#xff09;的插入 3、哈希表&#xff08;闭散列&#xff09;的查找 4.哈希表…

解决Linux服务器上下载pytorch速度过慢的问题

需要下载的是GPU版本的pytorch&#xff0c;版本torch1.13.1cu116 尝试方法1&#xff1a; pip install torch1.13.1cu116 torchvision0.14.1cu116 torchaudio0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116 但是默认是从官网下载&#xff0c;龟速到200kb/s左…

Vscode中启动Vue2.x项目运行正常但templete部分UI组件红色波浪线报错 ts(2339)

Vscode中启动Vue2.x项目运行正常但templete部分UI组件红色波浪线报错 错误示例 原因 Vue - Official 插件升级导致的问题(具体原因有待查询) 解决方案 打开Vscode软件 —> 找到扩展插件 —> 选择Vue - Official —> 安装特定版本(版本 < V2.0.28就行) —> 重…