我正在学习python而且我不确定理解以下语句:“该函数(包括其名称)可以捕获我们对问题的心理分块或抽象。”< / p>
这是粗体的部分,我不理解编程方面的含义。引用来自http://www.openbookproject.net/thinkcs/python/english3e/functions.html
如何像计算机科学家一样思考,3版。
谢谢!
答案 0 :(得分:134)
抽象是所有计算机科学的核心概念。如果没有抽象,我们仍然会使用机器代码编程,或者更糟糕的是首先没有计算机。恕我直言,这是一个非常好的问题。
什么是抽象
抽象意味着赋予事物名称,以便该名称捕获函数或整个程序的核心。
在您参考的书中给出了一个例子,其中有
假设我们正在与海龟合作,我们需要的是一项常见的操作 绘制正方形。 “画一个正方形”是一个抽象,或一个心理块, 一些较小的步骤。所以让我们写一个函数来捕获 这个“积木”的模式:
暂时忘掉海龟,想想画一个正方形。如果我告诉你画一个正方形(在纸上),你立即知道该怎么做:
你可以在没有进一步问题的情况下做到这一点,因为你知道 square 是什么,而不是我一步一步告诉你。在这里,单词 square 是抽象&#34;绘制一个长度相同的所有边的矩形&#34;。
抽象深入
但是等等,你怎么知道矩形是什么?嗯,这是以下的另一个抽象:
当然它一直在继续 - 行,并行,垂直,连接都是抽象众所周知的概念。
现在,想象一下,每当你想要绘制一个矩形或正方形时,你必须给出一个矩形的完整定义,或解释直线,平行线,垂直线和连接线 - 它需要太长时间才能这样做。
抽象的真正力量
这是抽象的第一个力量:他们使谈话和完成工作变得更容易。
抽象的第二个力量来自可组合性的优良属性:一旦定义了抽象,就可以组合两个或更多个抽象来形成一个新的,更大的抽象:说你厌倦了绘制方块,但你真的想画一个 house 。假设我们已经定义了三角形,那么我们就可以定义:
接下来,你想要一个村庄:
哦等等,我们想要一个城市 - 我们有一个新概念 street :
依旧......
这一切如何适用于编程?
如果在规划您的程序(称为分析和设计)的过程中,您会发现您要解决的问题的良好抽象,您的程序变得更短,因此更容易编写 - 或许更重要的是 - 更容易阅读。这样做的方法是尝试掌握定义问题的主要概念 - 如绘制房屋的(简化)示例,这是正方形和< em>三角形,绘制一个村庄它是 house 。
在编程中,我们将抽象定义为函数(以及一些其他类似于类和模块的构造,但现在让我们关注函数)。一个函数本质上是命名一组单个语句,因此函数本质上是一个抽象 - 请参阅本书中的示例以获取详细信息。
美丽的一切
在编程中,抽象可以决定生产力。这就是为什么常常将常用函数收集到库中,这些函数可以被其他人重用。这意味着您不必担心细节,您只需要了解如何使用现成的抽象。显然,这应该让你更容易,所以你可以更快地工作,从而提高工作效率:
实施例:
想象一下,有一个名为&#34; nicepic&#34;的图形库。包含上面讨论的所有抽象的预定义函数:矩形,正方形,三角形,房子,村庄。
假设你想根据上面的抽象创建一个程序,描绘一个漂亮的房子图片,你要写的就是:
import nicepic
draw_house()
这样只需要两行代码就可以获得更精细的内容。难道不是很棒吗?
希望这有帮助。
答案 1 :(得分:6)
理解抽象的一个好方法是通过抽象类。
假设我们正在编写一个模拟房屋的程序。房子将有几个不同的房间,我们将代表它们作为对象。我们为浴室,厨房,起居室,餐厅等定义了一个班级。
然而,所有这些都是房间,因此共享几个属性(门/窗口的数量,平方英尺等)但是,房间永远不会存在于它自己...它总是会有一些输入的房间。
然后创建一个名为Room的抽象类是有意义的,它将包含所有房间共享的属性,然后拥有Kitchen,Living Room等类,继承抽象类Room。
房间的概念是抽象,只存在于我们的头脑中,因为实际上存在的任何房间不仅仅是一个房间;这是一间卧室,一间起居室或一间教室。
我们希望我们的代码代表我们的“心理分块”。它使一切都更整洁,更容易处理。
答案 2 :(得分:3)
根据wikipedia: Abstraction_(computer_science)
的定义抽象试图从一个共同的模式中分解细节,以便 程序员可以接近人类思想的水平而离开 细节在实践中很重要,但并不是迫切需要解决的问题 解决。
基本上它正在删除问题的细节。例如,绘制一个正方形需要几个步骤,但我只想要一个绘制正方形的函数。
答案 3 :(得分:1)
描述某事的最佳方式是使用示例:
一个函数只不过是一系列完成任务的命令。基本上,您可以组织一大块代码来完成一件事。这一件事可以在你的程序中一遍又一遍地重复使用。
既然你的功能做了这件事,你应该命名它,以便它可以立即识别它的作用。一旦你命名它,你可以通过简单地命名它来重复使用它。
def bark():
print "woof!"
然后要使用该功能,您可以执行以下操作:
bark();
如果我们想要吠4次会怎么样?那么你可以写bark(); 4次。
bark();
bark();
bark();
bark();
或者您可以修改您的函数以接受某种类型的输入,以改变它的工作方式。
def bark(times):
i=0
while i < times:
i = i + 1
print "woof"
然后我们可以调用一次:
bark(4);
当我们开始讨论面向对象编程(OOP)时,抽象意味着不同的东西。你稍后会发现那部分:)
答案 4 :(得分:0)
假设您编写了一个函数,它接收一堆文本作为参数,然后读取配置文件中的凭据,然后使用这些凭据连接到SMTP服务器并使用该文本发送邮件。
该功能应该命名为 sendMail(文本),而不是 parseTextReadCredentialsInFileConnectToSmtpThenSend(text),因为它更容易用自己和呈现时的方式表示它的作用API给同事或用户......尽管第二个名称更准确,但第一个名称是更好的抽象。
答案 5 :(得分:0)
在一个简单的句子中,我可以说:抽象的本质是在提取必要的属性的同时省略不必要的细节。但是为什么我们要忽略无关紧要的细节呢?关键动机是防止变更的风险。
答案 6 :(得分:-1)
抽象:是硬件和软件中非常重要的概念。
重要性:我们人类一直记不起所有的事情。例如,如果您的朋友快速说出30个随机数字,并要求您将它们全部添加,那么您将无法做到。原因?您可能无法记住所有这些数字。您可以在纸上写下这些数字,即使这样你也会逐一忽略左边的数字然后忽略最右边的数字,而忽略了最右边的数字。
它表明,在某个时刻,人类可以专注于某个特定问题,同时忽略那些已经解决的问题,并将焦点转移到剩下要解决的问题上。
忽略不那么重要的事情并将重点放在最重要的事情上(暂时和特定情况下)被称为抽象
以下是抽象在编程中的工作原理。
以下是C语言世界着名的hello world程序:
//C hello world example hello.c
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
这是程序员编写的最简单且通常是第一个计算机程序。在命令提示符下编译并运行此程序时,输出可能如下所示:
以下是严肃的问题
gcc -o hello hello.c
它将您的英语像C语言代码转换为二进制代码,您可以通过命令运行该代码:
./你好
因此,要在C程序中编写应用程序,您永远不需要知道C编译器如何将C语言代码转换为二进制代码。所以你使用GCC编译器作为抽象。
为简单起见,我没有扩展操作系统,内核,固件和硬件的抽象答案。
要记住的事情:
在进行编程时,您可以通过各种方式使用抽象来简化程序。
示例1:您可以使用常量来抽取程序中PI 3.14159的值,因为对于程序的其余部分,PI比3.14159容易记住
示例2:您可以编写一个函数,它返回给定数字的平方,然后包括您在内的任何人都可以通过将其作为参数输入并从中获取返回值来使用该函数。
示例3:在面向对象编程(OOP)中,如Java,您可以定义一个对象,它封装数据和方法,您可以通过调用其方法来使用该对象。
示例4:许多应用程序为您提供 API ,您可以使用它来与该应用程序进行交互。使用API方法时,您永远不需要知道它们是如何实现的。所以抽象就在那里。
通过所有示例,您可以了解抽象的重要性以及如何在编程中实现抽象。要记住的一个关键事项是抽象是上下文的,即根据上下文不断改变