Nếu bạn muốn viết biểu thức chức năng tốt (sử dụng lambda
s, map
, reduce
, filter
và vv), bạn nên tránh tác dụng phụ.
Tôi rất muốn mã của bạn như một hàm thay vì một lambda có các tác dụng phụ.
Đây là một thực hiện sideeffect miễn phí trong biểu một lambda:
>>> from functools import reduce
>>> (lambda x, y: reduce(lambda a, b: \
... (a[0]+2*b, a[1][:a[1].index(b)]+a[1][a[1].index(b)+1:]) if b in a[1] \
... else (a[0]+b, a[1]), x, ('',y))[0])('onomatopoeia', ['o','a','o'])
'oonoomaatopoeia'
Tôi sợ nó không ngắn cũng không đẹp cũng không dễ hiểu * như người ta sẽ muốn nó được cho một lambda. :/
(hy vọng ai đó có thể đề xuất cải tiến)
Chỉ cần một ví dụ phản biện để ngăn cản việc sử dụng lambda trong ngữ cảnh này.
IMHO vấn đề lớn nhất với lambdas trong python là không có cú pháp where
như trong tiêu chuẩn ML để xác định bí danh biến trong cùng một biểu thức. Vì vậy, mọi thứ trở nên xấu xí khá nhanh chóng cho bất kỳ điều gì không tầm thường.
Nếu bạn muốn hiểu ý nghĩa của nó, ý tưởng là sử dụng giảm để chạy một automata, kết quả (ở mỗi bước) là "trạng thái" của tính toán.
"trạng thái" ban đầu là ('', ['o','a','o'])
và chức năng giảm sẽ thực hiện thay thế nếu cần, bắt đầu từ 'onomatopoeia'
.
Đây là sự tiến hóa của "nhà nước":
('', ['o','a','o']) 'o'
('oo', ['a','o']) 'n'
('oon', ['a','o']) 'o'
('oonoo', ['a']) 'm'
('oonoom', ['a']) 'a'
('oonoomaa', []) 't'
('oonoomaat', []) 'o'
('oonoomaato', []) 'p'
('oonoomaatop', []) 'o'
('oonoomaatopo', []) 'e'
('oonoomaatopoe', []) 'i'
('oonoomaatopoei', []) 'a'
('oonoomaatopoeia', [])
và chúng tôi chỉ mất yếu tố đầu tiên của nhà nước cuối cùng.
giá trị của 'x' và' y' là gì? –
Tôi tin rằng lambdas được cố tình giới hạn ở một dòng để cải thiện khả năng đọc và rõ ràng. Bạn có thể thử chuyển đổi hàm đó thành lambda, nhưng đó là một chút phản kháng. – J0HN
'eval' yêu cầu một biểu thức, trong khi' y.remove (i); i * 2' là một câu lệnh. 'eval ('1; 1')' cũng tạo ra 'SyntaxError'. – nymk