C++转Python这三年,我都经历了什么?
作者 | asya f,计算机视觉专家,编程语言铁粉。
译者 | 安翔,责编 | 沭七
转载自 CSDN(ID:CSDNnews)
很多人都说用 Python 编程十分简单,即便是 6 岁的小孩也可轻松学会。我自己最开始使用 Python 编程时也这样认为。那时我作为全职软件开发人员已有 4 年时间,主要在 Linux 平台上基于 QT 库进行 C++ 编程。但是,我最初使用 Python 时编写了很多糟糕的代码。
如今,我已经从 C++ 转到 Python 三年了,我觉得自己有必要总结一下这段时间取得的进展。回顾这段经历,不仅是我的主要编程语言发生了变化,此外,我的工作环境以及我对代码的思考方式也发生了变化。
在本文中,我将主要分享自己的经验,而不会详细描述 C++ 和 Python 之间的细节和差异,因为网上已经有了许多它们的对比文章。我希望这篇文章对于像我一样有着类似经历的人有所帮助。
C++ 像深潜,Python 像浮潜
使用 C++ 就像深浅一样,你可以潜入大海深处探索其神奇的奥秘和美丽,但这需要大量的学习和练习,但总的来说,你所覆盖的面积不会太大。
而Python 则更像浮潜,你只需把头伸进水里,就可以看到美丽的景色,但你无法继续深入。你只能继续在浅水区游动,可以轻而易举地游很远,覆盖很大的海面。从这个描述可以清楚地看出,每种语言都应该在正确的地点和时间使用。
深入 C++
C++ 非常严格,它会对你的错误进行严厉的惩罚。在你的编码过程中,几乎很难避免段错误。因此,使用 C++ 编程需要开发者深入了解计算机、编译器和编程语言。随着学习过程的深入,你可以看到很多美好的东西,比如编译过程和内存管理。
作为一名 C++ 程序员,我需要密切关注各种语法。我需要对内存的分配和释放了如指掌。程序的依赖性更少,因为我喜欢对自己所写代码内部发生的事情有所了解。如果使用太多其他人的库,可能会不太可靠,出错之后很麻烦,并且可能会破坏你的内存使用量。
我习惯使用 Vim 来编程,此外会搭配很多插件,比如用于调试的 GDB 和用于分析程序内存使用情况和错误的 Valgrind。我自己编写 Makefile 然后用 g++ 编译代码。
那时的自己并不觉得 IDE 益处很大,我宁可放慢速度也不会让自己失去对代码的掌控。现在回想起来,我确实非常依赖编译器来查找类型错误。
在 Python 中浅泳
从 C++ 切换到 Python 时,你需要学习的第一件事就是要学会放手:在 Python 中你很难知道程序的内部机制,不知道内存如何被分配和释放。你还会经常使用其他人编写的代码,这些代码将打包到库中,因为它们可以节省你的时间并帮助你更快地编写代码。这并不意味着你需要编写速度慢且依赖于未维护和非功能库的代码,但重点肯定是不同的。
当我开始用 Python 编写代码时,我首先按照 C++ 的思路来编程 Python 代码。这当然可行,但我并没有发挥出 Python 的优势。当我开始以更 “Pythonic” 的方式编程并开始使用库以及更高级的概念(比如生成器、装饰器和上下文)时,我的 Python 编程技能才得到显著的提升。
作为一名 Python 开发人员,我遇到问题时首先会看看有没有现成的库可以解决该问题。Python 拥有丰富的库生态系统及其社区。这些丰富和庞大的库几乎涵盖了所有领域。我经常使用的库有:用于数值计算的 NumPy、计算机视觉库 OpenCV、用来读取 JSON 文件的 JSON、用于科学计算的 SciPy以及 SQLite3 数据库。
我最常使用的 IDE 是带有 IdeaVim 插件的 PyCharm。这是一款功能非常强大的调试器,它比默认的 Python 调试器 pdb 更好用。我使用 pip 来安装我所需要的库。除非我真的需要,否则我不再监视我程序的内存使用情况。
一些实用的技巧
如果你是一名 C++ 开发人员,并且考虑开始使用 Python 编程,以下是我的一下小建议:
改掉旧习惯
不要把 C++ 编译器当调试器用。不要过度优化内存使用情况。避免编写类似 C++ 风格的代码。无论如何,尽量不要依赖类型。
培养新习惯
善用 Python 库。编写 Pythonic 代码(但不要过度)。保持可读性。使用更复杂的概念,比如生成器、装饰器、上下文。试试 PyCharm。
使用 C++ 和 Python 公共库
某些 C++ 库(如 OpenCV 和 QT)具有 Python 接口。很容易在 Python 中使用相同的库,而不是从头开始学习新的库。
根据应用场景选择恰当的编程语言
有时 Python 太慢或者不适合某类任务。此时就该 C++ 出马了。在 Python 中使用 C++ 代码的方法很多,有 SIP、ctypes 等方式。
总结
不管其他人怎么说,实际上,从一种语言切换到另一种编程语言并不容易,尤其是新的语言与你习惯使用的语言区别很大时。你需要花很多时间学习、深入、探索。但最重要的是,要明白不仅语言应该改变,而且你的编码风格和工作方法也要改变。
英文:How I went from C++ to Python: a conceptual change
链接:https://medium.freecodecamp.org/how-i-went-from-c-to-python-a-conceptual-change-8bf29d059428
(本文为 AI科技大本营转载文章,转载请微信联系原作者。)
征稿推荐阅读
用“AI”给吴秀波测面相,发现……
任正非:人工智能就是计算机和统计学
程序员一毕业就年薪 110 万竟然是靠……
程序员锁死服务器失踪,公司解散 600 万项目彻底黄了!
关于云原生,这是最详细的技术知识
一年省下1000亿? 原来零售玩的是闷声发大财
不难!月薪 50K大牛,悉心整理程序员必备技能!
用Python全自动下载漂亮小姐姐的抖音视频!
用Python做一款俄罗斯方块游戏
相关文章:

