博采 27 门语言之长,提升 Python 的能力

3天干完6个月的活,Claude把模型搬上AMD 一条挺刺激的消息:Anthropic 给投资人的材料里有一张幻灯片,写着它的 Claude Mythos Preview 只花了大约​,就摸清了怎么让另一个 Claude 模型在 AMD 的 MI355X 上跑起来。同一处还写了个对照数字:过去给一块新芯片做推理适配,通常要几十名工程师、​。3 天对 6 个月,这个比值太扎眼,当天中文互联网上就冒出一堆「英伟达的护城河塌了」的说法。我把能翻到的材料都翻了一遍,越看越觉得,塌掉的那一小块是真的,可塌的位置和很多人想的不一样。 阅读详情

80c73e8e63432dedb6324d85a6fa93c7.png

作者:Nick Coghlan

译者:豌豆花下猫@Python猫

英文:https://www.curiousefficiency.org/posts/2015/10/languages-to-improve-your-python.html

声明:本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。

目录

  • 拓宽我们的视野

  • 过程式编程:C、Rust、Cython

  • 面向对象的数据模型:Java、C#、Eiffel

  • 面向对象的 C 派生:C++、D

  • 面向数组的数据处理:MATLAB/Octave、Julia

  • 统计数据分析:R

  • 计算管道建模:Haskell、Scala、Clojure、F#

  • 事件驱动编程:JavaScript、Go、Erlang、Elixir

  • 渐变类型:TypeScript

  • 动态元编程:Hy、Ruby

  • 务实问题解决:Lua、PHP、Perl

  • 编程思维:Scratch、Logo

作为世界上最流行的编程语言之一的共同设计者,我经常看到一个令人沮丧的行为(在 Python 社区和其它社区):有影响力者试图激发人们对“败给”其它开源社区的恐惧,从而调动人们对社区作贡献的积极性。(我自己偶尔也会犯这种错误,这让我更容易发现其他人是否也落入了同样的陷阱)。

虽然学习其它编程语言社区的经验是件好事,但基于恐惧的方法来激励行动是有严重问题的,因为这会刺激本社区成员将其它社区的人视为争夺开源贡献者关注的敌人,而不是作为在更大挑战中的潜在盟友(推动软件开发艺术发展)。这还会告诉那些喜欢其它语言的人,在一个把他们以及他们的同伴视为“敌对竞争对手”的社区里,他们是不受欢迎的。

事实上,我们希望有多种多样的跨平台的开源编程语言供选择,因为编程语言是思考的首要工具——使我们能够以明确的方式表达我们的想法,从而让计算机也能够理解。如果有人找到了一种适合大脑的语言,能够解决眼前的问题,那就太好了,不管他们选择的是哪种(些)语言。

因此,我对 Python 社区有三个具体的请求,以及一个较为宽泛的建议。首先,我的请求是:

  1. 如果我们要利用社区的本能来激励行动,就应该避免利用恐惧感,而应该利用自豪感。 当我们将恐惧作为激励因素时,就像在说“如果我们不做 X,就会失去开发者对 Python 的关注”,这等于是故意地在自由的开源贡献者中创造悲观的情绪。然而,依赖社区的自豪感就像在说“目前尚不清楚如何在 Python 中解决 X 问题。如果我们看看 Y 语言,就可以看到他们有一个非常好的方法来解决问题 X,我们可以吸收进 Python,以提供类似的舒适的用户体验。”积极的态度让我们对自己的努力感到自豪,而不是贬低他人的努力,这有助于在 Python 社区内促成一种持续学习的文化,并促进与其它社区改善协作关系,共同发展。

  2. 克制对其它开源编程语言社区采取轻蔑的态度,尤其当这些社区授权人们解决自己的问题,而不是等待商业软件供应商来解决问题。 世界上大多数重要的问题解决起来都是无利可图的(因为受苦于这些问题的人并不富裕,而且无法左右机构基金的决定),所以我们应该鼓励试图解决这些问题的人,不管我们如何看待他们的技术选择。

  3. 如果我们认识的人刚开始学习编程,并且他们选了一种我们不喜欢的语言,我们应该支持他们的选择。 他们比我们更知道什么适合自己,适合我们的语言不一定适合他们。如果他们对自己最初的选择感到了沮丧,甚至已经对学习编程变得没有动力,此时再给他们推荐别的编程语言。这个建议还适用于那些在改善糟糕的网络安全状况的人:我们在面对天生不安全的语言时,采取的方法是改进操作系统的沙箱功能,逐步学习有更好的本地安全属性的语言,并改善现有语言的默认行为,而不是列举为什么从程序安全性的角度来看,他们选择的语言是一个糟糕的选择,来迷惑初学者。(如果有人部署了由初学者编写的未经审核的软件来处理安全敏感的任务,那就不是开发者的问题,而且部署者的问题,他们没有对软件的出处和安全属性进行适当的尽职调查。)

