学了4年C++后,我转向了Python

2023-05-16

 

C++ 已经学不动了,现在换 Python 还来得及吗?一位四年工作经验的 C++ 程序员亲述转型历程,这不仅仅是语言上的转变,而是代码思维甚至工作环境的转变。

通常,程序员会认为 Python 编码比较简单,即便是在校学生也可轻松入门,这是大多数转型 Python 程序员的最初想法。当然,Python 程序员现在的社会需求更大,薪资也相对更高一些。随着 C++ 的日益增负,不少程序员都抱怨“希望 C++ 别再加了,实在是学不动了”,本文讲述了一名具备四年工作经验的 C++ 程序员转行学习 Python 的心路历程。

1由深入浅

最近几年,从 C++ 转型 Python 的程序员不在少数,毕竟由深入浅易,由浅入深难。学习 C ++ 感觉就像在海里深潜,潜的越深,景色越美,但需要付出更多时间和精力。总的来说,最终所覆盖的距离并不会很大。Python 有点像浮潜,很容易触碰,如果可以持续投入学习,很快就可以有所领悟。从这儿可以清楚看出,每种语言都应该在正确的地点和时间使用。

2C ++ 语法更严格,Python 库更丰富

C ++ 语法更加严格,一旦出现编码错误,基本会连带发生很严重的后果。C++ 程序员通常需要深入了解计算机、编译器和编程语言语法。当深入了解时,我们可以看到并被一些事物所吸引,比如编译过程和内存管理。

作为 C ++ 程序员,大部分人往往更关心语法调整和场景用例,注重内存分配及释放。程序更加独立,编程人员往往清楚知道代码会发生什么,同时认为其他人写的代码不太可靠,更容易出错,并且可能会破坏内存用量。

C++ 程序员的主要日常工具是 Vim,有许多用于编写代码的插件,用于调试的 GDB 和用于分析内存使用和错误的 Valgrind,可能用 g++ 编译并编写 Makefile。此时,作者并不认为 IDE 会让其受益,反而非常依赖编译器来查找错误类型。

3转型 Python,要学会放手

转换 Python 需要学习的第一件事就是放手,程序员不必再了解底层发生了什么,内存是否被分配或释放,这些都没有关系。因为 Python 可以使用其他人编写的代码,这些代码被打包成库,程序员可直接在代码中调用,可以节省时间并帮助更快地编写代码。这并不意味着编码速度变慢,或者依赖未维护和无功能的库,但重点肯定是不同的。

当作者开始用 Python 编写代码时,首先用 Python 编写了 C ++ 代码,虽然这也可以生成最终运行效果,但并没有从 Python 语言中获益。只有以更“Pythonic”的方式编写并使用库以及更高级的概念(如生成器,装饰器和上下文)时,Python 编码才得到改进。

作为一名 Python 开发人员,倾向于首先考虑能解决手头问题的库。Python 拥有丰富的库生态系统和支持社区,几乎可以完成任何事情。目前比较常用的库是,NumPy 用于数值计算,OpenCV 用于计算机视觉,json 用于读取 json 文件,SciPy 用于科学计算,sqlite3 用于数据库。

目前,作者使用的日常工具是带有 IdeaVim 插件的 PyCharm(一个 IDE),一个功能强大的调试器,比默认的 Python 调试器 pdb 更友好,也会使用 pip 来安装需要的库。除非真的需要,否则不会再监视内存使用情况。实用技巧

如果是 C ++ 开发人员,并且考虑开始使用 Python 编写代码,以下是作者的建议:

  • 摆脱旧习惯。停止使用 C ++ 编译器作为调试器,不过度优化内存使用情况。避免编写类似 C ++ 的代码,尽量不依赖类型。

  • 培养新习惯。开始使用库写 Pythonic 代码(但不要过度)。

  • 保持可读性。使用更复杂的概念,例如生成器、装饰器、上下文等,可以试试 PyCharm。

  • 使用 C ++ 和 Python 公共库。某些 C ++ 库(如 OpenCV 和 QT)具有 Python 接口,程序员很容易在 Python 中使用相同的库,而不是从头开始学习新库。

  • 不要忘记二者的本质区别。Python 有时太慢或不适合任务,这就到了运用 C ++ 知识的时候了。在 Python 中使用 C ++ 代码的方法有很多,比如 SIP、ctypes 等。

