reduce函数是Python内置的高阶函数之一,它在函数式编程中具有重要作用。reduce函数接受两个参数:一个二元操作函数和一个可迭代对象。它对可迭代对象中的元素依次进行二元操作,并返回最终的结果。
from functools import reduce
# 二元操作函数:求两个数的和
def add(x, y):
return x + y
# 要进行操作的可迭代对象
numbers = [1, 2, 3, 4, 5]
# 使用reduce函数求可迭代对象中所有元素的和
result = reduce(add, numbers)
print("Sum of numbers:", result)
# 输出:Sum of numbers: 15
add(x, y)第一次调用的参数是numbers[0]和numbers[1],返回值是add1。add(x, y)第二次调用的参数是上一次的返回值add1和numbers[2],返回值是add2。以此类推。
如果numbers列表中的对象是一维或二维数组,add函数则可以将数组中对应的元素相加。
from functools import reduce
import numpy as np
# 二元操作函数:求两个数的和
def add(x, y):
return x + y
a1 = np.array([ [0,0],[0,1] ])
a2 = np.array([ [1,0],[0,1] ])
a3 = np.array([ [0,0],[1,1] ])
numbers = [a1, a2, a3]
result = reduce(add, numbers)
b1 = np.array( [0,1] )
b2 = np.array( [1,0] )
b3 = np.array( [1,1] )
numbers = [b1, b2, b3]
result = reduce(add, numbers)
这个操作正好用来组装刚度矩阵和整体节点力向量。
map函数也是一个高阶函数,典型的调用方式为
l = [1,2,3,4,5]
a = map( lambda x: x*3, l)
其参数中包含一个函数,一个可迭代对象。若map函数的第二个参数是单元对象的列表,第一个参数(函数)返回一个和整体刚度矩阵大小相同的矩阵,该矩阵的意义是其中一个单元的刚度对整体刚度矩阵的贡献。然后再用reduce函数将这些矩阵各元素分别相加,得到最终的整体刚度矩阵。求整体节点力向量也是同样的思路。
# 单元类
class Element:
pass
e1 = Element()
e2 = Element()
e3 = Element()
e4 = Element()
Elist = [e1,e2,e3,e4]
a = map(assemble_stiffness, Elist )
K = reduce(lambda x,y: x+y, a)
map函数返回的是可迭代对象,具有惰性求值的特征,它会在需要时才计算下一个结果。还有就是其中的元素只能使用一次。
import sys
l1 = [1,2,3,4,5]
a = map( lambda x: x*3, l1)
# lambda函数将列表中的每一个元素乘以3
print( sys.getsizeof(a) )
# 输出的结果是48
l2 = [1,2,3,4,5,7,8,9]
b = map( lambda x: x*3, l2)
print( sys.getsizeof(b) )
# 可迭代列表加长,输出的结果还是48