我的宽泛的建议针对那些遇到了 Python 核心程序的限制,并因此希望探索 Python 中可用的“思考工具”的人。这个建议就是:

拓宽我们的视野

在开发 Python 核心程序的过程中,我们会做的一件事是查看其它语言中解决了我们正面临的问题的特性,看看是否有办法既吸收它们,又使 Python 代码更易于阅读和编写。这意味着学习其它专注于特定软件开发风格的编程语言,可以帮助我们在使用 Python 时,提高对这种编程风格的理解。

为了提供帮助,我在下面列出了一些值得探索的领域,以及可能加深对这些领域的理解的语言。我尽可能链接了维基百科的页面,而不是直接链接到语言的主页,因为维基百科经常会提供有趣的历史背景,当你为了教育目的学习一门新的编程语言,而不是直接用于实际应用时,这些背景值得去了解。

虽然我知道这些语言中的大部分(并且在开发生产系统时使用过几种),但这份推荐清单中还包括我间接知道的语言(通常是通过阅读教程和设计文档,或者通过与我信任的人交谈,以获取对一门语言的优点与缺陷的洞察)。

还有很多本应该放但没有放进名单里的语言语言,所以下面罗列的仅是我感兴趣的部分(例如,我主要感兴趣的是 Linux、Android 和 Windows 的生态系统,所以我舍弃了 Apple 生态中的 Objective-C 和 Swift 语言,另外我也不熟悉 Processing 这种专注于艺术的编程语言,无法想象学习它们能教给 Python 开发者什么)。

除了考虑一门语言可能教给你的东西,如果你想获得一份更全面的清单,可以去查看 IEEE Spectrum 关于编程语言流行度和增长度的年度榜单。

过程式编程:C、Rust、Cython

Python 默认的执行模型是过程式的:从主模块的顶部开始,逐条语句地执行。Python 对下面介绍的所有数据和编程建模方法的支持,都建立在这种过程式的执行模型上。

C 语言仍然是无可争议的底层过程式编程的统治者。它是 Python 官方解释器以及 Linux 操作系统内核的核心实现语言。作为一名软件开发人员,学习 C 语言是更多地了解底层硬件的最好方法之一——C 语言经常被称为“可移植的汇编语言”,对于任何新的 CPU 架构来说,第一个交叉编译的应用程序将是 C 编译器。

Rust 是一种相对较新的编程语言,由 Mozilla 创造。Rust 的目标是吸取整个行业在不使用 C 时遇到的所有教训,设计一门能与 C 库相互操作的新语言,提供底层的系统编程所需的对硬件用途的精确控制,但使用不同的编译方法来进行数据建模和内存管理,从结构上消除许多困扰 C 程序的常见缺陷(如缓冲区溢出、指针重复释放错误、空指针访问和线程同步问题)。经过培训和早期的专业经验,我是一名嵌入式系统工程师,而 Rust 是我见过的第一种看起来有潜力缩减当前由 C 语言和自定义汇编代码所主导的生态位的新语言。

Cython 也是一种较底层的过程式语言,但与 C 和 Rust 等通用语言不同,Cython 专门用于编写 CPython 的扩展模块。为了实现这一目标,Cython 被设计为 Python 的超集,允许程序员选择何时支持纯 Python 语法以获得灵活性,何时支持 Cython 的语法扩展,以便生成在速度和内存效率方面能与原生 C 代码相当的代码。

