Yanıtlar:
Her python konteyneri C için beklenti şudur:
for item in C:
assert item in C
gayet iyi geçecek - bir duygunun olması şaşırtıcı değil mi?in
(döngü maddesinde) diğer (varlığı kontrol) den tamamen farklı bir anlamı vardı? Elbette isterim! Doğal olarak listeler, setler, tuplelar vb. İçin bu şekilde çalışır.
Öyleyse, C
sözlük olduğunda , bir döngüde in
anahtar / değer demetleri verecek olsaydı for
, o zaman, en az şaşkınlık ilkesine göre in
, kapsama kontrolünde sol taraftaki işleneni olarak böyle bir demeti de almak zorunda kalırdı.
Bu ne kadar yararlı olur? Oldukça yararsız gerçekten, temelde yapım if (key, value) in C
için eşanlamlısını if C.get(key) == value
Ben gerçekleştirilen veya gerçekleştirmek istediği bulunduğuna inanıyoruz çek olan 100 kat daha nadiren olandan - if k in C
aslında araçlar anahtarın varlığını kontrol sadece ve tamamen değerini görmezden.
Öte yandan, sadece tuşlar üzerinde döngü yapmak istemek oldukça yaygındır, örneğin:
for k in thedict:
thedict[k] += 1
değere sahip olmak özellikle yardımcı olmaz:
for k, v in thedict.items():
thedict[k] = v + 1
aslında biraz daha az açık ve daha az özlü. ( items
Anahtar / değer çiftlerini elde etmek için kullanılacak "uygun" yöntemlerin orijinal yazılışı olduğunu unutmayın : ne yazık ki bu, bu tür erişimcilerin tam listeleri döndürdüğü günlerdeydi, bu nedenle "yalnızca yinelemeyi" desteklemek için alternatif bir yazımın tanıtılması gerekiyordu ve iteritems
öyleydi - önceki Python sürümleriyle geriye dönük uyumluluk kısıtlamalarının çok zayıfladığı Python 3'te, items
yeniden oldu ).
Tahminim: Tam demeti kullanmak döngü için daha sezgisel olurdu, ancak üyelik kullanımı için test etmek için belki daha az in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Hem anahtarı hem de değeri belirtmeniz gerekse bu kod gerçekten işe yaramazdı in
. Hem anahtar hem de değerin sözlükte olup olmadığını kontrol edeceğiniz kullanım durumunu hayal etmekte zorlanıyorum. Yalnızca anahtarları test etmek çok daha doğaldır.
# When would you ever write a condition like this?
if (key, value) in dict:
Artık in
operatörün ve for ... in
aynı öğeler üzerinde çalışması gerekli değildir . Uygulama açısından farklı işlemlerdir ( __contains__
vs. __iter__
). Ancak bu küçük tutarsızlık biraz kafa karıştırıcı ve tutarsız olacaktır.
x in foo
yalnızcai
içindefor i in foo
değerini varsayarx
bir noktada, ben çok olacağını söyleyebilirim büyük tutarsızlık.