Skip to content

Commit d6e7af9

Browse files
authored
练习下函数式编程的返回函数
1 parent 62b7d90 commit d6e7af9

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

test11.py

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# 练习下函数式编程的返回函数
2+
3+
4+
# 在python中,函数可以当返回值返回
5+
def func(*args):
6+
# 求可变参数的和
7+
def fun():
8+
sum = 0
9+
for n in args:
10+
sum += n
11+
return sum
12+
return fun
13+
14+
15+
# 上述的就是闭包,闭包中内层函数可以使用外层函数的变量
16+
sum = func(*[1, 3, 5, 7, 9])
17+
print(sum) # 可以看出返回了一个函数,内层函数
18+
print(sum()) # 若要输出结果就是加个小括号就可,这种是惰性求和
19+
20+
21+
# 但是在使用循环变量时
22+
def f1():
23+
fs = []
24+
for x in range(1, 4):
25+
def f2():
26+
return x*x
27+
fs.append(f2)
28+
return fs
29+
30+
31+
# 上面利用循环返回了一个存有三个函数的列表,现在一一复制看结果
32+
n1, n2, n3 = f1()
33+
# 可以看出,结果都是三,并不是想象中的1,4,9
34+
# 这是因为我们在使用闭包时,内层函数的变量指向了循环变量,而函数并不是立即执行,当循环完后,循环变量就变了,这时再执行函数就会产生意想不到的结果
35+
# 所以在使用闭包时记得尽量不要使用循环变量
36+
print(n1())
37+
print(n2())
38+
print(n3())
39+
40+
41+
# 若一定要使用循环变量,就是在内层函数在定义一个函数来绑定循环变量让他不再可变
42+
def f1():
43+
def f2(i):
44+
def f3():
45+
return i*i
46+
return f3
47+
fs = []
48+
for x in range(1, 4):
49+
fs.append(f2(x))
50+
51+
return fs
52+
53+
54+
# 现在就可以了使用循环变量了
55+
n1, n2, n3 = f1()
56+
print(n1())
57+
print(n2())
58+
print(n3())
59+
60+
61+
# 闭包还可以这样玩,用闭包来求泛型函数
62+
def line(a, b):
63+
# 内层函数也加了个参数
64+
def aline(x):
65+
return a*x + b
66+
return aline
67+
68+
69+
l1 = line(2,3)
70+
l2 = line(5,6)
71+
# 求值时因为内层函数需要传参数,所以这里也需要传参数
72+
print(l1(3))
73+
print(l2(8))
74+
75+
76+
# 作业:利用闭包返回一个计数器函数,每次调用它返回递增整数
77+
def create_count():
78+
# 将变量n设为全局变量
79+
global n
80+
n = 0
81+
82+
def counter():
83+
# 将变量n设为全局变量
84+
global n
85+
n += 1
86+
return n
87+
return counter
88+
89+
90+
counter = create_count()
91+
print(counter(), counter(), counter(), counter(), counter())
92+
countera = create_count()
93+
print(countera(), countera(), countera(), countera(), countera())
94+

0 commit comments

Comments
 (0)