精华内容
下载资源
问答
  • 在本章中,我们将分析Douglas Crockford关于... Crockford是JavaScript开发社区最知名的权威,是JSON、JSLint、JSMin和ADSafe之父,是《JavaScript: The Good Parts》的作者。 现在是Yahoo的资深JavaScript...

    在本章中,我们将分析Douglas Crockford关于JavaScript继承的一个实现 - Classical Inheritance in JavaScript。 Crockford是JavaScript开发社区最知名的权威,是JSON、JSLint、JSMin和ADSafe之父,是《JavaScript: The Good Parts》的作者。 现在是Yahoo的资深JavaScript架构师,参与YUI的设计开发。 这里有一篇文章详细介绍了Crockford的生平和著作。 当然Crockford也是我等小辈崇拜的对象。

    调用方式

    首先让我们看下使用Crockford式继承的调用方式: 注意:代码中的method、inherits、uber都是自定义的对象,我们会在后面的代码分析中详解。

    // 定义Person类

    function Person(name) {

    this.name = name;

    }

    // 定义Person的原型方法

    Person.method("getName", function() {

    return this.name;

    });

    // 定义Employee类

    function Employee(name, employeeID) {

    this.name = name;

    this.employeeID = employeeID;

    }

    // 指定Employee类从Person类继承

    Employee.inherits(Person);

    // 定义Employee的原型方法

    Employee.method("getEmployeeID", function() {

    return this.employeeID;

    });

    Employee.method("getName", function() {

    // 注意,可以在子类中调用父类的原型方法

    return "Employee name: " + this.uber("getName");

    });

    // 实例化子类

    var zhang = new Employee("ZhangSan", "1234");

    console.log(zhang.getName()); // "Employee name: ZhangSan"

    这里面有几处不得不提的硬伤:

    子类从父类继承的代码必须在子类和父类都定义好之后进行,并且必须在子类原型方法定义之前进行。

    虽然子类方法体中可以调用父类的方法,但是子类的构造函数无法调用父类的构造函数。

    代码的书写不够优雅,比如原型方法的定义以及调用父类的方法(不直观)。

    当然Crockford的实现还支持子类中的方法调用带参数的父类方法,如下例子:

    function Person(name) {

    this.name = name;

    }

    Person.method("getName", function(prefix) {

    return prefix + this.name;

    });

    function Employee(name, employeeID) {

    this.name = name;

    this.employeeID = employeeID;

    }

    Employee.inherits(Person);

    Employee.method("getName", function() {

    // 注意,uber的第一个参数是要调用父类的函数名称,后面的参数都是此函数的参数

    // 个人觉得这样方式不如这样调用来的直观:this.uber("Employee name: ")

    return this.uber("getName", "Employee name: ");

    });

    var zhang = new Employee("ZhangSan", "1234");

    console.log(zhang.getName()); // "Employee name: ZhangSan"

    代码分析

    首先method函数的定义就很简单了:

    Function.prototype.method = function(name, func) {

    // this指向当前函数,也即是typeof(this) === "function"

    this.prototype[name] = func;

    return this;

    }; 要特别注意这里this的指向。当我们看到this时,不能仅仅关注于当前函数,而应该想到当前函数的调用方式。 比如这个例子中的method我们不会通过new的方式调用,所以method中的this指向的是当前函数。

    inherits函数的定义有点复杂:

    Function.method("inherits", function (parent) {

    // 关键是这一段:this.prototype = new parent(),这里实现了原型的引用

    var d = {}, p = (this.prototype = new parent());

    // 只为子类的原型增加uber方法,这里的Closure是为了在调用uber函数时知道当前类的父类的原型(也即是变量 - v)

    this.method("uber", function uber(name) {

    // 这里考虑到如果name是存在于Object.prototype中的函数名的情况

    // 比如 "toString" in {} === true

    if (!(name in d)) {

    // 通过d[name]计数,不理解具体的含义

    d[name] = 0;

    }

    var f, r, t = d[name], v = parent.prototype;

    if (t) {

    while (t) {

    v = v.constructor.prototype;

    t -= 1;

    }

    f = v[name];

    } else {

    // 个人觉得这段代码有点繁琐,既然uber的含义就是父类的函数,那么f直接指向v[name]就可以了

    f = p[name];

    if (f == this[name]) {

    f = v[name];

    }

    }

    d[name] += 1;

    // 执行父类中的函数name,但是函数中this指向当前对象

    // 同时注意使用Array.prototype.slice.apply的方式对arguments进行截断(因为arguments不是标准的数组,没有slice方法)

    r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));

    d[name] -= 1;

    return r;

    });

    return this;

    }); 注意,在inherits函数中还有一个小小的BUG,那就是没有重定义constructor的指向,所以会发生如下的错误:

    var zhang = new Employee("ZhangSan", "1234");

    console.log(zhang.getName()); // "Employee name: ZhangSan"

    console.log(zhang.constructor === Employee); // false

    console.log(zhang.constructor === Person); // true

    改进建议

    根据前面的分析,个人觉得method函数必要性不大,反而容易混淆视线。 而inherits方法可以做一些瘦身(因为Crockford可能考虑更多的情况,原文中介绍了好几种使用inherits的方式,而我们只关注其中的一种), 并修正了constructor的指向错误。

    Function.prototype.inherits = function(parent) {

    this.prototype = new parent();

    this.prototype.constructor = this;

    this.prototype.uber = function(name) {

    f = parent.prototype[name];

    return f.apply(this, Array.prototype.slice.call(arguments, 1));

    };

    }; 调用方式:

    function Person(name) {

    this.name = name;

    }

    Person.prototype.getName = function(prefix) {

    return prefix + this.name;

    };

    function Employee(name, employeeID) {

    this.name = name;

    this.employeeID = employeeID;

    }

    Employee.inherits(Person);

    Employee.prototype.getName = function() {

    return this.uber("getName", "Employee name: ");

    };

    var zhang = new Employee("ZhangSan", "1234");

    console.log(zhang.getName()); // "Employee name: ZhangSan"

    console.log(zhang.constructor === Employee); // true

    有点意思

    在文章的结尾,Crockford居然放出了这样的话:

    I have been writing JavaScript for 8 years now, and I have never once found need to use an uber function. The super idea is fairly important in the classical pattern, but it appears to be unnecessary in the prototypal and functional patterns. I now see my early attempts to support the classical model in JavaScript as a mistake. 可见Crockford对在JavaScript中实现面向对象的编程不赞成,并且声称JavaScript应该按照原型和函数的模式(the prototypal and functional patterns)进行编程。

    不过就我个人而言,在复杂的场景中如果有面向对象的机制会方便的多。

    但谁有能担保呢,即使像jQuery UI这样的项目也没用到继承,而另一方面,像Extjs、Qooxdoo则极力倡导一种面向对象的JavaScript。 甚至Cappuccino项目还发明一种Objective-J语言来实践面向对象的JavaScript。

    展开全文
  • 现代计算机科学之父之一的Grady Booch说,计算机科学家的整个历史就是在增加新的抽象层。在现有技术之上,低代码只是一个抽象层,它使得定义逻辑的过程对大多数人来说更容易理解。 甚至连孩子们也在通过诸如麻省...

    原标题:低代码的承诺有多现实?

    低代码平台有望简化应用程序的开发过程,但是最终企业长期一致应用起来有多现实?

    最近,低代码作为一种加速应用程序交付,同时降低成本的方法,已经成为人们关注的焦点。在没有改变业务流程的情况下,定制化是有限的。云计算厂商也开始关注这一领域,那么低代码的承诺到底有多现实呢?

    在本文中,我们探讨了该领域五位专家的观点,以及这种特殊的编码技术为软件开发团队带来了什么。

    加速发展

    Redis技术经理Ajeet Raina解释了低代码以及正确的补充工具如何加速软件开发。

    Raina说,“低代码”意味着任何人都可以以更快的速度编写或构建软件应用和服务。它指的是那些提供预构建算法和简单工作流(如拖放建模)的人工智能开发平台。这些平台包括可视化界面,可以方便地与数据连接,并加速将服务和应用程序推向市场。

    低代码有望加快开发周期。它通过对应用程序逻辑流的智能建议来提高开发人员的工作效率,允许企业把更多的解决问题的能力交给非IT专业人员。

    如今,借助AI / ML库和工具,可以用少量的代码(更重要的是,以迭代的方式)创建功能强大的应用程序。例如,使用TensorFlow,PyTorch之类的库以及Jupyter和Apache Zeppelin之类的笔记本,使用几行代码,IT人员可以让代码更加高效。

    不仅仅是承诺

    低代码带来的更简单的视觉效果,让那些没有技术背景的人更容易编码。

    根据Copado公司产品营销高级总监Andrew Davis的说法,“低代码不仅仅是一个承诺。对于像Salesforce这样的平台,数十年来一直在践行低代码的落地实践。依赖低代码的平台数量正以200多种不同的选项激增,包括Microsoft Dynamics,Pega和其他系统。

    现代计算机科学之父之一的Grady Booch说,计算机科学家的整个历史就是在增加新的抽象层。在现有技术之上,低代码只是一个抽象层,它使得定义逻辑的过程对大多数人来说更容易理解。

    甚至连孩子们也在通过诸如麻省理工学院的scratch(一种视觉编程语言)这样的语言来学习代码编程。就像人类通过文字和图片交流一样,一张图片相当于1000个单词。因此,开发人员可以同时使用代码和低代码或可视化编程语言进行开发。

    “可视语言对许多人来说更容易获得,而且更加安全。因此,许多出色的业务专家用户可以通过低代码系统来定义逻辑或用户界面,而不必花大量的时间和精力通过更复杂的方法来开发功能。”

    代码之美

    NewRelic的开发倡导者NočnicaFee认为,虽然低代码工具变得越来越普遍,但是编写代码的过程仍然可以发挥重要作用。

    她解释说:“对于大多数应用程序来说,我们编写的代码已经是最简单和最易读的配置解决方案。使用可视化节点编辑器创建代码路径的工具令人印象深刻,但代码仍然作为高级控制的基础层存在。我曾经使用这些可视化编辑器制作了一款完整的手机视频游戏。一旦工作流变得稍微复杂一点,编辑这些工具生成的代码就很有帮助了。”

    “这并不是说我们正在编写的代码是直接的机器代码:我编写的任何代码都是在一个我几乎无法理解或控制的独立引擎中解释和运行的。例如,Ruby(作为后来所有web应用程序语言的鼻祖)并非旨在作为计算机易于运行的语言,而是完全作为人类易于阅读和编写的语言。”

    “诸如CloudFormation之类的配置工具的状态具有指导意义:许多CloudFormation开发人员利用可视化工具来创建其Cloudformation模板,而不是直接处理模板YAML语法。然而,YAML是用于直接编辑的,当用户遇到更高级的挑战时,他们可能会手动编辑制作或创建直接操作YAML的工具。

    总之,代码仍然是将业务需求转换为机器指令的最佳方式,并且将继续作为大多数工具配置的高级版本。

    使用不当会带来风险

    众所周知,低码可以提高速度和可访问性。但是,如果将其视为孤岛,它确实会带来风险。

    “即使在今天,低代码仍然存在风险,因为团队经常会孤立低代码和高代码开发软件,” Domo副总裁Ben Schein说。“如果人们使用Python或Kubernetes进行工作,则低代码接口的配置将不会始终保持一致,因此出现了分歧,团队也将无法进行协作。

    “要真正实现低代码的好处,我们需要找到一种方法来使它构建预先存在的高代码资源。有时就像API集成一样简单,确保你的高代码活动可以与低代码软件平台进行对话并以信息发送作为起点。对于Domo技术,我们的优先级是使高代码和低代码活动能够协同工作,而不是在两条单独的路径上运行它们。”

    Raina补充道:“虽然低代码看起来很有前途,但它也面临着一系列挑战。关于如何管理、维护和扩展这些应用程序,低代码并没有过多地说明。”

    缺乏可见性是另一个挑战,因为企业内的大多数团队都在忙于利用这些低代码开发平台,并且对生成的数据没有监督。有时,这可能会导致许多企业浪费大量资源。

    编码技巧仍然重要

    Pluralsight欧洲、中东和非洲高级副总裁Sean Farrington解释说,当谈到企业内部的低编码承诺时,需要考虑的最后一点是对编码技能的持续需求。

    的确,低代码和无代码的应用程序开发正在扩大,而且最近Pluralsight的研究发现,有一半(51%)的新技术员工只懂一种或根本不懂编程语言,Farrington说。

    但是,这并不是说传统的编码技能是多余的,它们仍然值得学习。像Java、Python和C这样的语言在各行各业的组织中仍然很常见,而且这种情况在未来几年还将继续存在。它们为所有现代应用程序开发、新的安全和数据处理提供了基础,并将使企业在同行中保持竞争力和创新性。

    “即使许多人认为过时的传统语言也值得我们学习。以COBOL为例,该语言已有50年历史,新软件开发人员很少被教授这门语言,当新的语言年复一年地被创造出来的时候,你为什么还要学习这种过时的语言呢?实际上,仍有数十亿行COBOL代码在使用中,它支撑着许多公共部门和银行组织的系统。”

    “因此,为了保持系统运行或迁移到新的工作方式,对这些传统语言的全面了解对于可预见的未来至关重要。”返回搜狐,查看更多

    责任编辑:

    展开全文
  • 前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:鸿影洲冷这篇文章主要内容来源于 Python 编程语言的最初设计者及主要架构师 Guido...

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者:鸿影洲冷

    这篇文章主要内容来源于 Python 编程语言的最初设计者及主要架构师 Guido van Rossum 的博客 The History of Python(http://python-history.blogspot.com/)。博客文章不多,只有32篇而已,但是 Guido van Rossum 在这个博客里叙述和解释了 Python 一些重要特性的发明历史和这个特性诞生的原因,比如为什么 Python 会叫 Python,Python 为什么会使用缩进区分编程语句等等,有些特性很平常,而且替代选择也很多,至于为什么会选择其中一个,使用者往往不好回答,而对于最初设计者而言,却轻而易举。

    发明 Python 的动机

    Guido 大学毕业后加入了 CWI ,CWI 是荷兰的一家研究中心,它由荷兰政府教育部和其他研究基金资助,对计算机科学和数学进行学术级的研究。在 CWI 中,Guido 参与了 Amoeba 项目。Amoeba 项目是由 Andrew Tanenbaum 负责,CWI 和 Vrije Universiteit Amsterdam 两所机构共同参与开发的基于微内核的分布式系统。

    在 Amoeba 项目中,Guido 发现用 C 语言开发系统管理程序所花费的时间太长了,而且因为 Amoeba 是一个全新的底层操作系统实现,导致了和原有的 Bourne shell 不兼容,在 Bourne shell 中无法执行 Amoeba 项目中的一些程序。这些原因让 Guido 意识到它需要一个能够弥合 C 和 shell 之间鸿沟,更高抽象级别、更加简单的编程语言去完成工作任务。

    于是 Python 诞生了。

    同样的 Guido 也在文章中解释了为什么选择造轮子发明 Python,而不是移植其它编程语言 ?那是因为当初并没有其它编程语言可以完成这些任务。

    为什么 Python 要叫 Python ?

    Python 的中文是“蟒蛇”的意思,而且 O’Reilly 出版社也用蟒蛇图片作为了 Python 相关书的封面(O’Reilly 非常喜欢用动物图片去作为其出版物的封面),平时看过的一些关于 Python 文章想当然的认为 Python 这门语言与蟒蛇关联上了,但实际上 Guido 并不喜欢将 Python 与蛇关联上。For many years I resisted attempts to associate the language with snakes.

    Guido 使用 Python 这个名字的灵感来源于他喜欢的一个马戏团的名字 Monty Python,并且他认为使用 Python 更具有 IT 行业一贯以来的不拘一格的个性。也符合编程语言的名称来源于名人的名字的习惯。The word “Python” was also catchy, a bit edgy, and at the same time, it fit in the tradition of naming languages after famous people, like Pascal, Ada, and Eiffel.

    Guido 眼里的 Python 是什么样的?

    Guido 在博客的开篇便提起了他所认为的 Python 是什么样的一门语言,从中摘抄几个核心设计点:Python 大量的采用了 C 语言里面的设计,比如 if、else 等关键字都直接来源 C 语言。但是放弃了 C 语言的大括号和分号,选择了缩进去区分不同的编程语句。

    Python 是一门动态语言,不像 C 语言一样需要预先声明变量和指定变量类型,,因此 Python 里的变量只是所引用对象的名称,并且也可以在程序运行时改变变量类型。

    Python 内置了大量的数据类型,包括布尔(Boolean)、数字(Number)和字符串(String)等,这些类型都是不可变的。除此以外还有像列表、元组和字典这种容器型的数据类型。

    为了程序的模块化,Python 引入了包(packages)、模块(modules )、类、方法和函数。为了流程控制,Python 提供了 if/else、while 和可迭代的实例。为了处理程序异常,Python 使用了 Exception 语法,raise 关键字可以抛出异常(exception),try/except/finally 可以处理异常。

    Python 的所有对象都是一等对象,这意味着函数、类、方法、模块和所有的其他对象都可以在运行时自由地传递,并放入在各种数据结构(例如列表或字典)中去。

    同样的,Python 还支持面向对象编程。

    除了自身特性外,Python 还拥有着大量的标准库和第三方库,方便使用者完成各种各样的需求。

    最后,Python 的标准实现使用 C 语言实现的,但是 Python 不仅仅局限于 C 语言,它也可以用 Java(Jython)、Microsoft .NET(IronPython),甚至是 Python 自己实现(PyPy)。

    注意到没有,Guido 在开篇从未提到 Python 是一门追求性能的语言,至于为什么,在下一章提到 Guido 的设计哲学会提到,为什么 Python 不会一味地追求性能。

    Python 的设计哲学

    在了解 Python 的设计哲学之前,首先要知道 Python 在刚开始时是一个一个人独自维护的项目,没有任何官方预算,也没有任何其它支持,并且 Guido 也希望能尽快出结果。这些因素影响了 Python 的设计哲学。First of all, Python was originally conceived as a one-person “skunkworks” project – there was no official budget, and I wanted results quickly

    可以偷懒的设计哲学:尽可能从其他地方借用想法。

    “事情应该尽可能简单,但不要简化。” (爱因斯坦)

    只做好一件事情(UNIX哲学思想)。

    不要对性能太担心-以后有需要时,再进行优化。

    不要与环境(environment)抗争,顺其自然。

    不要追求完美,“足够好”就可以了。

    (因此)有时可以偷工减料,后续可以想办法弥补。

    这些设计哲学帮助 Guido 在实现 Python 时节省了大量的宝贵时间,没有陷入到没有必要的细节中去;在不应该节省时间的地方,Guido 花费了大量的时间去精雕细琢。Guido 在 Python 这门语言中展现了他对实现细节本身和实现细节所需要花费时间的平衡的把握程度。

    不可以偷懒的设计哲学:Python 不能仅仅运行在某个特定平台(Linux 或者是 Windows)上,虽然 Python 在一些平台上的某些功能并不总是可用的,但是其核心功能应该在任何平台上都可以使用。

    不要用机器可以处理的细节去打扰用户,也就是说,机器能够完成的,就需要用户去实现它。

    支持和鼓励只能运行于特定平台的用户代码,但不能让用户不能访问对平台本身的功能或特性(这与Java形成了鲜明对比)。

    一个大型的复杂系统应具有不同级别的抽象扩展能力,这可以为有想法的的用户(无论其是否熟练)提供最大的自由去实现他想要的功能。

    错误不应该是致命的,也就是说,只要虚拟机仍在运行,用户代码就能够从错误状况中恢复过来。

    同样的,错误不应该被静默地传递。

    不应该让用户 Python 代码中的 bug 导致 Python 解释器出现未定义行为。

    最后,为了尽可能保持 Python 的可读性,标点符号使用应该符合书面英语或高等代数中的常用用法,除非遇上了编程语言里的历史传统(比如用 x * y 表示乘法)。

    就像 Guido 所说的那样,这些设计哲学正是让 Python 获得如此巨大成功的主要原因之一。In many ways, the design philosophy I used when creating Python is probably one of the main reasons for its ultimate success. Rather than striving for perfection, early adopters found that Python worked "well enough" for their purposes. As the user-base grew, suggestions for improvement were gradually incorporated into the language.

    Python 为什么会使用缩进和冒号(:)区分编程语句?

    Python 使用缩进区分编程语句来源于 ABC 编程语言,但是这个想法并非起源于 ABC,它是 Donald Knuth 所提倡的一种著名的编程风格( occam 编程语言也使用过它)。但是,ABC 编程语言的作者确实发明了使用冒号将导入语句(lead-in clause)与缩进块(indented block)分开的方式。

    至于为什么要引入冒号进一步区分编程语句,是因为在一项早期的用户测试中发现单纯地使用缩进去区分语句,会让一些用户产生疑惑,影响了他们对编程语言的学习。而后面在编程语言里添加了冒号去区分编程语句,就会引起用户对后续内容的注意,从而帮助用户将前后的编程语句联系起来(想想 if/else、while 和 for 语句)。

    总结

    除了上文提到,The History of Python 这个博客中还聊了很多,比如有对列表推导和迭代器历史的叙述,还有对 Python 为什么不是一门函数式编程语言,却有着函数式编程语言特性的解释,等等。

    通过对这些历史的了解,读者朋友可能在某个时刻写着写着代码,用到了某个特性,想到了它的历史,便会心一笑:原来如此,心情也会豁然开朗。

    展开全文
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:鸿影洲冷 这篇文章主要内容来源于 Python 编程语言的最初设计者及主要架构师 Guido...

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者:鸿影洲冷

    这篇文章主要内容来源于 Python 编程语言的最初设计者及主要架构师 Guido van Rossum 的博客 The History of Python(http://python-history.blogspot.com/)。博客文章不多,只有32篇而已,但是 Guido van Rossum 在这个博客里叙述和解释了 Python 一些重要特性的发明历史和这个特性诞生的原因,比如为什么 Python 会叫 Python,Python 为什么会使用缩进区分编程语句等等,有些特性很平常,而且替代选择也很多,至于为什么会选择其中一个,使用者往往不好回答,而对于最初设计者而言,却轻而易举。

    发明 Python 的动机

    Guido 大学毕业后加入了 CWI ,CWI 是荷兰的一家研究中心,它由荷兰政府教育部和其他研究基金资助,对计算机科学和数学进行学术级的研究。在 CWI 中,Guido 参与了 Amoeba 项目。Amoeba 项目是由 Andrew Tanenbaum 负责,CWI 和 Vrije Universiteit Amsterdam 两所机构共同参与开发的基于微内核的分布式系统。

    在 Amoeba 项目中,Guido 发现用 C 语言开发系统管理程序所花费的时间太长了,而且因为 Amoeba 是一个全新的底层操作系统实现,导致了和原有的 Bourne shell 不兼容,在 Bourne shell 中无法执行 Amoeba 项目中的一些程序。这些原因让 Guido 意识到它需要一个能够弥合 C 和 shell 之间鸿沟,更高抽象级别、更加简单的编程语言去完成工作任务。

    于是 Python 诞生了。

    同样的 Guido 也在文章中解释了为什么选择造轮子发明 Python,而不是移植其它编程语言 ?那是因为当初并没有其它编程语言可以完成这些任务。

    Python基础入门资料加群免费领取

    资料就在群文件里放着哟

    为什么 Python 要叫 Python ?

    Python 的中文是“蟒蛇”的意思,而且 O’Reilly 出版社也用蟒蛇图片作为了 Python 相关书的封面(O’Reilly 非常喜欢用动物图片去作为其出版物的封面),平时看过的一些关于 Python 文章想当然的认为 Python 这门语言与蟒蛇关联上了,但实际上 Guido 并不喜欢将 Python 与蛇关联上。

    For many years I resisted attempts to associate the language with snakes.

    Guido 使用 Python 这个名字的灵感来源于他喜欢的一个马戏团的名字 Monty Python,并且他认为使用 Python 更具有 IT 行业一贯以来的不拘一格的个性。也符合编程语言的名称来源于名人的名字的习惯。

    The word “Python” was also catchy, a bit edgy, and at the same time, it fit in the tradition of naming languages after famous people, like Pascal, Ada, and Eiffel.

    Guido 眼里的 Python 是什么样的?

    Guido 在博客的开篇便提起了他所认为的 Python 是什么样的一门语言,从中摘抄几个核心设计点:

    1. Python 大量的采用了 C 语言里面的设计,比如 if、else 等关键字都直接来源 C 语言。但是放弃了 C 语言的大括号和分号,选择了缩进去区分不同的编程语句。
    2. Python 是一门动态语言,不像 C 语言一样需要预先声明变量和指定变量类型,,因此 Python 里的变量只是所引用对象的名称,并且也可以在程序运行时改变变量类型。
    3. Python 内置了大量的数据类型,包括布尔(Boolean)、数字(Number)和字符串(String)等,这些类型都是不可变的。除此以外还有像列表、元组和字典这种容器型的数据类型。
    4. 为了程序的模块化,Python 引入了包(packages)、模块(modules )、类、方法和函数。为了流程控制,Python 提供了 if/else、while 和可迭代的实例。为了处理程序异常,Python 使用了 Exception 语法,raise 关键字可以抛出异常(exception),try/except/finally 可以处理异常。
    5. Python 的所有对象都是一等对象,这意味着函数、类、方法、模块和所有的其他对象都可以在运行时自由地传递,并放入在各种数据结构(例如列表或字典)中去。
    6. 同样的,Python 还支持面向对象编程。
    7. 除了自身特性外,Python 还拥有着大量的标准库和第三方库,方便使用者完成各种各样的需求。
    8. 最后,Python 的标准实现使用 C 语言实现的,但是 Python 不仅仅局限于 C 语言,它也可以用 Java(Jython)、Microsoft .NET(IronPython),甚至是 Python 自己实现(PyPy)。

    注意到没有,Guido 在开篇从未提到 Python 是一门追求性能的语言,至于为什么,在下一章提到 Guido 的设计哲学会提到,为什么 Python 不会一味地追求性能。

    Python 的设计哲学

    在了解 Python 的设计哲学之前,首先要知道 Python 在刚开始时是一个一个人独自维护的项目,没有任何官方预算,也没有任何其它支持,并且 Guido 也希望能尽快出结果。这些因素影响了 Python 的设计哲学。

    First of all, Python was originally conceived as a one-person “skunkworks” project – there was no official budget, and I wanted results quickly

    可以偷懒的设计哲学:

    • 尽可能从其他地方借用想法。
    • “事情应该尽可能简单,但不要简化。” (爱因斯坦)
    • 只做好一件事情(UNIX哲学思想)。
    • 不要对性能太担心-以后有需要时,再进行优化。
    • 不要与环境(environment)抗争,顺其自然。
    • 不要追求完美,“足够好”就可以了。
    • (因此)有时可以偷工减料,后续可以想办法弥补。

    这些设计哲学帮助 Guido 在实现 Python 时节省了大量的宝贵时间,没有陷入到没有必要的细节中去;在不应该节省时间的地方,Guido 花费了大量的时间去精雕细琢。Guido 在 Python 这门语言中展现了他对实现细节本身和实现细节所需要花费时间的平衡的把握程度。

    不可以偷懒的设计哲学:

    • Python 不能仅仅运行在某个特定平台(Linux 或者是 Windows)上,虽然 Python 在一些平台上的某些功能并不总是可用的,但是其核心功能应该在任何平台上都可以使用。
    • 不要用机器可以处理的细节去打扰用户,也就是说,机器能够完成的,就需要用户去实现它。
    • 支持和鼓励只能运行于特定平台的用户代码,但不能让用户不能访问对平台本身的功能或特性(这与Java形成了鲜明对比)。
    • 一个大型的复杂系统应具有不同级别的抽象扩展能力,这可以为有想法的的用户(无论其是否熟练)提供最大的自由去实现他想要的功能。
    • 错误不应该是致命的,也就是说,只要虚拟机仍在运行,用户代码就能够从错误状况中恢复过来。
    • 同样的,错误不应该被静默地传递。
    • 不应该让用户 Python 代码中的 bug 导致 Python 解释器出现未定义行为。
    • 最后,为了尽可能保持 Python 的可读性,标点符号使用应该符合书面英语或高等代数中的常用用法,除非遇上了编程语言里的历史传统(比如用 x * y 表示乘法)。

    就像 Guido 所说的那样,这些设计哲学正是让 Python 获得如此巨大成功的主要原因之一。

    In many ways, the design philosophy I used when creating Python is probably one of the main reasons for its ultimate success. Rather than striving for perfection, early adopters found that Python worked "well enough" for their purposes. As the user-base grew, suggestions for improvement were gradually incorporated into the language.

    Python 为什么会使用缩进和冒号(:)区分编程语句?

    Python 使用缩进区分编程语句来源于 ABC 编程语言,但是这个想法并非起源于 ABC,它是 Donald Knuth 所提倡的一种著名的编程风格( occam 编程语言也使用过它)。但是,ABC 编程语言的作者确实发明了使用冒号将导入语句(lead-in clause)与缩进块(indented block)分开的方式。

    至于为什么要引入冒号进一步区分编程语句,是因为在一项早期的用户测试中发现单纯地使用缩进去区分语句,会让一些用户产生疑惑,影响了他们对编程语言的学习。而后面在编程语言里添加了冒号去区分编程语句,就会引起用户对后续内容的注意,从而帮助用户将前后的编程语句联系起来(想想 if/else、while 和 for 语句)。

    总结

    除了上文提到,The History of Python 这个博客中还聊了很多,比如有对列表推导和迭代器历史的叙述,还有对 Python 为什么不是一门函数式编程语言,却有着函数式编程语言特性的解释,等等。

    通过对这些历史的了解,读者朋友可能在某个时刻写着写着代码,用到了某个特性,想到了它的历史,便会心一笑:原来如此,心情也会豁然开朗。

    展开全文
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 python免费学习资料、代码以及交流解答点击...
  • 就在11月13日,Python之父Guido van Rossum 宣布要去微软的消息。 图片来源于网络 在大多数顶级程序员选择退休的年龄,64岁的Guido van Ross...
  • Python 之父 Guido van Rossum 称退休太无聊,正式加入微软搞开源! 图片来自Oracle 博客 今天,Python 之父 Guido van Rossum 在 Twitter 上正式宣布,退休太无聊,如今加入了微软开发者部门。 Guido ...
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqVwOUED-1572580488282)... 作者 | I...
  • 本篇文章来自腾讯云 作者:Python之禅 Python的运行速度确实没有C或者Java快,但是有一些项目正在努力让Python变得更快。 Python代码简洁干净,但是大家都知道Python运行起来相对较慢 — 在CPU密集型的任务上慢于C...
  • 图/百度图片今天推一下小码哥的Python零基础学习书籍,希望这本书能够让你快速进阶,成长起来。“Python 之父”吉多·范罗苏姆 简介1989年,吉多·范罗苏姆 (...
  • 64 岁的 Python 之父:我不退休了!

    千次阅读 2020-11-19 13:40:00
    就在11月13日,Python之父Guido van Rossum 在刚刚宣布退休1年多时间宣布了他要去微软任职的消息。 图片来源于网络 在大多数顶级程序员选择退休的年龄,64岁的...
  • 爆品直降100元,立即点击图片抢购...程序员们在使用它们编写程序的时候,一定很好奇发明这些语言的发明者背后的故事,以及他们现状,是像Python 之父一样功成身退,还是继续奋战在编程一线。为此,笔者特地盘点了几...
  • 就在11月13日,Python之父Guido van Rossum 在刚刚宣布退休1年多时间宣布了他要去微软任职的消息。 图片来源于网络 在大多数顶级程序员选择退休的年龄,64岁的...
  • python之父 我总是认为学习一样新事物的最好方法就是听故事,那么就来听听python和他的父亲的故事. python起源 Python 的创始人为吉多·范罗苏姆(Guido van Rossum) (图片来至百度) Python的作者,Guido von ...
  • python生成图片验证码

    2020-05-08 12:37:06
    他们找到一位当时刚刚21岁的卡内基梅隆大学的计算机天才路易斯(路易斯·范·安),也是后来的验证码之父, 他提出让计算机先是产生一个随机的字符串,然后用程序把这个字符串的图像进行随机的污染,扭曲,再显示给电脑...
  • 1989年圣诞,Monty Python"s Flying Circus停播。Guido打算找点其他的事情打发自己的...图片中衣服上印着“人生苦短,我用python”这句话的人正是python之父,Guido van Rossum(吉多•范罗苏姆)。 网友用图片对...
  • 在QSS中,我们可以使用Background或者background-color的方式来设置背景色,设置窗口背景色之后,子控件默认会继承窗口的背景色,如果想要为控件设置背景图片或图标,则可以使用setPixmap或则setIcon来完成。...
  • 最近机器学习和人工智能走热,让...图片中衣服上印着“人生苦短,我用python”这句话的人正是python之父,Guido van Rossum(吉多•范罗苏姆)。 1989年圣诞,Monty Python"s Flying Circus停播。Guido打算找点...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:Python编程与实战 想要学习Python?有问题得不到第一时间解决?来看...
  • 1. 功能按钮: 格式:Button(对象,options,…) ...image:按钮上的图片 padx:设置文字与按钮左右间隔 pady:设置文字与按钮上下间隔 state:NORMAL表示启用按钮,DISABLED表示禁用按钮 text:字符 Bu
  • 叶节点求和 python

    2021-06-04 16:49:11
    7-5 叶节点求和 (10 分) 对给定的有N个节点(N>=0)的二叉树,求叶节点元素和。 输入格式: 第一行是一个非负整数N,表示有N个节点 第二行是一个整数k,是树根的元素值 ...对于图片中的二叉树: 3 20 20 0 10 20 1
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:Python进阶者 想要学习Python?有问题得不到第一时间解决?...C++之父 -
  • 图灵:人工智能之父、图灵测试 Marvin Lee Minsky:人工智能实验室 概念发展:人工智能-机器学习-深度学习 两个阶段:硬件的计算能力达不到、数据(大小、代表性)、算法的发展 机器学习、深度学习的用途:无人...
  • 1、.与…与./与…/ . 代表当前所在目录 … 代表当前所在目录的目录 ...功能:依据概率p对PIL图片进行垂直翻转 参数:p- 概率,默认值为0.5 eg:VerticalFlip(p=0.5), 2.依概率p水平翻转——transforms.RandomHo
  • PaddlePaddle GAN库,包括许多有趣的应用程序,如DeepFake First-Order运动...GAN生成对抗性网络被“卷积网络之父” Yan LeCun(Yang Likun)称赞为[过去十年计算机科学领域中最有趣的想法之一]。 这是德的一个研究领域
  • 用Keras实现图片风格迁移的算法详解

    千次阅读 2019-05-15 21:20:47
    该实现算法及代码,主要取自Keras 之父写的 《Python 深度学习》,有推荐价值。在此基础上,本人开发了一个用tkinter写的实用小工具,通过设置目标图片,风格图片,按开始转换,即可生成风格迁移后...
  • 基于Keras的图片多分类问题详解

    千次阅读 2020-03-01 14:10:50
    上一篇博文介绍了使用imageai通过五行代码来实现图像分类的问题,如果不使用imageai,使用keras和tensorflow如何灵活的训练图片多分类问题呢,其实imageai也是基于keras ... 学习keras推荐keras之父亲自撰写的一本...
  • 01-机器学习介绍

    2021-01-06 16:57:08
    图灵:人工智能之父 马文·李·闵斯基 范围 人工智能>机器学习>深度学习 应用 1. 图片艺术化 2. CT图识别 3. 车辆识别 4. 机器写新闻 5. 人脸识别 6. NPL 7. 传统预测:房价等 库和框架 TensorFlow caffe chainer...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

python之父图片

python 订阅