python返回函数/函数编程

先贴出几段代码


def count():
     fs = []
     for i in range(1,4):
             def f():
                     return i * i
             fs.append(f)
     return fs
 
f1, f2, f3 = count()


def count():
     fs = []
     for i in range(1,4):
             j = i
             def f():
                     return j * j
             fs.append(f)
     return fs
 
f1,f2,f3 = count()

def count():
     fs = []
     for i in range(1,4):
             def f(j):
                     def k():
                             return j * j
                     return k
             fs.append(f(i))
     return fs
 
f1,f2,f3 = count()

结果就不给答案了,不会可以动手试下。但是为什么会产生这样的结果呢?(⊙v⊙)嗯~答案在于迭代。前面那两个代码段的迭代由于创建的新函数都是引用其父函数的变量(暂时认为是父函数吧,因为我也不知道该叫什么),而父函数的变量由于循环而不断的更新其值,所以才导致结果都为一样。父函数的循环以及新创建的子函数并不是串行执行的,而是异步的。

在golang中也有这样的一段代码

s := []int{1,2,3}
for _, i := range s {
	go func(){
		println(i)
	}()
}
time.Sleep(5000)

执行的结果为

3
3
3

这个是因为range的速度远远比新开出来的goroutine执行的速度开,从而导致每个goroutine使用的变量i 的值都为3

解决方法

s := []int{1,2,3}
for _, i := range s {
	go func(j int){
		println(j)
	}(i)
}
time.Sleep(5000)



总结:在函数编程的时候特别需要注意的函数的执行顺序。尽量少引用父函数的变量。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值