Câu trả lời:
Đối với mỗi container python C, kỳ vọng là
for item in C:
assert item in C
sẽ vượt qua tốt - sẽ không bạn tìm thấy nó đáng ngạc nhiên nếu một cảm giác in
(mệnh đề loop) có một ý nghĩa hoàn toàn khác nhau từ khác (kiểm tra sự hiện diện)? Tôi chắc chắn sẽ! Nó tự nhiên hoạt động theo cách đó cho danh sách, bộ, bộ, ...
Vì vậy, khi C
là một từ điển, nếu in
để tạo ra các bộ khóa / giá trị trong một for
vòng lặp, thì theo nguyên tắc ít ngạc nhiên nhất, in
cũng sẽ phải lấy một bộ dữ liệu như là toán hạng bên trái của nó trong kiểm tra ngăn chặn.
Điều đó hữu ích như thế nào? Khá vô dụng thực sự, về cơ bản làm cho if (key, value) in C
một từ đồng nghĩa với if C.get(key) == value
- đó là một tấm séc Tôi tin rằng tôi có thể thực hiện, hoặc muốn thực hiện, hiếm khi hơn 100 lần so với những gì if k in C
thực sự có nghĩa là , kiểm tra sự hiện diện của chìa khóa duy nhất và hoàn toàn bỏ qua các giá trị.
Mặt khác, muốn lặp chỉ trên các phím là khá phổ biến, ví dụ:
for k in thedict:
thedict[k] += 1
có giá trị cũng không giúp được gì đặc biệt:
for k, v in thedict.items():
thedict[k] = v + 1
thực sự có phần ít rõ ràng và ít súc tích hơn. (Lưu ý rằng items
là cách viết ban đầu của phương pháp "hợp lý" để sử dụng để có được chìa khóa / cặp giá trị: không may đó là trở lại trong những ngày khi accessors như trở lại toàn bộ danh sách, như vậy để hỗ trợ "chỉ lặp lại" cách viết khác đã được giới thiệu và iteritems
đó là - trong Python 3, trong đó các ràng buộc tương thích ngược với các phiên bản Python trước đó đã bị suy yếu rất nhiều, nó đã trở items
lại).
Tôi đoán: Sử dụng bộ dữ liệu đầy đủ sẽ trực quan hơn cho việc lặp, nhưng có lẽ ít hơn để kiểm tra tư cách thành viên in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Mã đó sẽ không thực sự hoạt động nếu bạn phải chỉ định cả khóa và giá trị cho in
. Tôi đang gặp khó khăn khi tưởng tượng trường hợp sử dụng trong đó bạn sẽ kiểm tra xem cả khóa VÀ giá trị có trong từ điển hay không. Nó là tự nhiên hơn nhiều để chỉ kiểm tra các phím.
# When would you ever write a condition like this?
if (key, value) in dict:
Bây giờ không cần thiết phải in
vận hành và for ... in
vận hành trên cùng một mặt hàng. Thực hiện khôn ngoan họ là các hoạt động khác nhau ( __contains__
so với __iter__
). Nhưng sự không nhất quán nhỏ đó sẽ hơi khó hiểu và, tốt, không nhất quán.
x in foo
chỉ khii
trongfor i in foo
giả định giá trị củax
tại một số điểm, tôi sẽ nói rằng nó sẽ là một rất lớn mâu thuẫn.