functioin

函数

作用域规则

       Python定义了3个命名空间,分别是局部local、全局global和内建built-in命名空间。程序视图访问标识符的值时,python会按照特定顺序搜索命名空间(即局部、全局和内建命名空间),检查是否存在标识符,以及它的具体位置。

递归与重复

l  递归和重复都建立在一个控制结构的基础上。

l  重复使用的是重复结构,比如forwhile

l  递归使用选择结构,比如ifif/else

l  无论重复还是递归,实际都牵涉到重复性操作。区别在于:

n  重复是显式使用一个重复结构;

n  递归则是进行重复的函数调用;

l  两者都要进行终止测试:

n  重复会在循环继续条件为false时终止;

n  递归在识别出基本条件时终止;

l  由计数器控制的重复和递归都是逐渐终止:

n  重复会不断修改一个计数器,直到计数器的值使循环继续条件编程false

n  递归则不断对原始问题进行简化,直到抵达基本条件;

l  重复和递归都可能无休止地进行。

 

l  递归有很多缺点:它采用重复调用机制,不断产生函数调用开销,这不仅浪费处理器处理时间,还会占用大量内存。每次递归调用都会导致创建另一个函数拷贝(事实只是函数的变量),这会占用大量内存;

 

l  重复通常在函数内部发生,所以能忽略重复函数调用和额外内存分配的开销。

 

PS:一个由多个函数构成的程序与没有任何函数的一体式程序相比,会产生大量的函数调用,这些调用会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。

默认参数

       定义函数时,可以将一个或多个参数指定为默认参数,并可为其指定一个默认值。默认参数主要是为了提供方便,调用函数时,可以指定较少的参数数量。但是要注意,默认参数必须位于任何非默认参数的右边。调用有两个或更多默认参数的函数时,如果省略的参数不在参数列表最右边,那就必须省略它之后的所有参数。

比如:

       def box(length = 1, width = 1, height = 1):

              return length * width * height

关键字参数

       程序员可要求函数接收一个或多个关键字参数。函数定义为每个关键字指派一个默认值。函数即可使用关键字的默认值,也可在函数调用中为关键字指派一个新值(格式为keyword=value)。使用关键字参数时,参数在函数调用中的位置不必与它的函数定义中的位置一一对应。

 

functioin

函数

作用域规则

       Python定义了3个命名空间,分别是局部local、全局global和内建built-in命名空间。程序视图访问标识符的值时,python会按照特定顺序搜索命名空间(即局部、全局和内建命名空间),检查是否存在标识符,以及它的具体位置。

递归与重复

l  递归和重复都建立在一个控制结构的基础上。

l  重复使用的是重复结构,比如forwhile

l  递归使用选择结构,比如ifif/else

l  无论重复还是递归,实际都牵涉到重复性操作。区别在于:

n  重复是显式使用一个重复结构;

n  递归则是进行重复的函数调用;

l  两者都要进行终止测试:

n  重复会在循环继续条件为false时终止;

n  递归在识别出基本条件时终止;

l  由计数器控制的重复和递归都是逐渐终止:

n  重复会不断修改一个计数器,直到计数器的值使循环继续条件编程false

n  递归则不断对原始问题进行简化,直到抵达基本条件;

l  重复和递归都可能无休止地进行。

 

l  递归有很多缺点:它采用重复调用机制,不断产生函数调用开销,这不仅浪费处理器处理时间,还会占用大量内存。每次递归调用都会导致创建另一个函数拷贝(事实只是函数的变量),这会占用大量内存;

 

l  重复通常在函数内部发生,所以能忽略重复函数调用和额外内存分配的开销。

 

PS:一个由多个函数构成的程序与没有任何函数的一体式程序相比,会产生大量的函数调用,这些调用会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。

默认参数

       定义函数时,可以将一个或多个参数指定为默认参数,并可为其指定一个默认值。默认参数主要是为了提供方便,调用函数时,可以指定较少的参数数量。但是要注意,默认参数必须位于任何非默认参数的右边。调用有两个或更多默认参数的函数时,如果省略的参数不在参数列表最右边,那就必须省略它之后的所有参数。

比如:

       def box(length = 1, width = 1, height = 1):

              return length * width * height