学习这些语言,你可以加深在内存管理、算法效率、二进制接口(ABI)兼容性、软件可移植性、以及将源代码转换为运行系统等实践方面的见解。

面向对象的数据模型:Java、C#、Eiffel

编程最主要做的事情之一是为现实世界建模,最流行的做法是提供原生的语法支持面向对象编程:对数据作结构化的分组,使用类方法操作那些数据结构。

Python 本身是经过精心设计的,无需先编写自己的类就可以使用面向对象的特性。并不是每种语言都采用这种方法——本小节中列出的语言都认为学习面向对象设计是使用该语言的必要条件。

在 20 世纪 90 年代中后期,Sun Microsystems 公司进行了一次大规模的市场推广,Java 成为了许多高等院校中计算机科学入门课的默认语言。虽然如今在许多教学活动中,Java 已经被 Python 所取代,但它仍然是开发商用程序时最流行的语言之一。还有一些基于通用 JVM(Java 虚拟机)运行时的语言,例如 Python 的 Jython 实现。Android 系统的 Dalvik 和 ART 环境则是基于 Java 开放的 API 二次开发。

C# 在许多方面与 Java 相似,在 Sun 和微软未能解决他们关于微软的 Java 实现(即 J++)的业务差异之后,C# 成为了一种替代方案。像 Java 一样,这是一门开发商用程序的流行语言,还有其它一些语言共享着 .NET CLR(公共语言运行时),包括 Python 的 IronPython 实现 (最早的 IronPython 1.0 的核心组件被提取成了与语言无关的 .NET 动态语言运行库)。在很长一段时间里,. NET 是一种专用于 Windows 的技术,而 mono 作为一种跨平台的开源实现,但微软在 2015 年初转向了开源生态系统战略。

与此清单中的大多数语言不同,我不推荐在日常工作中使用 Eiffel。但是,我依然推荐学习它,因为它教会了我许多关于良好的面向对象设计的知识,比如它认为“可验证的正确性”是应用程序的设计目标。(学习 Eiffel 也让我明白了为什么“可验证的正确性”并不是大多数软件开发时的设计目标,因为可验证的正确软件实在不能很好地处理模糊性,并且完全不适用于那些你不清晰相关的约束条件却需要给自己留下足够的回旋余地,以便能够通过迭代开发找出更具体的细节的情况。)

学习这些语言,你可以深入了解继承模型、契约式设计、类不变性(class invariant)、前置条件、后置条件、协方差、逆变、类方法解析顺序、泛型编程以及其它适用于 Python 类型系统的概念。还有很多标准库模块和第三方框架使用这种“看得见的面向对象”的设计风格,比如 unittest 和 logging 模块,以及 Django 框架中基于类的视图。

面向对象的 C 派生:C++、D

CPython 运行环境可以被视为一个“带有对象的 C”的编程环境——在其核心,CPython 使用 C 的方法实现面向对象编程,即定义 C 结构体来保存相关的数据,并将结构体的实例作为第一个参数传递给函数,然后对数据进行操作(这就是 CPython C API 中全能的 PyObject * 指针)。这种设计模式对应到 Python 层面,就是实例方法的显式 self 参数以及类方法的显式 cls 参数。

C++ 的目标是保持与 C 语言源代码的完全兼容,同时添加更高级的特性,例如支持原生的面向对象编程和基于模板的元编程。它是出了名的冗长和难以编程(尽管 2011 年对语言标准的更新解决了许多糟糕的问题),但它也是许多领域的编程首选,包括 3D 建模的图形化引擎和跨平台应用的开发框架(例如 Qt)。

D 语言也很有趣,因为它与 C++ 的关系类似于 Rust 与 C 的关系:它的目标是保留 C++ 的大多数令人满意的特性,同时也避免它的许多问题(如缺乏内存安全)。不像 Rust,D 不是一种从头开始设计的新编程语言——恰恰相反,D 是 C++ 的衍生物,虽然它不像 C++ 一样是一个严格的 C 超集,但它遵循着一个设计原则,即任何落入 C 和 D 的共同子集的代码,在两种语言中必须要表现一致。

