in operatörü, bir liste, demet, dize, küme veya sözlük gibi bir koleksiyonda bir değerin var olup olmadığını kontrol eden Python'unüyelik operatörüdür. Değer bulunursa True, aksi takdirde False döndürür. Bu operatör üyelik testlerini temiz ve okunabilir hale getirir.
in operatörü ne yapar?
in operatörü birüyelik testi gerçekleştirir: bir koleksiyon içinde belirli bir değeri arar ve bir Boole sonucu döndürür. Temel sözdizimi şudur:
value in collection Burada value aradığınız şeydir ve collection bir liste, demet, dize, küme veya sözlük gibi herhangi bir yinelenebilir nesne olabilir (sözlükler için in varsayılan olarak anahtarları kontrol eder).
in'i listeler ve demetlerle kullanma
Listeler ve demetler in operatörü için en yaygın kullanım durumlarıdır.
Örnek 1: Listelerde üyelik kontrolü
numbers = [1, 2, 3, 4, 5]
print(3 in numbers) # Output: True
print(10 in numbers) # Output: False
print(3 not in numbers) # Output: False True False False
Örnek 2: Demetlerde üyelik kontrolü
coordinates = (10, 20, 30)
print(20 in coordinates) # Output: True
print(50 in coordinates) # Output: False
print(50 not in coordinates) # Output: True True False True
Listeler ve demetler için Python birdoğrusal arama algoritması kullanır, yani bir eşleşme bulana veya sona ulaşana kadar her öğeyi tek tek kontrol eder. Zaman karmaşıklığı O(n)'dir, bu nedenle daha büyük koleksiyonlarda arama daha uzun sürer.
in'i dizelerle kullanma
Dizelerle kullanıldığında, in operatörüalt dize üyeliğini kontrol eder.
Örnek 1: Temel alt dize kontrolü
text = "Hello, World!"
print("World" in text) # Output: True
print("Python" in text) # Output: False
print("hello" in text) # Output: False (case-sensitive) True False False
Örnek 2: Büyük/küçük harf duyarsız kontrol
text = "Hello, World!"
search = "world"
print(search.lower() in text.lower()) # Output: True True
Dize üyelik testleri büyük/küçük harf duyarlıdır. Büyük/küçük harf duyarsız kontroller gerekiyorsa, her iki dizeyi de aynı duruma dönüştürün. Python dizelerindeki alt dize aramaları en kötü durumda O(n) karmaşıklığına sahiptir.
in'i kümelerle kullanma
Kümeler üyelik testleri için optimize edilmiştir. Kümeler dahili olarakhash tabloları kullandığından, in operatörünün ortalama zaman karmaşıklığı O(1)'dir.
Örnek 1: Hızlı üyelik kontrolü
allowed_users = {"alice", "bob", "charlie"}
print("alice" in allowed_users) # Output: True
print("dave" in allowed_users) # Output: False True False
Örnek 2: Performans optimizasyonu
# Slow for large lists
users = ["alice", "bob", "charlie"]
if "alice" in users:
print("Found")
# Fast - convert to set first
users_set = set(users)
if "alice" in users_set:
print("Found") Found Found
Birçok üyelik kontrolü yapmanız gerekiyorsa, önce bir listeyi kümeye dönüştürmek performansı önemli ölçüde artırabilir.
in'i sözlüklerle kullanma
Bir sözlükle in kullandığınızda, bir anahtarın var olup olmadığını kontrol eder (değerler değil).
Örnek 1: Anahtarları kontrol etme
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
print("alice" in user_ages) # Output: True
print("dave" in user_ages) # Output: False
print(30 in user_ages) # Output: False (30 is a value, not a key) True False False
Örnek 2: Değerleri kontrol etme
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
# Check if a value exists
print(30 in user_ages.values()) # Output: True True
Örnek 3: Anahtar-değer çiftlerini kontrol etme
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
# Check if a key-value pair exists
print(("alice", 30) in user_ages.items()) # Output: True True
Sözlük anahtarları için üyelik testleri, sözlükler hash tabloları kullandığından ortalama olarak O(1)'dir.
not in operatörü
Python ayrıca değerbulunamazsa True döndüren not in operatörünü de sağlar.
Örnek: not in kullanma
numbers = [1, 2, 3, 4, 5]
print(10 not in numbers) # Output: True
print(3 not in numbers) # Output: False True False
Bu, in'in mantıksal olumsuzlamasıdır ve tüm aynı veri türleriyle çalışır.
in'i özel nesnelerle kullanma
Kendi sınıflarınızı oluşturursanız, __contains__() yöntemini uygulayarak bunları in operatörüyle çalışacak şekilde yapabilirsiniz.
Örnek: Özel koleksiyon sınıfı
class MyCollection:
def __init__(self, items):
self.items = items
def __contains__(self, item):
return item in self.items
my_list = MyCollection([1, 2, 3, 4, 5])
print(3 in my_list) # Output: True
print(10 in my_list) # Output: False True False
Sınıfınız __contains__() tanımlamazsa ancak yinelenebilirse (__iter__() uygular), Python üyeliği kontrol etmek için koleksiyon boyunca yinelemeye geri dönecektir.
Performans değerlendirmeleri
in operatörünün performansı veri tipine bağlıdır.
| Veri Tipi | Zaman Karmaşıklığı | Notlar |
|---|---|---|
| List | O(n) | Linear search |
| Tuple | O(n) | Linear search |
| String | O(n) | Substring search |
| Set | O(1) average | Hash-based lookup |
| Dictionary | O(1) average | Hash-based lookup (keys only) |
Büyük koleksiyonlarda sık üyelik kontrolleri için listeler veya demetler yerine kümeler veya sözlükleri tercih edin.
Yaygın kullanım durumları
Kullanım Durumu 1: Kullanıcı izinlerini kontrol etme
admin_users = {"alice", "bob"}
if current_user in admin_users:
print("Access granted")
else:
print("Access denied") Access granted
Kullanım Durumu 2: Girdi doğrulama
valid_options = ["yes", "no", "maybe"]
user_input = input("Enter your choice: ")
if user_input in valid_options:
print("Valid choice")
else:
print("Invalid choice") Valid choice
Kullanım Durumu 3: Veri filtreleme
exclude_words = {"the", "is", "at", "which", "on"}
words = ["the", "quick", "brown", "fox"]
filtered = [word for word in words if word not in exclude_words]
print(filtered) # Output: ['quick', 'brown', 'fox'] ['quick', 'brown', 'fox']
Yaygın hatalar ve en iyi uygulamalar
Hata 1: Aralık kontrolleri için in kullanma
# Not recommended for performance-critical code
if 5 in range(1, 10):
print("In range")
# Better: Use comparison operators
if 1 <= 5 < 10:
print("In range") Performans kritik kodda if 5 in range(1, 10): gibi sayısal aralık kontrolleri için inkullanmayın; bunun yerine karşılaştırma operatörlerini kullanın: if 1 <= 5 < 10:.
Uygulama 1: Sık kontroller için listeleri kümeye dönüştürme
# When checking membership in large lists repeatedly
large_list = [1, 2, 3, ...] # Many items
# Convert to set for faster lookups
large_set = set(large_list)
if item in large_set:
print("Found") Büyük listelerde üyelik tekrar tekrar kontrol edilirken, çok daha hızlı aramalar için önce listeyi kümeye dönüştürün.
Uygulama 2: Sözlük davranışını hatırlama
user_data = {"name": "Alice", "age": 30}
# in checks keys, not values
print("name" in user_data) # True
print("Alice" in user_data) # False
# To check values, use .values()
print("Alice" in user_data.values()) # True in'in sözlüklerdeanahtarları kontrol ettiğini, değerleri değil, unutmayın. Değerleri veya anahtar-değer çiftlerini kontrol etmeniz gerekiyorsa .values() veya .items() kullanın.
Uygulama 3: Dizelerde büyük/küçük harf duyarlılığı
text = "Hello, World!"
# Case-sensitive check
print("hello" in text) # False
# Case-insensitive check
print("hello".lower() in text.lower()) # True in ile dize üyelik testleri büyük/küçük harf duyarlıdır; gerekirse durumu normalize edin.
Kendiniz Deneyin
Aşağıdaki kodu değiştirerek öğrendiklerinizi uygulayın. Farklı çıktılar görmek için değerleri ve koşulları değiştirmeyi deneyin!
// Sonuçları görmek için "Kodu Çalıştır"a tıklayın
İlgili Konular
Sıkça Sorulan Sorular
Python'da 'in' ve '==' arasındaki fark nedir?
in operatörü bir değerin bir koleksiyonda var olup olmadığını kontrol eder (üyelik testi), == ise iki değerin eşit olup olmadığını kontrol eder. Örneğin, 3 in [1, 2, 3] True döndürür (üyelik), [1, 2, 3] == [1, 2, 3] ise True döndürür (eşitlik).
'in' sözlüklerde anahtarları mı yoksa değerleri mi kontrol eder?
in operatörü varsayılan olarak sözlüklerdeanahtarları kontrol eder. Değerleri kontrol etmek için value in dict.values() kullanın. Anahtar-değer çiftlerini kontrol etmek için (key, value) in dict.items() kullanın.
'in' dizeleri kontrol ederken büyük/küçük harf duyarlı mı?
Evet, in operatörü dizeleri kontrol ederken büyük/küçük harf duyarlıdır. "hello" in "Hello, World!" False döndürür. Büyük/küçük harf duyarsız kontroller için her iki dizeyi de aynı duruma dönüştürün: "hello".lower() in "Hello, World!".lower().
Bir listede 'in' kontrolü ile bir kümede 'in' kontrolü arasındaki performans farkı nedir?
Bir listede üyelik kontrolü O(n) zaman karmaşıklığına sahiptir (doğrusal arama), bir kümede kontrol ise ortalama O(1) zaman karmaşıklığına sahiptir (hash tabanlı arama). Büyük koleksiyonlarda sık üyelik kontrolleri için daha iyi performans için kümeleri kullanın.
'in'i özel sınıflarla kullanabilir miyim?
Evet, __contains__() yöntemini uygulayarak özel sınıfları in operatörüyle çalışacak şekilde yapabilirsiniz. Sınıfınız yinelenebilirse (__iter__() uygular), __contains__() tanımlanmamışsa Python yinelemeye geri dönecektir.
'in' ve 'not in' arasındaki fark nedir?
in operatörü bir değer bir koleksiyonda bulunursa True döndürür, not in ise bir değerbulunamazsa True döndürür. not in not (value in collection) ile eşdeğerdir.