Python'da in: Üyelik Operatörü Açıklandı

Python'un in operatörünü listeler, demetler, dizeler, kümeler ve sözlüklerde üyelik testi için nasıl kullanacağınızı öğrenin. Sözdizimi örnekleri, performans ipuçları ve en iyi uygulamalar dahil.

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
Çıktı:
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
Çıktı:
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)
Çıktı:
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
Çıktı:
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
Çıktı:
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")
Çıktı:
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)
Çıktı:
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
Çıktı:
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
Çıktı:
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
Çıktı:
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
Çıktı:
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")
Çıktı:
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")
Çıktı:
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']
Çıktı:
['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!

Hazır
main.py
Çıktı Konsolu 0 ms
// 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.