Python'da and ve or sıkıntısı

Nedenini bilmiyorum fakat and ve or bende çalışmıyor. Büyük ihtimalle sorun bende çünkü daha yeni başladım. Bu konuda yardım edebilir misiniz?

Şu an egzersiz niyetine gerçekten basit bir sohbet robotu yapmaya çalışıyorum. Mesela 1 veya a tuşlandığında bla bla olsun istiyorum. Fakat or bu işi yapamıyor. Başka yerlerde de bu sorunla karşılaştım. Kod aşağıda.

while True:
time.sleep(1)
print("""\nBeni artık aşağıdakilere uyarak istediğin şekilde kullanabilirsin.
1. Ne hissettiğini yazmak için a tuşla.
2. Sana daha sonra hatırlatmamı istediğin şeyleri yazmak için b tuşla.
3. Günlük tutmak ve eski yazdıklarının okumak için c tuşla.
4. Bana yeni şeyler öğretmek için d tuşla (ben sana nasıl olacağını anlatacağım.)
5. Benle konuşmak ve yeni cümleler öğretmek için e tuşla.
6. Bilgilerini görmek için f tuşla.
7. Programı baştan başlatmak için x tuşla.
8. Programı istediğin süreliğine durdurmak için z tuşla.
9. Programı kapatmak ve ilerlemeni sıfırlamak için q tuşla.
""")
c = input("Ne yapmak istersin?")
if c == "a" and "1":
    while True:
        print("Son yazdığını görmek için 1, yeni yazmak için 2 tuşla...")
        c_a = input()
        if c_a == "1":
            print(c_b)
            break
        elif c_a == "2":
            print("Bana nasıl hissettiğini yaz. Veya başka bir şey. Her ikisi de insanı rahatlatır.")
            c_b = input()
            print("yazdıkların kaydedildi",a,". İstediğin zaman gelip bakabilirsin.")
            break
        else:
            print("Bu geçerli bir sayı değil.")
elif c == "b" and "2":
    print("Kaydettiğin notlar:",notlar[::-1],sep="\n")
    while True:
        c_c = input("Yeni not gir. Yeni not yazmak istemiyorsan y tuşla.")
        if c_c == "y":
            break
        else:
            notlar.append(c_c)
            print("Yeni notunuz eklenmiştir.")

bunun sebebi andi yanlış kullanmanız
şu kodda hata var

if  c == "a" and "1":

onun yerine

if c == "a" or c == "1":
3 Beğeni

Şu şekilde de çözebilirsiniz:

if c in ["b", "1"]:
3 Beğeni

Evet or’u and yapmam kodu buraya geçirirken olmuş. Ama asıl sorunu anladım. Çok teşekkür ederim.

Olmasını istediğiniz şeyin ne olduğunu tam anlayamadım ancak sanıyorum ki Türkçe düşündüğünüz için bir sorun yaşadınız.

if x == y and z:
 ...

Burayı sanırım “x değişkeni, y ve z değikenine eşitse …”
Diye algılıyorsunuz.
Ancak hayır. Böyle olabilmesi için

if x == y and x == z:
...

Şeklinde yazılmalı.


if x:
 ...

Yazarsanız, eğer değişken True bir değer içeriyorsa True döndürür, içermiyorsa False döndürür.
Mesela x değikeninin 0’a eşit olduğunu düşünün.

x = 0
if x: 
 print("if çalıştı")
else:
 print("else çalıştı")

Python’da 0 sayısı False bir değer olduğu için burada if bloğu çalışmaz. Çünkü if bloklarının çalışabilmesi için koşulların True döndürmesi lazım.


x == y and z:
... 

Kodunda da benzer bir durum oluyor.
x, y’ye eşitse ve z True” ise demek oluyor bu.
xin, y ve z’ye eşit olup olmadığının sorgulanması için:

if x == y and a == z:

yazılması lazım.
Çünkü mantıksal bağlaçların olduğu koşullar baştan sona doğru sırasyla şu şekilde okunuyor:

x == y              and              z:
#True döndü   # mantıksal bağlaç   # Barındırdığı değere göre bir boolean değer döndürecek

Mesela siz burayı muhtemelen şöyle düşündünüz.

c değişkeni, "a" ve "1" stringine eşitse..
Ama aslında orası şu demek:
c değişkeni, "a" stringine eşitse ve "1" stringi True döndürüyorsa...