炎热夏天到底如何让自己更凉快? - 生活至上,美容至尚!
酷暑难耐,晚上睡觉都不能睡好,早上一起来就大汗淋漓,天气越来越热 火辣辣的太阳,让人食欲一落千丈。 如何让食物和调料成为闷热天气解暑良方呢? 根据中医对中药性能的四气五味理论,凡是寒性或凉性的中药,都…

华为又一重拳!全球首款5G基站核心芯片“天罡”发布!
作者 | 孙浩峰来源 | CSDN云计算(ID:CSDNcloud)1 月 24 日,华为在北京举办 5G 发布会暨 2019 世界移动大会预沟通会,发布了全球首款 5G 基站核心芯片——华为天罡,致力打造极简 5G,助推全球 5G 大规模快速部…

Qt中文手册 之 QTreeWidget
头文件:#include<QTreeWidget> 继承自:QTreeView 属性: 1、columnCount : int 树中有多少列,默认是1; intcolumnCount() constvoidsetColumnCount(int columns) 2、topLevelItemCount : constint 树中有多少顶层项,默认是0; 成员函数 1、QTreeWidget::QTreeW…

12. 17 哈理工网络赛
An Easy Geometry Problem Description Lily is interested in hyperspace recently, and she is trying to solve an easy problem now. Given an n-dimensional hyperspace, assuming each dimension is a1, a2, a3, ..., an. And for each i (1 ≤ i ≤ n), j (i < j ≤ …

微信确认出Bug,目前已全部恢复
1 月 24 日,微信官方发布声明称,今天上午,微信部分功能出现故障,微信用户登录、消息会话、公众号、小程序、外部链接、文件发送等功能均受到不同程度的影响,波及小部分用户。今日 10:30 左右,有网友表示&am…

《xUnit Test Patterns》学习笔记3 - Philosophy of Test Automation
这一章主要讲自动化测试的原则。前面的章节介绍了很多测试的思想,而思想的东西难免有点虚,这一章就是告诉你,遇到了具体的什么问题时,应该怎么办。作者咨询了很多的开发人员和测试人员,同时也和Martin Fowler就自动化测…

js new 运算符到底做了什么?
MDN上是这么介绍new运算符的:new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一。 这里,我们探究的是new运算符实际上做了什么? var a new A(); 复制代码当这段代码运行的时候,内部实际上执行的是&am…

Qt中文手册 之 QTableWidgetItem
头文件 #include<QTableWidgetItem> 成员函数 1、QTableWidgetItem::QTableWidgetItem(int type = Type) 使用指定item类型type构造。 item的type QTableWidgetItem::Type0默认的类型:窗口部件QTableWidgetItem::UserType1000The minimum value for custom types. Val…

你知道“啥是佩奇”,却不一定了解佩奇排名算法
作者 | 程序员小吴 从初学者的角度学习算法,以动画的形式呈现解题的思路。来源 | 五分钟学算法佩奇排名介绍佩奇排名是根据页面之间的链接结构计算页面的值的一种算法。下面我们通过动画来理解进行计算的具体流程。假设一个正方形表示一个 WEB 页面,一个…

用友发布U8 All-in-One引爆中小企业全面信息化
1月16日,北京经历了2010年第一场大雪和创50年的低温记录后,温度似有回升的感觉。什刹海一座别致建筑二楼的"用友中小企业全面信息化策略暨U8 All-in-One发布会"现场洋溢着融融暖意。用友在这里隆重发布了面向中小企业全面信息化的解决方案--U8…

Qt中文手册 之 QTreeWidgetItem
头文件:#include <QTreeWidgetItem> 成员函数 1、QTreeWidgetItem::QTreeWidgetItem(int type = Type) 使用类型type构造项,默认类型窗口类型 2、QTreeWidgetItem::QTreeWidgetItem(const QStringList & strings, int type = Type) 使用字符串列表strings作为项…

6位技术大咖11月倾心巨献,大数据+安全主题的技术分享合集【阿里云MVP 干货集锦】...
为什么80%的码农都做不了架构师?>>> 摘要: 大家好,阿里云 MVP 11月大数据安全主题分享新鲜出炉,快来一睹为快吧!哪些MVP的分享最吸引你,你最想支持哪个MVP? 我们将开启为期一周的最…

linux下jsp环境的搭建
转自http://gehailong.blog.51cto.com/765312/264162作gehailong一 、安装JDK#chmod x jdk-6u13-linux-i586-rpm.bin//给文件加入执行权限#./jdk-6u13-linux-i586-rpm.bin//生成安装文件,运行完此命令后会生成一个jdk-6u13-linux-i586.rpm#rpm -ivh jdk-6u13-linux-i586.rpm//安…

ABP理论学习之通知系统
本篇目录 介绍订阅通知发布通知用户通知管理者实时通知通知存储通知定义介绍 通知(Notification)用于告知用户系统中的特定事件。ABP提供了基于实时通知基础设施的发布订阅模型(pub/sub)。 发送模型 给用户发送通知有两种方式&am…

linux驱动:TI+DM8127+GPIO(一)之应用——报警输入输出
一、【GPIO应用】 报警输出1 ALRM_OUT1A、ALRM_OUT1B <-- ALM_OUT1 <-- CVOUT1_YC4 <-- W22 <--VOUT[1]_G_Y_YC[4]/EMAC[1]_MRXD[7]/VIN[1]A_D[9]/PATA_D[1]/GP3[8] /sys/class/gpio/gpio104/value 其中104 32*38 GPIOn_x的编号为32*nx,例如此处用…

Facebook增强版LASER开源:零样本迁移学习,支持93种语言
来源| Facebook AI 研究院译者 | Linstancy责编 | 琥珀出品 | AI 科技大本营(ID:rgznai100)【导语】为了加速自然语言处理 (NLP) 在更多语言上实现零样本迁移学习 (zero-shot transfer learning),Facebook 研究者扩展并增强了 LASER (Languag…

Python文本预处理:步骤、使用工具及示例
作者 | Data Monster译者 | Linstancy编辑 | 一一出品 | AI科技大本营(ID:rgznai100)本文将讨论文本预处理的基本步骤,旨在将文本信息从人类语言转换为机器可读格式以便用于后续处理。此外,本文还将进一步讨论文本预处理过程所需要…

读《杜拉拉升职记》有感
读杜拉拉升职记有感1.一定要在核心部门任职,防止被边缘化2.劳心者治人,劳力者治于人干了活还受气怎么办?1.把每一个阶段的主要任务和安排的都做成清晰简明的表格,发给我的老板,告诉他如果有反对意见,在某某…

linux驱动:TI+DM8127+GPIO(二)之驱动
二、【GPIO驱动框架》驱动driver】 重要结构体 gpio_chip:管理一组GPIO gpio_desc:描述每个GPIO gpio_bank:封装了gpio_chip加入GPIO控制的属性 1、驱动注册到platform中 Arch/arm/plat-omap/gpio.c中 static int __init omap_gpio_drv…

菜鸟的DUBBO进击之路(八):配置抽离导致${jdbc.url}被当成字符串处理
为什么80%的码农都做不了架构师?>>> 导致这个问题的原因有很多,基于我查到的资料做个记录 第一:xmlns:context"http://www.springframework.org/schema/context" xsi:schemaLocation"http://www.springframework.org/schema/…

用VS2005打开方案出现“此安装不支持该项目类型”
当在用VS2005打开已有项目时常会出现“此安装不支持该项目类型”。 出现此原因是因为已有项目是在打了VS 2005 SP1补丁后编写的,所以在没有打补丁的.net中会出现此种情况 下面就补丁下载:VS80sp1-KB926604-X86-CHS.exeWebApplicationProjectSetup.msi

linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源
三、【GPIO驱动框架》向omap_hwmod中添加GPIO资源】 ***将GPIO硬件信息添加到注册到omap_hwmod_list列表中 Arch/arm/plat-omap/include/plat/ti81xx.h中 #define TI814X_GPIO3_BASE 0x481AE000 Arch/arm/plat-omap/gpio.c中 输入输出控制寄存器偏移地址 #define OMAP4…

用Redis存储Tomcat集群的Session(转载)
本文转自http://blog.csdn.net/chszs/article/details/42610365 感谢作者 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机、对使用用户零影响。 我的设想是使用集群来搞定,通…

微信的Bug差点让我被老板炒鱿鱼!
作者 | 屠敏转载自CSDN(ID:CSDNnews)1 月 24 日上午 10:30 左右,10 亿用户量的国民应用微信疑似出现大 Bug。据网友反馈,自己一直使用的微信号突然显示被删除,登也登不上。对此,不少人的银行卡一…

vPower系列1: vMotion-没有vMotion,虚拟化只是玩具
vPower今天开讲,第一篇vMotion。vMotion是虚拟化可以支撑核心应用的重要前提,没有vMotion,虚拟化只是玩具,只能应用在实验环境和开发环境。为什么这么说呢?为什么会有vMotion?vMotion解决了虚拟平台上的什么…

linux驱动:TI+DM8127+GPIO(四)之设备
四、【GPIO驱动框架》设备device】 arch/arm/mach-omap2/gpio.c中 1、static int __init omap2_gpio_init(void) { returnomap_hwmod_for_each_by_class("gpio", omap2_gpio_dev_init, NULL); } archarm/mach-omap2/omap_hwmod.c 中 2、int omap_hwmod_for_each…

简单的TableViewCell高度自适应(只有Label,仅当参考思路)
在iOS开发中或多或少的都会碰到TableViewCell高度自适应,那么今天这篇文章就简单的介绍一下如何给tableViewCell自适应高度 #ViewController copy interface ViewController ()<UITableViewDelegate, UITableViewDataSource>{UITableView *_tableView; }property (nonato…

Google发布新的问答语料库,专攻篇章级的NLU问题
译者 | Linstancy整理 | Jane出品 | AI科技大本营(ID:rgznai100)开放域的问答(QA)是自然语言理解(NLU)中的一项基本任务,旨在模拟人是如何通过阅读和理解完整的文档,从而寻找信息、发…

AjaxControltoolkit(工具包)安装步骤说明
本来打算做一个系统搜索中Ajax AutoComplete自动提示的效果,想尝试一下以前用AjaxControlToolkit中控件,在官网上下载一个AjaxControlToolkit2.0版本我尽然忘了如何安装.很是汗了一把. 看来人都是有惰性的,哪怕自己认为以前比较熟练自信的东西 如果时间一长不做回顾还是不行的 …

linux驱动:TI+DM8127+GPIO(五)之plarform
五、【GPIO驱动框架》平台platform】 (一)设备找驱动 1、drivers/base/platform.c中 int platform_device_register(structplatform_device *pdev) { device_initialize(&pdev->dev); returnplatform_device_add(pdev); } 2、int platform_…