学习这些语言,你可以更深入地了解将高级语言的特性与底层 C 运行时模型相结合的复杂性。学习 C++,在 Python 中操作用 C++ 编写的库和工具包时,也可能会有帮助。

面向数组的数据处理:MATLAB/Octave、Julia

面向数组的编程是为了支持数值编程模型:那些基于矩阵代数和相关数值方法的模型。

虽然 Python 的标准库不直接支持这一点,但 Python 在设计时考虑了面向数组的编程,并专门为第三方 NumPy 库和类似的面向数组的工具添加了一系列语法和语义特性。

在许多方面,Python 的科学技术栈 被作为商业 MATLAB 的替代方案,后者被广泛用于科学和工程领域的建模、仿真和数据分析。GNU Octave 是一个开源的方案,目标是兼容 MATLAB 代码的语法,允许人们对照这两种面向数组的编程方法。

Julia 是另一种相对较新的语言,重点关注面向数组的编程和基于类型的函数重载。

学习这些语言,你可以了解 Python 的科学技术栈,以及有机会通过像 OpenCL 和 Nvidia 的 CUDA 这种技术来探索硬件层面的并行执行,并通过 Apache Spark 和专用于 Python 的 Blaze 来了解分布式数据处理。

统计数据分析:R

随着对大型数据集的接触越来越多,对灵活处理这些数据集的分析工具的需求也越来越大。R 编程语言就是这样的工具,它特别关注统计性的数据分析和可视化。

学习 R 能会让你深入了解 Python 在科学技术栈的统计分析能力,尤其是 pandas 数据处理库和 seaborn 统计可视化库。

计算管道建模:Haskell、Scala、Clojure、F#

面向对象的数据建模和面向数组的数据处理主要关注静态的数据,无论是以命名的属性形成集合的形式,还是以结构化数据形成数组的形式。

相比之下,函数式编程语言强调以计算流的形式对动态数据进行建模。即便只学习函数式编程的基本知识,也能极大地改进数据转换操作的结构,即使在其它过程式、面向对象或面向数组的程序中也是如此。

Haskell 是一种函数式编程语言,对 Python 的设计产生了重大影响,最显著的是在 Python 2.0 中引入的列表推导式。

Scala 是一种(存疑的)JVM 函数式编程语言,加上 Java、Python 和 R,它们是 Apache Spark 数据分析平台的四种主要编程语言。尽管 Scala 的设计偏重于函数式编程,但它的语法、数据模型和执行模型的设计也最大限度地降低 Java 程序员使用的门槛(因此所谓“存疑的”——其实是因为,Scala 最好被归类为一门具有强函数式编程支持的面向对象编程语言)。

Clojure 是另一种基于 JVM 的函数式编程语言,是 Lisp 的一种方言。它之所以出现在这份清单里,因为它是 Python 的 toolz 函数式编程工具包的灵感来源。

F# 不是我自己特别熟悉的语言,但它作为 .net CLR(公共语言运行时)推荐的函数式编程语言,所以还是值得关注。

学习这些语言,你可以深入了解 Python 自己的计算管道建模工具,包括容器推导式、生成器、生成器表达式、functools 和 itertools 标准库,以及第三方的 Python 函数工具包,比如 toolz。

事件驱动编程:JavaScript、Go、Erlang、Elixir

计算管道是处理数据转换和分析问题的一种极佳的方法,但许多问题需要程序作为持久性服务运行,等待事件发生,然后处理那些事件。在这类服务中,为了能够同时容纳多个用户(或多个操作),通常必须要并发地处理多个事件。

JavaScript 最初是作为 Web 浏览器的事件处理语言而开发的,允许网站开发者在本地响应客户端操作(如鼠标点击和按键敲击)和事件(如网页完成了渲染)。所有现代浏览器都支持它,它与 HTML5 领域对象模型(DOM)一起,已经成为一种定义用户界面外观和行为的事实上的标准。

Go 是谷歌设计的一种用于创建高度可伸缩的 Web 服务的专用语言,并且已经被证明是一种非常适合开发命令行应用程序的语言。从编程语言设计的角度来看,Go 最有趣的方面是在其核心并发模型中使用了通信顺序进程(Communicating Sequential Processes)概念。

