Bạn có quen thuộc với các ngôn ngữ chức năng khác? tức là bạn đang cố gắng học cách python lập trình chức năng, hay bạn đang cố gắng học về lập trình chức năng và sử dụng python làm phương tiện?
Ngoài ra, bạn có hiểu danh sách hiểu?
map(f, sequence)
tương đương trực tiếp (*) với:
[f(x) for x in sequence]
Trên thực tế, tôi nghĩ map()
đã từng được dự kiến loại bỏ khỏi python 3.0 là dư thừa (điều đó đã không xảy ra).
map(f, sequence1, sequence2)
hầu hết tương đương với:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(có một sự khác biệt trong cách xử lý trường hợp các chuỗi có độ dài khác nhau. Như bạn đã thấy, map()
điền vào Không khi một trong các chuỗi hết, trong khi zip()
dừng khi chuỗi ngắn nhất dừng lại)
Vì vậy, để giải quyết câu hỏi cụ thể của bạn, bạn đang cố gắng tạo ra kết quả:
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Bạn có thể làm điều này bằng cách viết một hàm lấy một đối số và in nó, theo sau là các thanh:
def maptest(x):
print x, bars
map(maptest, foos)
Ngoài ra, bạn có thể tạo một danh sách giống như thế này:
[bars, bars, bars, ] # etc.
và sử dụng maptest ban đầu của bạn:
def maptest(x, y):
print x, y
Một cách để làm điều này là xây dựng danh sách trước một cách rõ ràng:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Ngoài ra, bạn có thể kéo itertools
mô-đun. itertools
chứa nhiều chức năng thông minh giúp bạn thực hiện lập trình đánh giá lười biếng theo kiểu chức năng trong python. Trong trường hợp này, chúng tôi muốn itertools.repeat
, nó sẽ đưa ra đối số của nó vô thời hạn khi bạn lặp lại nó. Thực tế cuối cùng này có nghĩa là nếu bạn làm:
map(maptest, foos, itertools.repeat(bars))
bạn sẽ nhận được đầu ra vô tận, vì cứ map()
tiếp tục miễn là một trong các đối số vẫn đang tạo đầu ra. Tuy nhiên, itertools.imap
cũng giống như map()
, nhưng dừng lại ngay khi dừng lặp lại ngắn nhất.
itertools.imap(maptest, foos, itertools.repeat(bars))
Hi vọng điêu nay co ich :-)
(*) Nó hơi khác một chút trong python 3.0. Ở đó, map () về cơ bản trả về một biểu thức trình tạo.