Değişkenler ve veri türleri
Değişken, sonradan çağırabilmek için bir değere verdiğiniz addır ve o değerin türü onunla ne yapılabileceğini belirler: sayılar toplanır, diziler birleşir, birini diğerine eklemek hata verir. En zor veri türü hataları hata verenler değil, sessizce geçip yanlış bir sayı yazdıranlardır.
- Ders 5 / 14
- Başlangıç
- Ücretsiz, kayıt yok
Her değerin çevresinde dönen beş tür
Tür, değerle ne yapılabileceğini belirler; değerin ne kadar önemli olduğunu değil.
Bu beşi türlerin tamamı değil. Python'da başkaları da var ve daha büyük programlarda kendi türlerinizi kurarsınız; ama ilk aylar neredeyse tümüyle bunlarla geçer.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Değişken tam olarak nedir ve nasıl oluşturulur?
Değişken, bir değere verdiğiniz addır. Hepsi bu. Python'da bir tane oluşturmak tek satırdır ve fazladan bir anahtar kelime istemez:
city = "Tehran"
visits = 1200Artık nerede city yazarsanız Python oraya o diziyi koyar. Eşittir işaretinin burada matematiksel bir anlamı da yoktur; bu ikisi eşittir demez, bu adı o değere iliştir der. Bu yüzden şu satır kodda gayet mantıklı, matematikte anlamsızdır:
visits = visits + 1Yaygın "değişken bir kutudur" benzetmesi bir yere kadar yardım eder, sonra yanıltır. Daha doğrusu: değişken, bir değerin üzerine yapıştırılmış bir etikettir. İki etiket tek bir değerin üzerinde durabilir ve bu dersin beşinci bölümünde gerçek bir tuzak kuran şey budur.
İlk günden işi kolaylaştıran üç adlandırma kuralı. Adı bir harfle başlatın ve içine boşluk koymayın; yerine alt çizgi kullanın, total_price gibi. Daha az yazmak için adı kısaltmayın, çünkü üç hafta sonra tp size bile bilmece olur. Ve program Türkçe olsa bile adları İngilizce yazın, çünkü okuyacağınız diğer kodlar böyle yazılmıştır.
Gündelik işi gören beş tür
Sayfanın üstündeki şekil beş türü tek bir merkezin çevresine diziyor ve o merkez değerin kendisi. Başka dillerde daha çok tür vardır, ama ilk aylarınızda işin neredeyse tamamını bu beşi görür.
price = 120000
rate = 1.09
name = "Sara"
is_paid = True
items = ["pen", "book"]
user = {"name": "Sara", "city": "Tehran"}Tam sayı ve ondalık iki ayrı türdür ve bu ayrım sonradan hakkını verir. Dizi metindir ve hep tırnak içinde durur. Boolean'ın yalnızca iki değeri vardır, True ve False, ve her koşulun kalbidir. Liste birkaç değeri sırayla tutar ve onlara numarayla ulaşırsınız. Sözlük ise değerleri numarayla değil anahtarla tutar; yani "üçüncüsü" yerine "şehir" dersiniz.
print(items[0])
print(user["city"])Sayma sıfırdan başlar, yani items[0] ilk üyedir. Bu, ilk ay sizi birkaç kez rahatsız edip sonra sıradanlaşan şeylerden biridir.
Elinizde ne olduğunu bilmiyorsanız Python'un kendisine sorun. type fonksiyonu yanıtlar ve bu ders boyunca temel aracımızdır:
print(type(price))
print(type(name))
Yaş artı bir neden hata verir?
Bu, herkesin veri türleriyle ilk gerçek karşılaşmasıdır ve neredeyse her zaman input ile başlar. Şunu çalıştırın:
age = "17"
print(type(age))
print(age + 1)İkinci satır <class 'str'> yazar, üçüncüsü programı devirir. İşte tam mesaj; çalıştırdığımızda aldığımızın aynısı:
TypeError: can only concatenate str (not "int") to strÇevirisi: artı işareti iki dizi arasında birleştirmek, iki sayı arasında toplamak demektir; ama bir dizi ile bir sayı arasında hiçbir anlama gelmez ve Python hangisini istediğinizi tahmin etmez. Çözüm tek kelime:
age = "17"
print(int(age) + 1)Çıktı 18. int diziyi tam sayıya, float ondalığa çevirir; str ters yöne gider. Üç fonksiyon ve dönüşüm işinin yüzde doksanı bunlarla yapılır.
Sonradan koşullarda işinize yarayacak bir nokta: Python'da bir dizi ile bir sayı, birbirine benzeseler bile eşit değildir. "7" == 7 ifadesi False döner. Doğru olması gerektiğinden emin olduğunuz bir koşul doğru çıkmadıysa, önce buna bakın.
Bir de dönüşüm uyarısı: int("abc") hata verir ve bu doğru davranıştır. Birinin bu hatayı boş bir try ile susturduğunu görürseniz, program artık çökmez ama o andan sonra sessizce yanlış veri üretir, ki bu daha kötüdür.
Kullanıcının yazdığı metinden hesap yapabileceğiniz sayıya
Üçüncü adımı programcı yazar; yazmazsa program dördüncüde devrilir.
-
1
Girdi gelir
Kullanıcı sayı yazsa bile her zaman bir dizidir.
-
2
Karar: bu ne olmalı?
Posta kodu dizi kalır, yaş sayı olur. Hangisi olduğunu yalnızca siz bilirsiniz.
-
3
int ya da float ile dönüştürün
Tek kelime ve yeni başlayanların çoğunun atladığı kelime bu.
-
4
Artık hesap yapılabilir
Buradan sonra artı işareti birleştirmek değil toplamak demektir.
Dizi hiç sayı değilse dönüşüm üçüncü adımda hata verir ve bu doğrudur. Onu susturmak, yanlış veriyi dördüncü adıma göndermek demektir.
İki ondalığı toplamak neden beklediğinizi vermez?
Şunu çalıştırın ve çıktıya bakın:
print(0.1 + 0.2)0.30000000000000004 yazar. Bu bir Python hatası değil; JavaScript, PHP ve neredeyse her dil aynısını yapar. Nedeni, bilgisayarın ondalıkları iki tabanında tutması ve bazı kesirlerin iki tabanında bitmemesidir; tıpkı üçte birin on tabanında bitmediği gibi. Python'un kendi belgeleri buna bütün bir sayfa ayırır.
Gösterim için çözüm basit:
print(round(0.1 + 0.2, 2))Bu 0.3 yazar. Ama yalnızca gösterimi düzeltir ve para için yetmez.
Para kuralını burada öğrenin, çünkü yeni bir geliştiricinin yazdığı en pahalı hatalar bu aileden gelir: parayı ondalıkta tutmayın. İki doğru yolunuz var. Biri her şeyi en küçük birimde tam sayı olarak tutmak. Diğeri tam bunun için var olan decimal modülü.
Biz birinci yolu seçtik ve bu görülebiliyor. Bu sitedeki fiyatlar dolardan tomana çevrilir ve aynı satırda sonuç en yakın bin tomana yuvarlanıp tam sayıya dönüştürülür. Bu yüzden sitedeki hiçbir fiyatın ondalık kısmı yoktur; daha derli toplu göründüğü için değil, tomanın kesri diye bir şey gerçekte olmadığı ve onu taşıyan her sayının er ya da geç bir toplamada kendini gösterdiği için.
Liste mi sözlük mü: hangisi nereye?
Kural tek cümlede: şeyler aynı cinstense ve sıraları önemliyse liste; her birinin bir adı varsa ve onu adıyla çağırıyorsanız sözlük. Aşağıdaki şekil bunu iki sütuna koyuyor ve sütunlardan biri diğerinden iyi değil.
Ama listelerde, bu dersteki her şeyden çok insanı şaşırtan bir tuzak var. Değişkenin kutu değil etiket olduğunu söylemiştik, hatırlıyor musunuz? Bundan çıkan sonuç şu:
a = [1, 2]
b = a
b.append(3)
print(a)Çıktı [1, 2] değil, [1, 2, 3]. b'ye bir şey ekledik ve a da değişti; çünkü iki ad tek bir listeye yapışmış ve ikinci bir liste hiç oluşturulmamıştı. Gerçekten ayrı bir kopya istiyorsanız bunu söylemeniz gerekir:
c = a.copy()
c.append(4)
print(a, c)Bu [1, 2, 3] [1, 2, 3, 4] yazar. Artık ikisi ayrı şeylerdir.
Bu neden önemli? Çünkü daha büyük programlarda bir listeyi bir fonksiyona verirsiniz, fonksiyon onu değiştirir ve siz kendi kopyanızın el değmemiş olduğunu sanırsınız. Bu hata vermez ve hiçbir şey devrilmez; verileriniz yalnızca sessizce değişir. Diziler ve sayılar böyle davranmaz; tuzağın yalnızca liste ve sözlüklerde çıkmasının nedeni budur.
Liste ve sözlük, iki farklı iş
Biri diğerinden iyi değil; soru, şeylerinizin adı mı numarası mı olduğu.
Liste
- Aynı cinsten şeyler: adlar, fiyatlar, dosyalar
- Sıranın anlamı vardır ve korunur
- Onları numarayla çağırırsınız ve sayma sıfırdan başlar
- "Hepsini teker teker al" için yapılmıştır
Sözlük
- Her birinin kendi adı olan farklı şeyler
- Sıra önemli değil; anahtar önemli
- Onları anahtarla çağırırsınız: şehir ya da fiyat gibi
- "Bir şeyin özellikleri" için yapılmıştır
İkisi de değiştirilebilir; bu yüzden tek değere iki etiket tuzağı ikisi için de geçerlidir ve kopyalama ikisinde de açıkça yapılmalıdır.
Tür yanlışken hiçbir hata görünmediğinde
Buraya kadar her tür hatası ses çıkardı. Şimdi hiç ses çıkarmayan ve tam bu yüzden daha pahalı olan aileye gelelim. Bu siteden iki örnek; ikisi de kendi kodumuzda denetlenebilir.
Birincisi. Bu öğrenme bölümündeki her metnin dört dilli bir dizi, yani dört anahtarlı bir veri yapısı olması gerekir. Bir keresinde bu sitenin yapay zeka bölümünde, dizi yerine düz bir karakter dizisi yazılmıştı. Hiçbir şey hata vermedi; karakter dizisi de bir değerdir ve yazılır. Sonuç, İngilizce sayfanın Farsça metin yazmasıydı. Hata değerde değil, türdeydi. Artık bu bölümün doğrulayıcısı yayımdan önce tam bunu denetliyor ve bir karakter dizisi gördüğünde dört dilli bir dizi gerektiğini söyleyip aldığı türü bildiriyor.
İkincisi daha öğretici. Bu sitenin teması tablolardaki sayısal sütunları çubuklara çevirir ve bunun için metinde yazılı bir sayıyı okuması gerekir. İlk kural, virgülün binlik ayırıcı olduğuydu. Türkçe sayfada "2,6 MB" yirmi altı, "yüzde 80,6" ise sekiz yüz altı oldu ve sayfanın kendi yazdığının sekiz katı uzunlukta bir çubuk çizildi. Nedeni bizim varsayımımızdı: Türkçe binlikte noktayı, ondalıkta virgülü kullanır; Farsça ve İngilizcenin tam tersi.
Sonunda seçilen çözüm dili sormaz; grupların büyüklüğüne bakar. Tam üç basamaklı grup binliktir, başka her şey ondalıktır; tek istisnayla: sıfırla başlayan sayı her zaman ondalıktır. Burada önemli olan, bu iki hatadan hiçbirinin hata vermemesidir. Program mutlu mesut çalışıyor ve yanlış bir sayı yazıyordu.
İkisinden çıkardığımız ve size aktardığımız ders: türü sınırda denetleyin, yani verinin programa girdiği yerde. Kullanıcı girdisi, okuduğunuz bir dosya, bir servisten aldığınız yanıt. Türü orada denetlemezseniz yanlış veri programın derinlerine yolculuk eder ve o noktada nereden geldiğini kimse söyleyemez.
Yapay zekayla hızlı yol
Veri türlerinin gerçekten zaman yediği yer gerçek bir dosyadır: dışa aktarılmış bir tablo, bir CSV, bir servisten dönen bir yanıt. Hızlı yol, modelin verinizi temizlemesi değildir; çünkü görmediği veriyi temizleyemez. Hızlı yol ondan bir tür haritası almak, sonra o haritayı kıran değerlerin listesini almak ve o listeyi tüm dosya üzerinde kendiniz denemektir. Bunun için hızlı ve ucuz bir model yeter; güncel tercihimiz <a class="text-link" href="/tr/ai/">yapay zeka bölümünde</a>.
- Kendi verinizden beş gerçek satır yapıştırın, tarifini değil. Tarif dosyada olduğunu sandığınız şeydir; satır ise gerçekten orada olandır.
- Her sütun için türü ve tam dönüşümü, gerekçesiyle isteyin. Gerekçenin zayıf olduğu yer, genellikle yanlış bir varsayımın yaşadığı yerdir.
- Her dönüşümü kıran değerlerin listesini isteyin: boş, Latin olmayan rakamlar, ondalık virgül, baştaki sıfır, negatif sayı, fazladan boşluk.
- Dönüşümü tüm dosyada çalıştırın ve başarısızlıkları sayın. İlk beş satıra göz atmak, Türkçe tabloda yaptığımızın aynısıdır ve sonuç sekiz kat yanlış çıktı.
Kopyalamaya hazır şablon
Bunlar dosyamdan bes gercek satir, dokunulmamis:
{basliklariyla bes gercek satir}
Bu veri su is icin kullanilacak: {ne yapmak istediginiz}.
Uc sey ver, yalnizca bu ucu:
1. Tur tablosu: her sutun icin onerilen tur, tam donusum fonksiyonu ve tek
cumlelik gerekce. Hangi sutunlarin metin kalmasi gerektigini ve nedenini
acikca yaz.
2. Her sutun icin donusumunu kiran degerler. En azindan sunlari kapsa: bos
hucre, Latin olmayan rakamlar, ondalik ayirici olarak virgul, bastaki sifir,
negatif sayi ve basta ve sonda fazladan bosluk.
3. Basarisiz oldugunda hata veren ve satiri yazan donusum kodu. Hatayi bos bir
try ile yutma ve bozuk verinin yerine varsayilan bir deger koyma.
Virgulun binlik ayirici oldugunu varsayma. Emin degilsen sor.
Çıktıya güvenmeden önce: Model beş satır gördü, elli bin değil. Bozukluklar tam da yapıştırmadığınız satırlarda yaşar; yani bu alıştırmanın sonucu bir harita, bir garanti değil. Asla yapmamanız gereken iki şey: temizleme kodunu asıl dosyada çalıştırmayın, bir kopyada çalıştırın ve öncesi ile sonrasındaki satır sayısını karşılaştırın; size verilen kod hataları yutup varsayılan bir değer koyuyorsa bunu değiştirin. Hata veren bir bug bir saate, sessizce yanlış sayı üreten bir bug aylara mal olur.
Bu işte yapay zeka
Veri türlerinde bir modelin yaptığı en iyi şey, bir hata mesajını kendi kelimelerinize çevirmek ve kodunuzu kıran değerleri bulmaktır. En kötü yaptığı şey ise siz bakmıyorken verinizi sessizce dönüştürmektir. Tutumumuz da bunu izler: dönüşüm sizin kodunuzda ve gözünüzün önünde olmalı, yapıştırdığınız bir yanıtın içinde değil.
Gerçekten işe yarayan araçlar
- Claude "Bu hata ne demek" sorusunda ve bir dönüşümü kıran değerlerin listesini kurmakta iyidir. İran, Anthropic'in desteklenen ülkeler listesinde yok; bunu Anthropic'in kendi sayfasında okuduk.
- Gemini Farsçayı iyi anlar; veriniz Farsçaysa ve Farsça rakamlar taşıyorsa sorunu ona anlatmak kolaylaşır. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor; İran o listede yok.
- ChatGPT En yaygın seçim ve bu iş için kabul edilebilir. Yapay zeka bölümümüzde henüz bir sayfası yok; bu yüzden erişimi ya da fiyatı hakkında burada bir iddiada bulunmuyoruz.
Nerede geri teper
Model yanıtlarında, bu dersin uyardığı şeyin tam olarak aynısını üreten bir alışkanlık var: dönüşümü bir try içine sarar ve başarısız olduğunda genellikle sıfır olan bir varsayılan döndürür. Program artık hata vermez ve siz memnun olursunuz; ama o andan itibaren dosyanızdaki her bozuk satır bir sıfıra dönüşüp nihai toplamda yerini almıştır. Bu bölümden tek bir kural taşıyacaksanız şu olsun: isteminize, başarısızlıkta hata vermesi ve satırı yazması gerektiğini yazın. İkinci risk yerel varsayım: aksini söylemedikçe model genellikle İngilizce kuralı alır ve virgülü binlik ayırıcı okur; kendi Türkçe tablomuzda sekiz kat hata üreten varsayımın aynısı. Verinizin dilini ve sayı biçimini açıkça yazın. Üçüncü risk erişim: İran, Anthropic'in iki desteklenen ülke listesinde de yok ve Google'ın Gemini ülke listesinde de yok; ikisini de üreticilerin kendi sayfalarında okuduk ve etrafından dolaşma yolları önermiyoruz.
Kaynaklar: Python docs: built-in types Anthropic: supported countries Google: where Gemini Apps are available
Bu tavsiyenin sınırı
Python türleri çalışma zamanında denetler; yani bir türü yanlış aldığınızı çalıştırmadan önce hiçbir şey size söylemez. Statik türlü diller bunu daha erken yakalar ve bu, bu dersin yeri olmayan gerçek bir farktır. Üç şey de bilerek burada değil: sınıflar ve kendi kurduğunuz türler, decimal modülünün ayrıntıları ve kendi kuralları olan veritabanı türleri. Bir de unutulan bir nokta: türleri bilmek yanlış veriyi önlemez. Onu önleyen tek şey, programı üç örnek satırda değil gerçek veride çalıştırmaktır.
Kendi işimizden
Bu sitedeki sayısal tablo sütunları ilk kez çubuklara çevrildiğinde deneme Core Web Vitals tablosuna denk geldi ve sonucu bugünün dersi oldu. Tek bir sütunda "2,5 saniye", "200 milisaniye" ve "0,1" yan yanaydı. Kod sayıları doğru okumuştu, ama çubuklar INP'nin LCP'nin seksen katı olduğunu söylüyordu; o sayfanın hiç kurmadığı bir cümle. Sorun tür değil birimdi: 2,5 ile 200 ikisi de sayıdır ve birimleri aynı olmadıkça karşılaştırılamazlar. Sonrasında koyduğumuz kural hâlâ yerinde duruyor: bir sütun ancak tüm hücrelerinin artakalan metni, yani birimi, tam olarak aynıysa çubuk alır. Birimi olmayan bir sayı henüz eksiksiz bir değer değildir.
Gerçek devam soruları
Bir değişkenin içinde ne olduğunu nasıl anlarım?
print(type(x)) türünü, print(x) ise şeyin kendisini gösterir. Kuşkulandığınız her yere bu iki satırı ekleyin, sonra silin; Python'daki en basit ve en çok kullanılan hata ayıklama aracı budur. Sayı beklerken yanıt <class 'str'> ise sorunu tam orada bulmuşsunuz demektir.
Python türü kendi buluyor, o zaman neden umursayayım?
Çünkü bulur ama nöbet tutmaz. Python türü değeri oluşturduğunuz anda bilir; yine de program çalışana kadar hiçbir şey size yanlış aldığınızı söylemez. Yani hata çalışma zamanında gelir, genellikle gerçek bir kullanıcı gerçek veri girdiğinde. Bu yüzden türü girdi sınırında denetlemek dilin değil sizin işinizdir.
Tür ipuçlarını hemen öğrenmeli miyim?
İlk günlerde değil. Tür ipuçları büyük kodda ve takım çalışmasında hakkını verir; yirmi satırlık bir programa bir şey katmaz. Yanlış bir beklentiye girmemek için şunu bilin: Python'un kendi belgeleri, çalışma zamanının bu açıklamaları dayatmadığını ve tür denetleyicileri gibi dış araçların onları kullandığını söyler. age: int yazmak bir dizinin gelmesini engellemez.