Erlang 是由爱立信设计的专用语言,用于创建高度可靠的电话交换机以及类似的设备。它被用于开发出了流行的 RabbitMQ 消息代理中间件。Erlang 使用 Actor 模型作为核心的并发原语,在执行线程之间传递消息,而不是让它们直接共享数据。虽然我从未用过 Erlang 编程,但我的第一份全职工作涉及一个基于 Actor 的 C++ 并发框架,而该框架由一名前爱立信工程师开发,另外,我自己也开发了一个这样的框架,基于德州仪器(Texas Instrument)的轻量级 DSP/BIOS 运行时(现在的 TI-RTOS)里面的 TSK (Task)和 MBX (Mailbox)原语。

Elixir 出现在这份清单里,因为它被设计运行在 Erlang VM 上,提供了与 Erlang 相同的并发语义,同时还提供了一系列在语言层面上的特性,打造出一个更加全面的环境,更有可能吸引其它语言例如 Python、Java 或 Ruby 的开发者。

学习这些语言,你可以深入了解 Python 对并发和并行的支持,包括原生协程、基于生成器的协程、concurrent.futures 和 asyncio 标准库模块、第三方网络服务开发框架(如 twisted 和 Tornado)、Django 中引入的 channel 概念、GUI 框架中的事件处理循环。

渐变类型:TypeScript

在 Python 3.5 中出现的一个比较有争议的特性是新引入的 typing 模块,它为 Python 生态带来了一个支持渐变类型的标准词典。

Python猫注:Gradual typing 是 Jeremy Siek 和 Walid Taha 在 2006 年提出的理论,允许程序中同时出现动态类型与静态类型。国内有人将其翻译为“渐进类型”、“渐近类型”、“渐进定型”、“动静混合类型”等等,但我觉得并不够好。渐变类型也许是我的首创,借鉴自 Photoshop 的渐变颜色,表达出从动态类型到静态类型的过渡(或者说交融共处的)特点。“渐变”一词有打破界限分明的状态(如大小、远近、明暗),从而达到中和状态的含义。

对于那些主要从 C、C++ 和 Java 等语言中接触静态类型的人来说,这似乎是一个令人吃惊的糟糕特性(因此引发了争议)。

微软的 TypeScript 为 Javascript 程序提供了渐变类型,因此它能更好地解释这个概念。TypeScript 代码会被编译成 JavaScript 代码(然后就不包含运行时类型检查),流行的 JavaScript 库的 TypeScript 注解会维护在专用的 DefinitelyTyped 仓中。

正如 Chris Neugebauer 在澳大利亚 PyCon 演讲 中指出的,这很像是 Python 与 typeshed 类型提示库、以及像 mypy 这种类型推断和分析工具之间的关系。

在本质上,TypeScript 和 Python 中的类型提示都是编写特定种类的测试的方式,要么使用单独的文件(就像普通测试一样),要么嵌入在代码体中(就像静态类型语言中的类型声明一样)。对于这两种情况,你都要运行一个单独的命令,来检查其余代码是否与已添加的类型断言一致(对于 TypeScript,这是在编译成 JavaScript 时隐式地发生的;对于 Python 的类型提示,这是一个完全可选的静态分析任务)。

动态元编程:Hy、Ruby

C、C++、C# 和 Java 等语言的学习者在接触 Python 时,经常感到不安的一个特性是“代码即数据”(code is data):函数和类之类的东西是运行时对象,可以像其它对象一样被操纵。

Hy 是一种 Lisp 方言,可以同时在 CPython VM 和 PyPy VM 上运行。Lisp 及其方言将“代码即数据”的概念推到了极致,因为 Lisp 代码由嵌套列表组成,这些列表描述了要执行的操作(这门语言的名称本身就代表列表处理器“LISt Processor”)。Lisp 风格语言的强大之处在于,它让你非常容易编写出自己的领域特定代码。Lisp 风格语言的最大缺点是,它让你非常容易编写出自己的领域特定代码,但这可能导致每个人写的代码变得难以阅读。

Ruby 语言在许多方面与 Python 相似,但对于 Python 中“支持但不鼓励”的动态元编程特性,Ruby 社区则相对开放。这包括在已有类定义中添加新的方法,以及使用闭包来实现语言的核心结构,例如迭代。

