函数团段位
函数的参数和返回值可以是任意类型的对象,这就意*着函数本身也可以作为函数的参数或返回值,这就是所谓的高阶函数。**函数代码块以def关键词开头,后接函数标识*名称和圆括号()任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数函数的第一行语句可以选择性地使用文档字*串(用于存放函数说明)函数内容以冒号起始,并且缩进***********结束函数,选择性地返回一个值给调用方。不带表达式的******相当于返回None。**编程将一个问题分解成一系列函数,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。函数式编程还具有一个特点:允许把函数本身作为参数传入另一个函数,还允许返回一个函数。**函数与指针如果想要在函数内部修改外部变量的值,需要把变量的地址作为参数传递给函数一维数组作为函数的参数会被编译器优化成指针变量同理,二维数组作为函数参数会被优化成一维指针变量函数不要返回局部变量的地址,因为局部变量会在函数调用完后被释放**前面我们讲到了关于函数的知识,我们还讲到过Python中常用的数据类型,这些类型的变量都可以作为函数的参数或返回值,用好函数还可以让我们做更多的事情。**函数的一等公民,可以当做类型、函数参数、返回值等,支持面向函数编程。每个函数都是一个由函数的参数值类型和返回值类型组成的类型。**Swift允许我们像用其它类型比如字*串型、整数型那样使用函数。这意*着我们可以创建一个函数,然后把它赋值给一个变量,通过调用那个变量来调用函数,甚至把这个函数作为参数传入另外一个函数。**函数对象也可以作为参数传递给函数,还可以作为函数的返回值。参数为函数对象的函数或返回函数对象的函数称为高阶函数,即函数的函数。**用new调用一个函数,这个函数就被称为构造函数,任何函数都可以是构造函数,只需要用new调用它顾名思义,构造函数用来构造新对象,它内部的语句将**对象添*若干属性和方法,完成对象的初始化构造函数必须使用new关键字调用,否则不能正常工作,因此,开发者约定构造函数命名时***要大写**形式参数:在定义函数时,函数名后面括号中的参数就是形式参数。实际参数:在调用函数时,函数名后面括号中的参数称为实际参数,也就是函数的调用者给函数的参数。**函数的返回值是函数执行完成后,系统根据函数的具体定义返回给外部调用者的值。在实际开发中,有时不仅仅要执行某个函数的功能,而且还需要把该函数的执行结果作为其他函数或功能的计算单元。所以,函数返回值是非常有用的在Python语言中,当函数运行到******语句时即执行完毕,同时将结果返回。因此,可以在函数内部通过条件判断和循环设置实现较复杂的逻辑,并返回预期的结果。如果没有******语句,函数体内所有语句执行完毕后默认返回None。****函数的柯里化:**通过函数调用继续返回函数的方式,实现多次接受参数最后统一处理的函数编码形式,比如下面**工厂模式,工厂模式的主要工作原理是用函数来封装创建对象的细节,从而通过调用函数来达到复用的目的。构造函数模式原型模式构造函数模式*原型模式,这是创建自定义类型的最常见方式。动态原型模式寄生构造函数模式**形参:形参是定义函数时的占位*,是函数中用于接收输入值的变量。形参的作用是允许函数在不同的调用中接收不同的输入值。可以通过函数的参数列表来定义形参。实参:实参是调用函数时传递给函数的实际输入值,可以是常量、变量或表达式。实参的作用是为形参提供具体的输入值,使得函数能够处理相应的任务。**说明,匿名函数的函数名就是等号左边的变量名,调用时,使用小括号把自变量输入(如果有多个自变量使用逗号分开)。**函数能提高应用的模块性,和代码的重复利用率。一个函数通常被定义来使用一些称为参数的变量接受一些输入,并且它可能会产生一些结果,也称为返回值。我们使用关键字def*函数名以及所有输入参数来定义一个函数。**返回一个组合函数,参数before函数的返回值作为实参,赋值给当前函数的参数,当前函数的返回类型是组合函数的返回类型。**什么是闭包:闭包是函数本身和该函数声明时所处的环境状态的组合,函数能够“记忆住”其定义所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处的环境变量**注:注意其书写形式,函数重载真正执行的是同名函数最后定义的函数体在最后一个函数体定义之前全都属于函数类型定义不能写具体的函数实现方法只能定义类型**最简单的方式就是直接调用函数g,但这种方式有一个明显的缺点,必须知道函数g的名称“g”以及函数g的参数类型。但是若f只需要g的处理结果就可以了,而g的处理结果不一定是由函数g来完成,它也可以是x、y或其他函数来完成,那么这种直接调用函数的方式就无法胜任了,因为系统不知道用户会使用哪个函数来完成这种处理结果,也就是系统不知道调用的函数名究竟是g、x或其他名称。**原型对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个实例对象后,在这个对象的内部将包含一个指针(proto),这个指针指向构造函数的原型对象,在ES5中这个指针被称为对象的原型。**当一个函数接受另一个函数作为参数时,“外部”函数显然需要适当地应用所提供的函数。考虑一下清单9-9中的代码,我们将一个函数提供给另一个函数。**这声明了一个静态数据,如果是在任何函数体外声明,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在函数名前*上static,则表示此函数只能在当前文件中被调用。**应用场景:函数在执行时,要带上所有必要的参数进行调用,但是有的参数可以在函数被调用之前提前获知,这种情况下,提前获知的函数参数可以提前用上,以便函数能用更少的参数进行调用。**Python的函数除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。**调用函数传递的参数个数一定要跟函数定义的参数个数一致,位置要保持一致,顺序要保持一致,否则会报错注意函数体里面参数的类型,要输入正确的参数类型,否则会报错函数的形式参数和实际参数要配对,一一对应函数调用后,如果有变量,那其实就是给变量赋值**如果一个函数调用返回了闭包引用了修改了全局变量,则每次调用都会影响全局变量。同一个函数返回的多个闭包共享该函数的局部变量。**定义:主要以图形的方式表现程序的内部结构(例如函数调用关系图、函数内部控制流图);通过应用程序各函数之间的调用关系展示了系统的结构,列出所有函数,用连线表示调用关系和作用。**看看在清单9-11中,我们如何使用funb->来指定我们想要创建一个接受一个参数的函数,我们将其称为b。由于这是add定义中的最后一个表达式,因此返回的就是这个新创建的函数。还要*******的类型签名与清单9-1中的相同。这证明了我之前说过的:你可以认为一个有两个参数的函数实际上只接受一个参数,并返回一个本身需要剩下参数的函数。**函数可以接受其他函数作为参数。利用这一点来创建漂亮的、解耦的代码。请记住,您可以选择是使用类型提示指定传入函数的签名,还是允许类型推断根据其使用方式推断其签名。**给一个代码块起一个名字,即为函数,随后你可随心所欲,反复运行它。启动运行这些函数代码,我们成为“函数调用”。