Functional and List Comprehensions and Iterator

1. 將數列 a, b, c 對應的值相加

 

>>> a = range(0, 10)
>>> b = range(10,20)
>>> c = range(20,30)

#有時候像filter/map/reduce這樣的"老資格"配合lambda用起來還是挺舒服滴
>>> map(lambda x,y,z: x+y+z, a,b,c) 
[30, 33, 36, 39, 42, 45, 48, 51, 54, 57]

#此處用List Comprehensions 就沒那麼方便啦
>>> [a[i]+b[i]+c[i] for i in range(len(a))] 
[30, 33, 36, 39, 42, 45, 48, 51, 54, 57]

 

 

2. 將數表中值相加取和(ps. Python 本身就內置了這樣的 sum 函數):

>>> mysum = lambda l: reduce(lambda x,y: x+y, l)
>>> mysum(range(100)
4950

 

 

3. 矩陣變換

 

>>> mat = [
...        [1, 2, 3],
...        [4, 5, 6],
...        [7, 8, 9],
...       ]

# List Comprehensions 最直接
>>> [[row[i] for row in mat] for i in [0, 1, 2]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# Functional 也還行
>>> map(lambda i: map(lambda row: row[i], mat), [0, 1, 2])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# 也可以用內置的zip函數,不過返回的是list of tuple(這種構造便於作迭代)
>>> zip(*mat)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

 

#例1用外部迭代器比較好,像Ruby這種採用內部迭代器的語言表達起來不方便
#要麼就學習LP採用“原始”的方法:
out = []
a.each_with_index { |x, i| out << x+b[i]+c[i] }

#例2Ruby可以用open class和inject來完成
class Array
  def sum
    inject(nil) { |s, x| s ? s+x : x }
  end
end
>>> (1..99).to_a.sum
4950

#例3,Ruby卻能完全勝任
>>> (0..2).map { |i| mat.map { |row| row[i] } }
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章