4写在最后

当转换到一种新的编程语言,尤其是与个人习惯完全不同的语言时,需要花费大量时间学习、挖掘、发现,最重要的是要明白不仅语言应该改变,编码风格和工作方法也要改变,因此需要提前做好大量准备工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学了4年C++后,我转向了Python 的相关文章

  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • Series.sort() 和 Series.order() 有什么区别?

    s pd Series nr randint 0 10 5 index nr randint 0 10 5 s Output 1 3 7 6 2 0 9 7 1 6 order 按值排序并返回一个新系列 s order Output 2 0
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • Spark 和 Python 使用自定义文件格式/生成器作为 RDD 的输入

    我想问一下 Spark 中输入的可能性 我可以看到从http spark apache org docs latest programming guide html http spark apache org docs latest pro
  • Plotly:如何检查基本图形结构(版本 4)

    对于旧版本的plotly 例如在 Jupyterlab 中 您可以简单地运行figure像这样检查你的图形的基础知识 Ouput data marker color red size 10 symbol 104 mode markers l
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • Docker配置Ubuntu容器、ssh远程连接该容器

    span class token comment 详细请参考 https juejin cn post 6982419819211522079 span span class token comment 1 拉取 ubuntu 镜像 spa
  • Eth-Trunk链路聚合原理、静态和动态配置

    Eth Trunk原理 静态和动态配置 Eth Trunk链路聚合概述Eth Trunk链路聚合模式静态配置模式LACP动态模式 Eth Trunk链路聚合概述 在组网中经常遇到的问题 xff0c 单条链路的宽带无法满足整个园区的流量需求时
  • FreeRTOS学习笔记

    FreeRTOS学习历程 总结 xff1a 关键词 xff1a 动态创建 静态创建 任务级 中断级 一个任务至少有一个 span class token keyword do span span class token punctuatio
  • idea2020.1 常用设置

    idea2020 1 常用设置 停用自动更新设置版权自动编译设置插件设置字体大小行间距idea卡顿调整修改快捷键自动生成序列化ID自动导入包 停用自动更新 停用自动更新 xff0c 因为我也不知道更新后能不能用 xfffc 设置作者和代码相
  • 微服务的原理以及多线程的使用

    分布式应 用核 心CAP知识 xff1a CAP定理 指的是在一个分布式系统中 xff0c Consistency xff08 一致性 xff09 Availability xff08 可用性 xff09 Partition toleran
  • 【计算机网络】基础概念总结8-网关、广播和公/私IP

    8 网关 广播和私人地址 8 1 网关 比如有 网络A 和 网络B xff1a 网络A的IP地址范围为 34 192 168 1 1 192 168 1 254 34 xff0c 子网掩码为255 255 255 0 网络B的IP地址范围为
  • 系统上线后是运维流程还是开发过程?

    一位朋友提到这样的问题 xff1a 软件系统上线后是运维流程还是开发过程 xff0c 需求变更量较大的情况 俺的简单建议 xff1a 这个不是二选一的问题 xff0c 系统上线后 xff0c 其实维护和开发的工作都会有 你提到 需求变更量较
  • vnc服务器搭建

    1 vnc 服务简介 vnc Server会在服务器端启动一个监听用户要求的端口 xff0c 一般端口号在5901 xff5e 5910之间 xff0c 当客户端启动X server连接到5901后 xff0c vnc Server再将一堆
  • ubuntu18.04安装显卡RTX3090(python3.8+nvidia Drive455.38+cuda11.1+cudnn7+pytorch1.7+torchvision0.8)

    引言 实验室服务器是Ubuntu18 04 xff08 16 04和20 04 xff09 xff0c 刚刚显卡升级到RTX3090 记录一下装机过程 xff0c 每一个过程的小部分也可能单独用到 所以罗列一些用到的网站链接 xff0c 省
  • 7步教你使用Keil使用注释模板,好好注释,从我做起!

    前言 当你看到别人好的注释模板的时候是否还在多文件复制粘贴呢 xff1f 教你一招 把前人好的模板套用起来 好好注释 xff0c 从我做起 xff01 提示 xff1a 本操作在Keil4环境下进行 xff0c Keil5环境同理 一 打开
  • STM32学习——GPIO应用之跑马灯+蜂鸣器实验

    GPIO应用 跑马灯 43 蜂鸣器实验 跑马灯和蜂鸣器的实验都是使用的 GPIO 的通用推挽输出模式 xff0c 这是 GPIO 最简单的一个基本功能 1跑马灯实验 1 1硬件设计 如图所示跑马灯使用的 LED 只有 DS0 xff08 红
  • STM32学习——串口

    STM32学习 串口 USART通用同步异步收发器 xff08 Universal Synchronous Asynchronous Receiver Transmitter xff09 是一串行通信设备 xff0c 可以灵活地与外部设备进
  • core dumped 错误

    Aborted xff08 core dumpde xff09 一般是关于内存异常 xff1a 详细解释 gdb使用 1 往受到系统保护的内存地址写数据 有些内存是内核占用的或者是其他程序正在使用 xff0c 为了保证系统正常工作 xff0
  • 使用OpenCV进行特征(颜色、形状)提取

    图像处理 图像处理所做的只是从图像中提取有用的信息 xff0c 从而减少数据量 xff0c 但保留描述图像特征的像素 下面从图像中提取颜色 形状和纹理特征的方法开始 1 颜色 每次处理图像项目时 xff0c 图像的色彩空间都会成为最先探索的
  • proxifier中文汉化版

    在日常工作中使用到一些网络不稳定的服务时 xff0c 经常会遇到一个很头疼的问题 xff0c 那就是非常慢 xff0c 很是令人抓狂 xff0c 所以小编将介绍一款非常好用的代理客户端proxifier 软件下载点击这里 xff0c 支持s
  • K8S-微服务调用及运行过程

    为什么分析微服务过程调用 在实际的项目中 xff0c 微服务之间涉及到业务代码的部分 xff0c 调用逻辑非常复杂 对于工程师而言 xff0c 熟悉组件之间的调用关系 方便之后的业务模块开发 以及集群部署与自动化编排过程中有非常大的帮助 x
  • freertos常用任务函数----freertos初学笔记

    vtasksuspend 任务挂起函数 xff0c 用户可以调用Vyasksuspend xff08 xff09 函数将任何状态的任务挂起 xff0c 被挂起的任务得不到cpu的使用权也不会参加调度 xff0c 他相对于调度器而言是不可见的
  • 作为一名实施,需要自己反编译、网络抓包、猜测数据库,干的全不像实施的活……

    一位朋友提到这样的一个问题 xff1a 做为一名现场实施人员 xff0c 面对某x系统 xff0c 一片空白 好不容易整明白点了 xff0c 又发现x系统与某xx系统有关系 xff0c 再深入一点 xff0c 还与某xxx系统相连 xff0
  • Kalibr安装 ubuntu18.04+ros melodic

    原来的版本需要opencv2 xff0c 所以出现很多错误 总结安装kalibr安装核心重点就是 xff1a 下载这个版本的kalibr包 xff0c https github com ori drs kalibr 遇到问题就看看是哪个模块
  • 学了4年C++后,我转向了Python

    C 43 43 已经学不动了 xff0c 现在换 Python 还来得及吗 xff1f 一位四年工作经验的 C 43 43 程序员亲述转型历程 xff0c 这不仅仅是语言上的转变 xff0c 而是代码思维甚至工作环境的转变 通常 xff0c