NameError: tên 'giảm' không được xác định trong Python


187

Tôi đang sử dụng Python 3.2. Đã thử điều này:

xor = lambda x,y: (x+y)%2
l = reduce(xor, [1,2,3,4])

Và đã nhận được lỗi sau:

l = reduce(xor, [1,2,3,4])
NameError: name 'reduce' is not defined

Đã thử in reducevào bảng điều khiển tương tác - đã gặp lỗi này:

NameError: name 'reduce' is not defined


reducethực sự bị xóa trong Python 3.2? Nếu đó là trường hợp, những gì thay thế?


3
@JBernardo, công cụ phù hợp là gì?
Sergey

Câu trả lời:


280

Nó đã được chuyển đến functools.


49
@ julio.alegria: Vì Guido ghét nó .
Ignacio Vazquez-Abrams

6
Bài viết được tham khảo trong @ IgnacioVazquez-Abrams làm cho một số điểm thực sự tốt về cách hầu hết các trường hợp có thể được viết theo cách dễ đọc hơn. Đối với tôi, đó là bằng văn bản sum(item['key'] for item in list_of_dicts).
Connorbode

194

Bạn có thể thêm

from functools import reduce

trước khi bạn sử dụng giảm.


3
Người dùng trước đó đã trả lời câu hỏi và câu trả lời giống như câu trả lời của anh ta
Kathiravan Natarajan

8

Hoặc nếu bạn sử dụng sáu thư viện

from six.moves import reduce

3

Trong trường hợp này tôi tin rằng sau đây là tương đương:

l = sum([1,2,3,4]) % 2

Vấn đề duy nhất với điều này là nó tạo ra số lượng lớn, nhưng có lẽ điều đó tốt hơn so với các hoạt động modulo lặp đi lặp lại?


Các phép toán modulo lặp đi lặp lại rất hữu ích khi nó giúp giữ số lượng nhỏ. Các số tổng sẽ không tạo ra số lớn trừ khi bạn tổng RẤT NHIỀU số, vì vậy trong trường hợp này sẽ không có ích. Đặc biệt là vì không làm như vậy cho phép sử dụng hàm tổng hợp tích hợp, sẽ chạy nhanh hơn nhiều so với ứng dụng lặp lại của hàm do người dùng xác định
HackerBoss
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.