关键字参数

       程序员可要求函数接收一个或多个关键字参数。函数定义为每个关键字指派一个默认值。函数即可使用关键字的默认值,也可在函数调用中为关键字指派一个新值(格式为keyword=value)。使用关键字参数时,参数在函数调用中的位置不必与它的函数定义中的位置一一对应。

 

the unexpected problem of macro

宏带来的意外

clip_image001

C程序员相对于函数而言更喜欢用宏,因为宏可以让程序员编写出和函数调用一样可读但效率更高的代码,不过,要警惕一些意外情况:

l  虽然宏可能比函数调用执行得快,但是它展开后的代码可能会比函数调用的多几倍,如果你的程序在很多地方扩展宏,这个程序可能大得让你无法想象;

l  宏可能会展开为一个子表达式,但它不像函数调用那样捆绑得那么紧凑;

l  宏展开后,某些参数可能执行了不止一次,或者根本就不执行。一个具有副作用的宏参数会导致意外的发生。

 

脚本和函数的区别

脚本和函数的区别

MATLAB中有一种文件叫M文件,他就是一系列代码组成的一个扩展名为.m的文件,M文件可分为脚本文件MATLAB scripts)和函数文件MATLAB functions)。脚本文件是包含多条MATLAB命令的文件函数文件可以包含输入变量,并把结果传送给输出变量,两者的简要区别如下:
脚本文件
1.多条命令的综合体

2.没有输入、输出变量

3.使用MATLAB基本工作空间

4.没有函数声明行

函数文件

1.常用于扩充MATLAB函数库

2.可以包含输入、输出变量

3.运算中生成的所有变量都存放在函数工作空间

4.包含函数声明行

脚本文件可以理解为简单的M文件,脚本文件中的变量都是全局变量。函数文件是在脚本文件的基础之上多添加了一行函数定义行,其代码组织结构和调用方式与对应的脚本文件截然不同。

函数文件是以函数声明行“function…”作为开始的,其实质就是用户往MATLAB函数库里边添加了子函数,函数文件中的变量都是局部变量,除非使用了特别声明。函数运行完毕之后,其定义的变量将从工作区间中清除。而脚本文件只是将一系列相关的代码结合封装,没有输入参数和 输出参数,即不自带参数,也不一定要返回结果。而多数函数文件一般都有输入和输出变量,并见有返回结果。

创建函数

创建函数

14.1 基本脚本函数

       函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。

14.1.1 创建函数                    

       格式为:

function name

{

       commands

}

或者为:

name()

{

       commands

}

14.2 返回值

       bash shell将函数看作小型脚本,并以退出状态结束。

14.2.1 默认退出状态

       默认情况下,函数的退出状态时函数的最后一条命令返回的退出状态。这是一种比较危险的做法,因为大部分情况下,我们不会再脚本的最后编写函数。而其他语句如果正常执行的话,就不会有提示信息了。

14.2.2 使用return命令

       return命令可以使用单个整数值来定义函数的退出状态,不过要注意两个错误:

l  记住在函数完成后尽快提取返回值;

l  记住退出状态的取值范围为0~255

14.2.3 使用函数输出

       例如一个函数为test,那么可以使用result=`test`来获取任意类型的返回值。

14.3 在函数中使用变量

       默认情况下,脚本中定义的变量都是全局变量,在函数外部定义的变量,在函数内部仍能正常访问。

       在变量前面加上local就能确保变量为局部变量。

14.5 函数递归

       自给(self-containment)是局部函数变量的一个特性。自给函数除了脚本通过命令行传递的变量,不适用函数之外的任何资源。

       这种特性使函数能够以递归方式调用。

14.6 创建库

       在当前文件夹创建一个库,testlib,那么我们在脚本中只需要source ./testlib或者用点好. ./testlib即可导入该库。

14.7 在命令行中使用函数

14.7.1 在命令行创建函数

       如果是一行命令,注意每条命令的结尾必须包含分号,这样shell才知道命令在那里分开;如果是多行命令,则不需要在每条命令的结尾添加分号,只需要按下ENTER键即可。

       注意,如果命令行中创建的函数与内置命令或其他命令同名,那么自定义函数将覆盖原有命令。