学习这些语言,可以让你深入了解 Python 自己的动态元编程特性,包括函数和类装饰器、猴子补丁、unittest.mock 标准库、以及像 wrapt 这样的第三方对象代理模块。(我不知道学习哪种语言可以深入了解 Python 的元类系统,如果有人在这方面有任何建议,请在评论中告知我。Python 的元类驱动着很多特性,例如核心的类型系统、抽象基类、枚举类型和渐变类型表达式的运行时求值。)

务实问题解决:Lua、PHP、Perl

主流的编程语言并不是孤立存在的——它们作为一个更大的生态系统的一部分而存在,这个生态系统由发行者(企业和社区组织)、终端用户、框架开发者、工具开发者、教育工作者等等组成。

Lua 是一种流行的编程语言,作为一种脚本引擎嵌入到大型程序中。标志性的例子是它被魔兽世界游戏用来编写客户端插件,它也被嵌入到了许多 Linux 发行版所使用的 RPM 组件中。与 CPython 相比,Lua 运行时的大小通常只有 CPython 的十分之一,而且由于较弱的自省能力,它更容易与程序的其它部分以及服务器的操作系统隔离开来。Lua 社区对 Python 生态的一个显著贡献是 LuaJIT FFI(Foreign Function Interface 外来函数接口),它被 CPython 和 PyPy 采用,作为支持 JIT 的 cffi 接口库的基础。

PHP 是另一种流行的编程语言,作为 Linux-Apache-MySQL-PHP LAMP 技术栈中的“P”而崛起,因为它专注于生成 HTML 页面,并且在早期的虚拟专用服务器(Virtual Private Server,简称 VPS) 提供商中广泛使用。尽管其设计上有诸多的概念性缺陷让人感到绝望,但它如今是几个极其流行的开源 Web 服务的基础,包括 Drupal 内容管理系统、Wordpress 博客引擎和维基百科的 MediaWiki 引擎。PHP 还支撑着一些重要的服务,比如 Ushahidi 平台,它是一个开源的社会化新闻发布社区。

像 PHP 一样,Perl 也是基于 Linux 而崛起。但跟 PHP 专门作为 Web 开发平台不同,Perl 是系统管理员的工具,在基于文本的 Linux 操作系统中,它使用正则表达式将命令的输出转成字符串,并进行操作。当 sh、awk 和 sed 都无法胜任某些任务时,Perl 出现并派上了用场。

学习这些语言,在编程语言设计方面,不大可能获得什么漂亮审美或者优雅概念。学习它们,最可能的是了解编程语言在现实中是如何被分发和采用的,以及这些在多大程度上取决于偶然的机会、历史意外事件、以及发行商在系统中默认集成而降低了使用门槛,而不是取决于语言本身固有的能力。

特别是,它可以提供对以下项目的重要性的洞察:CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、树莓派基金会和 Python 被大量商业组织采用,以保护它们在 Python 生态中不断的投入。

编程思维:Scratch、Logo

我经常跟函数式编程以及面向对象编程的拥护者们讨论,他们声称这类语言就像过程式语言一样易于学习。

如果我们谈论的是通过嵌入式编程(例如机器人)进行教学,在软件中建模的对象都有现实世界的对应物,比如学生们可以触摸的传感器、马达和继电器,那么,那我会认为 OOP 的人有一定的道理。

但是对于其他人,我现在有一个标准的挑战:拿起一本烹饪书,把其中一个食谱翻译成你认为是容易学习的编程语言,然后找一个能理解烹饪书中语言的学生,让其按照翻译好的食谱操作。其实,他们不需要真正地操作下去——只需做一个思想实验,就足以意识到他们声称的“很容易学”是假设了多少先验知识。(我很期待看到学术研究人员在现实中做这种研究——我真的很希望看到结果)

另一种解决这个问题的方法是去学习那些实际上被用来教孩子们编程思维的语言。

其中最受欢迎的是 Scratch,它使用了拖放编程界面,让学生们操纵一个独立的图形环境,它里面的电子图形可以移动,并响应环境中的事件。像 Scratch 这样的图形环境就相当于我们用来教孩子阅读和书写的图画书。