ve bu iki anlam birbirinden o kadar farklı ki …
Hadi bu anlamları karşılaştıralım.
c değişkeninde kullanıcıdan bir veri alıyorsunuz. Kullanıcı veriyi girdikten sonra bir koşul yazıyorsunuz. Bu koşulun çalışması için gereken durumu da, kullanıcının girdiği verinin "a" ve "1" stringi ile eşleşmesi olarak belirliyorsunuz. Pekala. Buraya kadar her şey çok güzel.

Fakat, koşulun çalışması için belirlediğiniz durumu böyle belirttiğiniz zaman amacınızla aynı yönde bir işlev gerçekleşmiyor:

if c == "a" and "1":
 ...

Siz " c değişkeni, "a" ve "b" stringlerine eşitse … " diye düşünüyorken, orada bu oluyor:
" c değişkeni, "a" stringine eşitse ve "1" stringi True ise …"
Şimdi bu iki anlamı işleyişleri bakımından karşılaştıralım:


if c == "a" and "1":
 ...

ifadesine bakalım öncelikle:
Mesela kullanıcıdan a verisini alıyorsunuz. input fonksiyonu string döndürdüğü için c değişkenimiz "a" karakter dizisine eşit oluyor.
Sonrasında c değişkeninin "a" stringine eşit olduğu doğrulanıyor ve mantıksal bağlacımız andin sorguladığı iki ifadeden biri True dönmüş oluyor. Eğer ikinci ifade de True döndürürse artık if bloğumuz çalışabilir. "1" stringi True döndürdüğünden dolayı ikinci ifade de True oluyor ve artık if bloğu çalışmaya hazır.

Şimdi de

if c == "a" and c == "1":
 ...

ifadesine bakalım.
Yine kullanıcıdan a verisi aldık. input fonksiyonu string döndürdüğü için c değişkenimiz "a" stringine eşit oluyor tekrardan.
Sonra tam olarak koşulumuza bakıyoruz. and bağlacının ilk ifadesi olan c == "a" True döndürüyor çünkü zaten c değişkenimiz "a" stringine eşit. Sonrasında and bağlacımızın ikinci ifadesi olan c == "1" False dönüyor çünkü c değişkenimiz "1" stringine eşit değil …


Son olarak karşılaştırmayı özetle şöyle göstereyim: (kullanıcının “a” girdiğini varsayın yine)

if c == "a" and "1":
c == "a"      and             "1"
# True  # Mantıksal Bağlaç  # True (çünkü "1" stringi True'dur ...)


if c == "a" and c == "1":
c == "a"        and                    c == "1"
# True   # Mantıksal Bağlaç       # False
5 Beğeni

Bu arada bu aşağı yukarı her zaman False değil mi

4 Beğeni
>>> class C:
...     def __eq__(self, other):
...         return True
...
>>> c = C()
>>> c == "a" and c == "1"
True
>>>

Tabii kim, niye böyle bir şey yapar bilmiyorum.

3 Beğeni

Bu ifadende veya ifadesini kullanıyorsun ama bunu koda dökünce and yani ve ifadesini kullanıyorsun.

ilk olarak burada and işlecinin kullanımı yanlış.
doğrusu bu şekilde olmalı:

if c == "a" and c == "1":

Ancak burada da mantıksal hata var. Bir değişkenin iki değeri olamaz. Dolayısıyla bu sorgu her zaman False döndürür. Türkçe olarak ifade edersem daha iyi anlarsın:

eğer c eşitse "a"ya ve c eşitse "1"e

Doğrusu şu şekilde olmalı:

eğer c eşitse "a"ya veya c eşitse "1"e

if c == "a" or c == "1"

Zaten kendin de başta bunu belirtmişsin

orada zaten or kullanıyordum. Buraya soru sormadan önce kendi kendime denemeler yaparken and olarak çıkmış. Biri daha bu konuya değinmiş orada da söylemiştim. Ama asıl ihtiyacım olan söylediğin

ilk olarak burada and işlecinin kullanımı yanlış.
doğrusu bu şekilde olmalı:

if c == "a" and c == "1":

kısmı idi. Bu konuda teşekkür ediyorum. Orayı değiştirdim zaten şu an

Konunuzla alakalı olup en işinize yaradığını düşündüğünüz yanıtı çözüm olarak işaretlemeyi unutmazsanız sizinle aynı konuyu araştıran bir başka birisine aradığı cevabı bulmaya çalıştığı süreçte zaman tasarrufu sağlamış olursunuz :slight_smile: