Trong quá trình thực hiện thuật toán "Loại bỏ biến đổi" cho chương trình Bayes 'Nets, tôi đã gặp một lỗi không mong muốn là kết quả của việc chuyển đổi bản đồ lặp lại của một chuỗi các đối tượng.bản đồ so với danh sách; tại sao lại có hành vi khác nhau?
Để đơn giản, tôi sẽ sử dụng một mảnh tương tự như mã ở đây:
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
...
>>> list(nums)
[31, 32, 33]
này chắc chắn là kết quả sai. Vì [4, 5, 6] chứa hai số chẵn, nên thêm 10
vào mỗi phần tử nhiều nhất hai lần. Tôi đã nhận được hành vi bất ngờ với điều này trong thuật toán VE là tốt, vì vậy tôi sửa đổi nó để chuyển đổi các map
iterator đến một list
sau mỗi lần lặp.
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
... nums = list(nums)
...
>>> list(nums)
[21, 22, 23]
Từ sự hiểu biết của tôi về iterables, sửa đổi này không nên thay đổi bất cứ điều gì, nhưng nó làm. Rõ ràng, chuyển đổi n + 10
cho trường hợp not x % 2
được áp dụng ít hơn một lần trong phiên bản list
.
Chương trình Bayes Nets của tôi hoạt động tốt sau khi tìm lỗi này, nhưng tôi đang tìm giải thích là tại sao nó xảy ra.
Vui lòng không viết mã như thế. Nó làm cho bộ não của tôi bị tổn thương. – Kevin
Mã của bạn không làm những gì bạn giải thích nó nên làm. Nếu bạn muốn giữ số nếu chúng là số lẻ và cộng mười nếu chúng là số chẵn, bạn phải đặt 'nums = map (lambda n: n nếu x% 2! = 0 else n + 10, nums)' ... cần phải có một cái gì đó để đánh giá cho hàm if, nếu không nó luôn luôn đánh giá là đúng. BTW. vấn đề với mã không phải là dòng mới, như các chỉnh sửa của bạn đề xuất. Tôi nghĩ, những gì kevin phàn nàn là các dấu chấm và mũi tên ở bên trái. –
Có thể là trong Python3, 'map' là một trình lặp không? – hpaulj