使用特殊的教育语言来操作图形环境的想法并不新鲜,最早的例子之一是 1960 年代发明的 Logo 环境。在 Logo 中(以及类似的环境,如 Python 的 turtle 模块),你主要打交道的是一个“乌龟(turtle)”,你可以通过绘制线条来指导它移动和修改环境。这样的话,命令序列、重复和状态(例如,“起笔”、“落笔”)可以基于人们的自然直觉来使用(“想象你是那只乌龟,如果你右转 90 度会发生什么?”)

回顾并重新学习这些语言,有助于有经验的程序员放下固化的观念:它们所用的概念可以提醒我们,这些概念是我们如今认为理所当然的,但初学者们需要先学习。当这样做的时候,我们能够更好地与学生和其他初学者们相处,因为我们更有可能打开逻辑的枷锁,也不会再忽略那些有必要的学习步骤。


 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看200个Python案例!

语言随机效应模型_线性混合效应模型 VS 方差分析 线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr... 阅读详情

相关推荐

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 249

怎样在input里加入搜索_手把手教你使用Python打造一款简易搜索引擎

点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤一去紫台连朔漠,独留青冢向黄昏。/1 前言/相信大家在知识共享的这个年代一定在网上下载了很多的文件保存以供日后有时间学习吧,毕竟硬盘空间也比较有限,下面我们就来说说我们要做的这个项目,就是搜索盘搜里的资源然后进行下载。/2 项目目标/ 实现搜索自己想要的文件,...

weixin_39553757的博客 341

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1743

python实现推广小项目

