(Python) 子例程:过程和函数 - 1


子程序

子程序是程序的一个独立部分,它有一个名字并解决它自己的独立任务。子程序位于主程序的开头,可以通过指定名称从主程序启动(调用)。

如果您需要在程序的不同位置编写相同的代码,则使用子例程可以避免代码重复。 
导入到程序中的库(例如,数学库 math)包含已经由某人编译的子例程。程序员不需要考虑他们实现了什么算法,而只是简单地应用它们,只考虑他们到底在做什么。这是一个很大的节省时间。没有必要去写别人已经写好的算法。

每个子例程应该只做一个任务, 要么只是计算一些东西,要么输出一些数据,要么做其他事情。 

有两种类型的子例程 - 过程函数。

子过程执行一些操作,例如以某种形式在屏幕上显示结果(一个简单的例子,print() 语句是将数据打印到屏幕的标准子过程)。

函数子程序返回一个结果(数字、字符串等),我们可以在主程序中使用。

让我们尝试编写一个简单的程序:
假设我们需要在屏幕上显示字符串“Error”每次由于用户的失误,代码中都会出现错误。例如,当他输入错误的数据时。
这可以通过编写语句来完成 打印(“错误”) 而现在想象一下,在程序的很多地方都需要插入这样一行。当然,你可以到处写。但是这个解决方案有两个缺点。
1) 这个字符串会多次存储在内存中。
2) 如果我们想改变错误的输出,我们将不得不在整个程序中改变这一行,这是相当不方便的

对于这种情况,需要程序。
带有过程的程序可能如下所示:
  def printError(): # 过程描述 打印(“错误”) ... printError() # 开始执行程序。 # 只需指定我们要执行的过程的名称 ... 打印错误()
需要记住!
  1. 过程以单词def 开始(来自英文-define -定义)。 在过程名称之后,写上空括号和冒号.参数可以在括号内指定(我们稍后会讲到)。
  2. 过程中执行的所有语句都是缩进的。 
  3. 要执行一个过程,您需要在主程序中按名称调用它并记住写括号
  4. 您可以根据需要多次调用程序中的过程。

参数和参数

现在让我们想象一下,我们需要显示不同的消息来响应用户的错误,这取决于他犯了什么样的错误。
在这种情况下,您可以为每个错误编写自己的过程:   <前> 定义 printErrorZero(): 打印(“错误。除以零!”) <前> 定义打印错误输入(): print("输入错误!")
如果有更多可能的错误怎么办?这个解决方案不适合我们!
我们需要学习如何通过告诉程序显示什么错误信息来控制程序。
为此,我们需要将参数写在过程名称后的括号中 <前> def 打印错误: 打印(“s”)
在此过程中,s 是一个参数 - 一个允许您控制过程的特殊变量。
 
参数是一个变量,决定子程序如何工作。参数名称在子例程标头中以逗号分隔。


现在,在调用该过程时,您需要在括号中指明将分配给我们过程中的参数(变量 s)的实际值 <前> printError("错误!除以零!")
这样的值称为参数。
 
参数是调用子程序时传递给子程序的参数值。

参数不仅可以是常量值,还可以是变量或算术表达式。

局部变量和全局变量

在主程序中引入的变量称为全局(或共享)。

您可以从任何子例程访问全局变量。 

通常需要引入仅在子程序中使用的附加变量。此类变量称为本地(或本地)。您只能在创建它们的子例程中使用它们。其余例程对它们一无所知。

因此,可以将变量的作用域(scope)限制在真正需要它的子程序中。在编程中,这种技术被称为封装  - 隐藏变量不被外部更改。

分析三个程序: <头> <正文>


 

描述 程序
1) 在这个程序中,变量i 是本地的。如果主程序中没有i变量,那么我们会得到一个错误信息。而如果有这样一个变量(那么它就是一个全局变量),那么它的值就会显示在屏幕上。 <前> 定义测试(): 打印(i)
2) 这里即使有全局变量i,也会新建一个局部变量i,值为2,2会出现在屏幕。 <前> 定义测试():  我 = 2 打印(i)
3) 在这个程序中,有一个全局变量i,值为15。它的值可以在子程序内部改变,为此需要显式声明它是全局的(使用命令 global )。
该过程将使用全局变量 i 并将为其分配一个新值 2。显示值 2。
<前> 定义测试():   全球我 我 = 2 # 主程序 我 = 15 打印(i)