Là giải pháp thay thế, bạn có thể sử dụng chức năng một phần:
>>> bases = [(lambda i: lambda x: x**i)(i) for i in range(3)]
>>> print([b(5) for b in bases])
[1, 5, 25]
Ưu điểm duy nhất của xây dựng mà so với giải pháp cổ điển do @unutbu là theo cách đó, bạn không thể giới thiệu các lỗi lén lút bằng cách gọi chức năng của bạn với sai số đối số:
>>> print([b(5, 8) for b in bases])
# ^^^
# oups
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: <lambda>() takes 1 positional argument but 2 were given
Như đề xuất của Adam Smith trong một bình luận dưới đây, thay vì sử dụng "lambda lồng nhau" bạn có thể sử dụng functools.partial
với cùng một lợi ích:
>>> import functools
>>> bases = [functools.partial(lambda i,x: x**i,i) for i in range(3)]
>>> print([b(5) for b in bases])
[1, 5, 25]
>>> print([b(5, 8) for b in bases])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: <lambda>() takes 2 positional arguments but 3 were given
Nguồn
2015-02-01 22:12:53
Bạn có thể thấy hữu ích này: [Ghi chú: Python, Phạm vi, và đóng cửa] (http://eev.ee/blog/2011/04/24/gotcha-python-scoping-closures/) – unutbu
unutbu : Bất kỳ ý tưởng về cách làm cho nó hoạt động? – L3viathan
Có thể những gì bạn muốn là 'base = lambda x: [x ** i cho i trong phạm vi (3)]'? – user3467349