flask实现自动平均分配二维码,推广 后端 from flask import Flask,render_template import queue app = Flask(__name__) Q = queue.Queue() Q.put(0) @app.route('/') def tiao(): i = Q.get() p = i print(i,'=====...

weixin_44119390的博客 1153

基于STM32+ESP8266+手机 APP+阿里云的智能小车设计与实现(项目资料ID:4)

本研究旨在设计一款高度智能化的智能小车系统,通过集成 STM32 微控制器、ESP8266 无线模块、手机 APP 以及阿里云平台,实现环境数据实时采集、远程精准控制和高效的数据交互。详细阐述系统各部分的设计原理、实现过程和测试结果,验证系统在实际应用中的可行性和有效性,为智能小车在多领域的应用提供技术支持。

以培养嵌入式工程师为己任 1万+

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

python模拟登录淘宝直通车_淘宝直通车推广计划

1.推广计划的命名公式推广目的低价引流高投产带动搜索终端推广方式建议: 产品名称、型号+时间+其他如:蓝牙耳机A12-0107-主推或 蓝牙耳机A12-0107-低价引流-无线主推2.计划的权重一个宝贝不再推广,应该从计划中删掉 (不受历史权重影响)新推广的宝贝最好放在一个新的计划或者14天未推广的计划里(不受历史权重影响)如果一个计划开的不好,可以换一个试试3.计划的设置1.日限额如何确定日限额...

weixin_39859061的博客 446

AIGC游戏测试自动化:AI如何提升游戏QA效率

随着游戏产业的蓬勃发展,游戏的复杂度和规模不断增加,传统的游戏测试方式面临着巨大的挑战。本文章的目的在于深入探讨AIGC技术在游戏测试自动化中的应用,分析AI如何提升游戏QA的效率。范围涵盖了从核心概念到实际应用的各个方面,包括算法原理、数学模型、项目实战案例以及未来发展趋势等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确AIGC和游戏测试自动化的相关概念和关系;接着讲解核心算法原理和具体操作步骤,通过Python代码进行详细说明;然后介绍数学模型和公式,并举例说明;

AI 原生应用开发的博客 1357

文案生成 python_用 Python 开发一个【视频营销号】生成器

原标题:用 Python 开发一个【视频营销号】生成器之前小帅b在网上看到一个营销号文案生成器,把我给乐的: 其实这个用 Python 实现非常简单,根据用户输入的内容,简单替换一下关键字就可以了,我随手写了一下生成方法: 调用一波: 是不是老小编了?但是这样还不够好玩,我们直接用 Python 整成一个彻底的营销号视频,把生成的营销文案转为语音,通过主体关键词去网上扒一些相关的图片,再把它们合成...

weixin_39589766的博客 506

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1474

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

Python猫 2021 文章小结,翻译竟比原创多!

△点击上方“Python猫”关注 ,回复“1”领取电子书最近给自己放了两周的“长假”,刷视频、看小说、玩游戏,就是不写文章不更新公众号。半途而废的事情令得 2021 年的时间流逝加快,最后...

Python猫 689

uniapp:实现扫描二维码+自定义扫描框+扫一扫功能,支持扫码识别二维码、条形码(条码)、微信/支付宝等二维码功能,自定义扫码页面可添加按钮或文字展示布局(移动端H5网页/小程序/安卓苹果APP端)

UNI-APP实现扫描二维码,uniapp扫描条形码,uniapp实现扫一扫功能,扫码成功后跳转页面,uniApp扫描条码,uniApp-H5 使用摄像头扫码功能(扫一扫),实现手机扫描二维码并跳转全过程示例代码,用户扫码后自动跳转到链接,uniapp怎么调用扫一扫功能,uniapp实现扫一扫功能,uniapp请求相机使用权限,扫一扫权限申请,uniapp调用摄像头扫码,uniapp实现调用相机扫码,UniApp 实现扫描二维码,uniapp APP安卓苹果ios实现扫码扫一扫,Uniapp微信小程序扫描二

✅ 精选推荐文章 4708

从提示词工程到智能体运行框架:构建可靠LLM应用的核心架构

大语言模型(LLM)的应用开发正从简单的提示词工程向复杂的智能体系统演进。提示词工程通过精心设计的指令引导模型完成特定任务,但本质上是单次、无状态的交互。而智能体则具备感知、规划、执行和反思的完整能力,通过多轮有状态的循环处理复杂任务。为实现智能体的可靠运行,需要构建专门的运行框架来管理系统状态、协调工具调用、处理错误并保障可观测性。这类框架通常包含编排层、执行层、记忆层、工具层和控制层等核心组件,通过模块化设计解决工程化挑战。在具体实践中,开发者可以基于开源库搭建原型,并遵循可靠性、安全性和可扩展性原则,

weixin_30632883的博客 340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

广电大数据用户画像及营销推荐策略(四)——Python实现

本次大数据项目数据及分析均做脱敏化和保密化,主要分享思路体系,全程用Python实现,数据和代码均不提供。如有建议欢迎讨论!

qq_40304090的博客 3737

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

weixin_53637133的博客 181

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【第 009 讲】全面掌握 Python 注释:注释的定义与作用 | 单行注释 | 三引号与多行注释 | 注释使用的最佳实践

本文系统讲解 Python 注释的完整知识体系:从注释的定义与作用讲起,梳理单行注释的书写位置、临时屏蔽用法与 PEP 8 排版规范,剖析注释被忽略的底层机制;进而说明三引号字符串的本质与嵌套问题;最后给出注释使用的三条实践原则,帮助读者写好可读性高的注释。

大模型全栈工程师 · Thanks_ks 580

Python 的 yield from 到底转发了什么:拆开 send、throw 和那个 return 值

很多人把yield from记成「省一层 for 循环的语法糖」。写和写,结果看着一样,于是就当它只是少敲几个字。这个理解会在三个地方翻车:调用方.send()的值送不进去、子生成器return的值拿不到、异常和close()传不下去。yield from真正做的事是,外层生成器退成一个透明通道。本文所有输出来自本机 CPython 3.13.14 实测。yield from不是循环,是委托——nextsendthrowclose四个方向的流量全部直通子生成器,并且子生成器return。

小小张说故事的博客 152

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 246

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 429

yolo 和 deft 算法的区别

你应该是打错了:是,不是 defrat;

曾大强博客 259
上一篇: 上班可以摸鱼了!刚刚发现在VScode中可玩魂斗罗,超级玛丽!附详细攻略!
下一篇: Anaconda介绍、安装及使用保姆级教程
菜鸟学Python
博客等级 码龄9年 8087粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值