2013-09-23 46 views

Trả lời

28

Liệu Python có một cú pháp đóng cửa/lambda đẹp và ngắn cho nó?

Có, nhưng bạn không muốn trong trường hợp này.

Tương đương gần nhất với mã Ruby:

new_values = map(print, [1, 2, 3]) 

Điều đó có vẻ khá thoải mái khi bạn đã có một chức năng nằm xung quanh, giống như print. Khi bạn chỉ có một số biểu hiện độc đoán và bạn muốn sử dụng nó trong map, bạn cần phải tạo một hàm ra khỏi nó với một def hoặc một lambda, như thế này:

new_values = map(lambda x: print(x), [1, 2, 3]) 

Đó là sự xấu xí bạn dường như muốn tránh . Và Python có một cách tốt đẹp để tránh nó: comprehensions:

new_values = [print(x) for x in values] 

Tuy nhiên, trong trường hợp này, bạn chỉ cần cố gắng để thực hiện một số tuyên bố cho mỗi giá trị, không tích lũy các giá trị mới cho mỗi giá trị. Vì vậy, trong khi điều này sẽ làm việc (bạn sẽ nhận được một danh sách các giá trị None), nó chắc chắn không phải là thành ngữ.

Trong trường hợp này, điều phải làm là để viết nó một cách rõ ràng-no đóng cửa, không có chức năng, không có comprehensions, chỉ cần một vòng lặp:

for x in values: 
    print x 
+0

Đây có lẽ là câu trả lời tốt nhất và đầy đủ nhất vì nó thực sự giải quyết các vấn đề của lambdas được nêu trong câu hỏi mà câu trả lời của tôi không. +1 – Shashank

+1

Cảm ơn. Bạn nhấn mọi điểm tôi đã tự hỏi. – BuddyJoe

+0

Có lẽ đáng để chỉ ra rằng các ví dụ cụ thể của tôi chỉ hoạt động trong Python 3.x (hoặc, trong 2.6-2.7, nếu bạn thực hiện 'from __future__ import print_function'); có lẽ tôi nên sử dụng 'sys.stdout.write' hoặc thứ gì đó tương tự như' puts' thay vì 'print' để tránh điều này ... Nhưng nếu bạn hiểu mọi thứ, tôi đoán nó đủ tốt rồi. – abarnert

12

Các thành ngữ nhất:

for x in [1,2,3]: 
    print x 
2

Bạn có thể sử dụng NumPy cho số học vectorized trên một mảng:

>>> import numpy as np 
>>> a = np.array([1, 2, 3]) 
>>> a * 3 
array([3, 6, 9]) 

Bạn có thể dễ dàng xác định một lambda có thể được sử dụng trên mỗi phần tử của một mảng:

>>> array_lambda=np.vectorize(lambda x: x * x) 
>>> array_lambda([1, 2, 3]) 
array([1, 4, 9]) 

Nhưng như những người khác đã nói, nếu bạn muốn chỉ in mỗi, sử dụng một vòng lặp.

0

Ngoài ra còn có các thư viện bao bọc các đối tượng để hiển thị tất cả các công cụ lập trình chức năng thông thường.

Ví dụ: pydash cho phép bạn làm những việc như thế này:

>>> from pydash import py_ 
>>> from __future__ import print_function 
>>> x = py_([1,2,3,4]).map(lambda x: x*2).each(print).value() 
2 
4 
6 
8 
>>> x 
[2, 4, 6, 8] 

(Chỉ cần luôn luôn ghi nhớ để "kích hoạt" thực hiện và/hoặc để bỏ quấn các giá trị được bao bọc bởi .value() ở cuối!)

+0

Cá nhân tôi thích viết mã như thế này là nó đọc từ trái qua phải. Việc theo dõi luồng dữ liệu/giá trị dễ dàng hơn. –