返回函数,是把函数作为结果值返回(return )的高阶函数。
如例子中的非立即求和函数lazy_sum:
lazy_sum的定义中又定义了sum这个函数,对比两次return,sum返回的是值,lazy_sum返回的是sum函数(*args,应是表示数组参数)。在这其中有一个停顿,当调用lazy_sum时,先得到返回值函数。当要出现具体数值时,以sum对应的函数形式获得,如lay_sum(1,3,5,7,9)()【形如sum()】,得到的是具体数值25。
既然调用lazy_sum时就返回到了sum,如果直接输入sum(),却会出现错误,这样是因为sum作为内部函数,引用了外部函数的参数和部分变量,最后返回得到sum时,相关的参数和变量都保存在了这个特定的①sum函数中,这种程序结构称为“闭包(Closure)”
①特定的sum指的是,每次调用lazy_sum时,即使传入的参数一样,那返回得到的sum也是不相同的。
返回一个函数时,该函数并未执行。在循环中,如果返回函数中引用了任何可能会变化的变量,则这个返回函数可能会只引用这个变量的最后一次值。
如例子中的,i是count()的变量,最后的结果是3,到后面传入返回值f的时候,函数f还没有被调用,只是作为函数保存到了fs这个list中,当要调用f()的时候,因为定义中包含了i,此时f要引用i才能输出值,而显然i的最后值是3,所以f()相当于引用了i=3。
如,这一个是上例的改良的函数,其中第一层函数先执行,返回一个list:fs=[f(1),f(2),f(3)];因为第一层中添加的返回值是f(i),因此f(i)此时就被立刻执行了,并且以j=i的形式将值都一一传入了f(j)中;第三层函数的g()引用了f(j)的j,而此时的j是有具体值的,所以g()的所引用的变量是固定的,因此也就可以返回想要的到的值。
range(x,y),当x<y ∈Z时,指的是从x开始(y-x)个整数(正负均可)组成的list,这个从x开始,一直到y的前一个,恰好不包括y; 当x=0<y时,即range(y),可直接认为前y个自然数组成的list;
上面定义函数count()的例子中,因为count()的值是一个list,可以用f1,f2,f3=count()来取出元素的值,如:
网友评论