Ders 4'ün hedefi

Ders 4'ün hedefi: tek isimde transkript ve AGNO transcript ismi (lacivert) tek bir list'i (vişneçürüğü) gösteriyor; list'in içinde beş satır var, her satır bir tuple (mavi-gri): ders kodu str (yeşil), kredi int (turuncu), harf notu str (yeşil). Satırlar: MAT123, 4, C1; FIZ127, 3, B2; TKD103, 2, A2; BBM101, 3, A3; BBM102, 3, B1. List'ten çıkan ok çıktı paneline gidiyor. Çıktı sekiz satır: 4 ders, AGNO: 3.08; Yeni dersin kodu: bbm102; Kredi: üç; Tam sayı girin.; Kredi: 3; Harf notu: b1; 5 ders, son ders BBM102; AGNO: 3.12. Kullanıcının yazdıkları (bbm102, üç, 3, b1) petrol mavisi; son satır AGNO: 3.12 açık mavi, çivit mavisi çerçeveli bir bantla vurgulu. transcript "MAT123" 4 "C1" "FIZ127" 3 "B2" "TKD103" 2 "A2" "BBM101" 3 "A3" "BBM102" 3 "B1" Çıktı 4 ders, AGNO: 3.08 Yeni dersin kodu: bbm102 Kredi: üç Tam sayı girin. Kredi: 3 Harf notu: b1 5 ders, son ders BBM102 AGNO: 3.12
Bu dersin sonunda bütün transkripti tek bir isimde tutup AGNO'yu hesaplayacaksınız.

Ders 4'ün hedef programı


transcript = [
    ("MAT123", 4, "C1"),
    ("FIZ127", 3, "B2"),
    ("TKD103", 2, "A2"),
    ("BBM101", 3, "A3"),
]
print(f"{len(transcript)} ders, AGNO: {gpa(transcript):.2f}")
code = input("Yeni dersin kodu: ").strip().upper()
credits = ask_int("Kredi: ")
letter = input("Harf notu: ").strip().upper()
transcript.append((code, credits, letter))
print(f"{len(transcript)} ders, son ders {transcript[-1][0]}")
print(f"AGNO: {gpa(transcript):.2f}")

Python ne yazdırır?


code = "FIZ127"
print(code[:3], code[-3:], code[1])
      
  1. FIZ1 127 I
  2. FIZ 127 I
  3. FIZ 27 I
  4. FIZ 127 F

4A konuları

  1. 1. List[ ], index, len(), + ve *
  2. 2. List üzerinde for ve split()for, sum(), split()
  3. 3. List'i değiştirmekappend(), remove(), pop(), sort()
  4. 4. Tuple ve unpacking( ), course[0], x, y = (3, 4)
  5. 5. Object, mutable, immutable ve aliasingb = a, copy(), ==, is

1. List

Birçok değeri tek bir isimle tutmak

List (liste)


grades = ["C1", "B2", "A2"]
print(grades)
Genel biçim
<isim> = [<değer>, <değer>, <değer>]
Çıktı
['C1', 'B2', 'A2']

List, birçok değeri sırayla tek bir isim altında tutar.

List: grades = ["C1", "B2", "A2"] grades ismi (lacivert) tek bir list object'ini (vişneçürüğü) gösteriyor; içinde üç str item (yeşil): C1, B2, A2. list durumunda list açık mavi, çivit mavisi çerçeveli bir şeridin içinde ve altında list tipi yazıyor. items durumunda üç hücre tek bir çivit mavisi çerçeve içinde; altındaki köşeli çizgide 3 item, sırası korunur; kutunun üstünde collection, sağında list yazıyor. Sağ altta: Şimdilik değerleri hücrelerin içine yazıyoruz. grades "C1" "B2" "A2" list 3 item, sırası korunur list collection Şimdilik değerleri hücrelerin içine yazıyoruz.

Item (eleman) ve collection (torba)


grades = ["C1", "B2", "A2"]
print(type(grades), len(grades))
Çıktı
<class 'list'> 3
List: grades = ["C1", "B2", "A2"] grades ismi (lacivert) tek bir list object'ini (vişneçürüğü) gösteriyor; içinde üç str item (yeşil): C1, B2, A2. list durumunda list açık mavi, çivit mavisi çerçeveli bir şeridin içinde ve altında list tipi yazıyor. items durumunda üç hücre tek bir çivit mavisi çerçeve içinde; altındaki köşeli çizgide 3 item, sırası korunur; kutunun üstünde collection, sağında list yazıyor. Sağ altta: Şimdilik değerleri hücrelerin içine yazıyoruz. grades "C1" "B2" "A2" list 3 item, sırası korunur list collection Şimdilik değerleri hücrelerin içine yazıyoruz.

List'teki her değer bir item'dır; list bir collection'dır.

List'in kullanım alanları

Ayrı isimler ve tek list Solda kod: mat_grade = "C1", fiz_grade = "B2", tkd_grade = "A2", print(mat_grade, fiz_grade, tkd_grade). Altında Ayrı isimler: üç ayrı isim (lacivert) üç ayrı str değerini (yeşil) gösteriyor, C1, B2, A2; çıktı C1 B2 A2. Dördüncü satır soluk ve kesikli: 40 ders için 40 isim. Sağda kod: grades = ["C1", "B2", "A2"], print(grades, len(grades)). Altında Tek list: tek bir grades ismi tek bir list'i (vişneçürüğü) gösteriyor; list açık mavi, çivit mavisi çerçeveli şeridin içinde vurgulu; altında 40 ders için de tek isim; çıktı ['C1', 'B2', 'A2'] 3. mat_grade = "C1" fiz_grade = "B2" tkd_grade = "A2" print(mat_grade, fiz_grade, tkd_grade) grades = ["C1", "B2", "A2"] print(grades, len(grades)) Ayrı isimler mat_grade "C1" fiz_grade "B2" tkd_grade "A2" ... 40 ders için 40 isim Çıktı C1 B2 A2 Tek list grades "C1" "B2" "A2" 40 ders için de tek isim Çıktı ['C1', 'B2', 'A2'] 3
Üç ders üç isim ister; tek bir list her sayıda notu tutar.

McCarthy ve LISP (1958)

McCarthy ve LISP (1958)
Fotoğraf: Flickr kullanıcısı "null0", “John McCarthy Stanford”, Wikimedia Commons, CC BY-SA 2.0. Boyutu küçültüldü.

McCarthy'nin LISP'inde (LISt Processor) verinin temel biçimi list'ti.

Data types

value
  1. Numbers(sayılar)

    1. Integral

      • int7
      • boolTrue
    2. Real

      • float3.5
  2. Sequences(diziler)

      • str"7"
      • rangerange(3)
      • tuple(3, 4)
      • list[1, 2]
  3. Set types(kümeler)

    • setDers 5
  4. Mappings

    • dictDers 5
  5. None

    • NoneTypeDers 5
bu derstedaha öncesonraki derslerde

List ve index


grades = ["C1", "B2", "A2"]
print(grades[0], grades[-1])
print(len(grades))
Çıktı
C1 A2
3
List ve index index durumu: grades ismi (lacivert) bir list'i (vişneçürüğü) gösteriyor; içinde C1, B2, A2 (str, yeşil). Hücrelerin üstünde index 0, 1, 2; bu satır çivit mavisi çerçeveyle vurgulu. Altında negatif index -3, -2, -1. Sağda: grades[0] C1, grades[-1] A2, len(grades) 3 (int, turuncu). slice durumu: index numaraları hücrelerin aralarında 0, 1, 2, 3; 1. ve 2. hücreler açık mavi bir şerit içinde ve altında köşeli çizgiyle grades[1:]; sağda grades[1:] sonucu B2 ve A2'den oluşan yeni bir list, "B2" in grades sonucu True (bool, deniz yeşili). grades "C1" "B2" "A2" index 0 1 2 negatif index -3 -2 -1 grades[0] "C1" grades[-1] "A2" len(grades) 3 index 0 1 2 3 grades[1:] grades[1:] "B2" "A2" "B2" in grades True

List'te de index 0'dan başlar; -1 son item'dır.

List ve index (2)


grades = ["C1", "B2", "A2"]
print(grades[1:], "B2" in grades)
Çıktı
['B2', 'A2'] True
List ve index index durumu: grades ismi (lacivert) bir list'i (vişneçürüğü) gösteriyor; içinde C1, B2, A2 (str, yeşil). Hücrelerin üstünde index 0, 1, 2; bu satır çivit mavisi çerçeveyle vurgulu. Altında negatif index -3, -2, -1. Sağda: grades[0] C1, grades[-1] A2, len(grades) 3 (int, turuncu). slice durumu: index numaraları hücrelerin aralarında 0, 1, 2, 3; 1. ve 2. hücreler açık mavi bir şerit içinde ve altında köşeli çizgiyle grades[1:]; sağda grades[1:] sonucu B2 ve A2'den oluşan yeni bir list, "B2" in grades sonucu True (bool, deniz yeşili). grades "C1" "B2" "A2" index 0 1 2 negatif index -3 -2 -1 grades[0] "C1" grades[-1] "A2" len(grades) 3 index 0 1 2 3 grades[1:] grades[1:] "B2" "A2" "B2" in grades True

Slicing ve in, str'deki gibi çalışır.

Dil sıralaması bir list olarak


top_languages = ["Python", "Java",
                 "C++", "SQL", "C#"]
print(top_languages[0])
print(top_languages[-1])
Çıktı
Python
C#

Veri: IEEE Spectrum, “The Top Programming Languages 2025” (Stephen Cass, 23 Eylül 2025), Spectrum sıralaması.

Dil sıralaması bir list olarak top_languages ismi (lacivert) beş str'lik (yeşil) bir list'i (vişneçürüğü) gösteriyor: Python, Java, C++, SQL, C#. Hücrelerin üstünde index 0, 1, 2, 3, 4; altında -5, -4, -3, -2, -1. Python hücresi çivit mavisi çerçeveyle vurgulu. top_languages "Python" "Java" "C++" "SQL" "C#" 0 -5 1 -4 2 -3 3 -2 4 -1

IEEE Spectrum 2025 sıralaması bir list olsaydı, Python index 0'da dururdu.

+ ve * ile list


print([1, 2] + [3])
print(["spam"] * 3)
Çıktı
[1, 2, 3]
['spam', 'spam', 'spam']
+ ve * ile list Üstte [1, 2] ile [3] list'leri (vişneçürüğü, içlerinde int, turuncu) + ile arka arkaya eklenip yeni bir [1, 2, 3] list'i oluyor; sonuç açık mavi, çivit mavisi çerçeveli şeridin içinde. Altta ["spam"] list'i 3 (int, turuncu) ile çarpılıp üç "spam" str'li (yeşil) yeni bir list oluyor. Sağ altta: İkisi de yeni bir list verir. 1 2 + 3 = 1 2 3 "spam" * 3 = "spam" "spam" "spam" İkisi de yeni bir list verir.

+ iki list'i arka arkaya ekler; * tekrarlar.

Messi'nin Ballon d'Or yılları

Lionel Messi beyaz bir tişörtle kanepede oturmuş, önündeki alçak masada duran altın Ballon d'Or kupalarına bakıyor.
Fotoğraf: Florent Torchut, “Lionel MESSI Florent TORCHUT”, Wikimedia Commons, CC BY-SA 4.0. Kırpıldı.

Messi sekiz kez Ballon d'Or kazandı; yılları tek bir list'te.


ballon_dor = [2009, 2010, 2011,
              2012, 2015, 2019,
              2021, 2023]

Ballon d'Or ve len()


ballon_dor = [2009, 2010, 2011,
              2012, 2015, 2019,
              2021, 2023]
print(len(ballon_dor))
print(len("2009"))
Çıktı
8
4

len(), list'te item sayısını verir; str'de karakter sayısını.

Messi'nin Ballon d'Or yılları bir list olarak Durum len: ballon_dor ismi (lacivert) sekiz int'lik (turuncu) bir list'i (vişneçürüğü) gösteriyor: 2009, 2010, 2011, 2012, 2015, 2019, 2021, 2023; sekiz hücre çivit mavisi çerçeveyle vurgulu, altında köşeli çizgi ve 8 item. Durum ends: Aynı list; üstte 0'dan 7'ye, altta -8'den -1'e index'ler; son hücre 2023 çivit mavisi çerçeveyle vurgulu, index'i 7 ve -1; solda Son index 8 - 1 = 7. Durum slice: Aynı list; hücre sınırlarında 0'dan 8'e numaralar; 2009, 2010, 2011 ve 2012 açık mavi bantta, altında köşeli çizgi ve ballon_dor[0:4]; 4 numaralı sınır çivit mavisi halkayla vurgulu, oradan inen çizginin yanında bitiş, dahil değil. ballon_dor 2009 2010 2011 2012 2015 2019 2021 2023 8 item 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1 Son index 8 - 1 = 7. 0 1 2 3 4 5 6 7 8 ballon_dor[0:4] bitiş, dahil değil

İlk ve son Ballon d'Or


ballon_dor = [2009, 2010, 2011,
              2012, 2015, 2019,
              2021, 2023]
print(ballon_dor[0], ballon_dor[-1])
print(ballon_dor[7])
Çıktı
2009 2023
2023

İlk item index 0'da; son item'ın index'i len() - 1, yani 7.

Messi'nin Ballon d'Or yılları bir list olarak Durum len: ballon_dor ismi (lacivert) sekiz int'lik (turuncu) bir list'i (vişneçürüğü) gösteriyor: 2009, 2010, 2011, 2012, 2015, 2019, 2021, 2023; sekiz hücre çivit mavisi çerçeveyle vurgulu, altında köşeli çizgi ve 8 item. Durum ends: Aynı list; üstte 0'dan 7'ye, altta -8'den -1'e index'ler; son hücre 2023 çivit mavisi çerçeveyle vurgulu, index'i 7 ve -1; solda Son index 8 - 1 = 7. Durum slice: Aynı list; hücre sınırlarında 0'dan 8'e numaralar; 2009, 2010, 2011 ve 2012 açık mavi bantta, altında köşeli çizgi ve ballon_dor[0:4]; 4 numaralı sınır çivit mavisi halkayla vurgulu, oradan inen çizginin yanında bitiş, dahil değil. ballon_dor 2009 2010 2011 2012 2015 2019 2021 2023 8 item 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1 Son index 8 - 1 = 7. 0 1 2 3 4 5 6 7 8 ballon_dor[0:4] bitiş, dahil değil

Ballon d'Or ve slicing


ballon_dor = [2009, 2010, 2011,
              2012, 2015, 2019,
              2021, 2023]
print(ballon_dor[0:4])
print(ballon_dor[0:3])
Çıktı
[2009, 2010, 2011, 2012]
[2009, 2010, 2011]

[0:4] index 0, 1, 2 ve 3'ü alır; bitiş dahil değildir.

Messi'nin Ballon d'Or yılları bir list olarak Durum len: ballon_dor ismi (lacivert) sekiz int'lik (turuncu) bir list'i (vişneçürüğü) gösteriyor: 2009, 2010, 2011, 2012, 2015, 2019, 2021, 2023; sekiz hücre çivit mavisi çerçeveyle vurgulu, altında köşeli çizgi ve 8 item. Durum ends: Aynı list; üstte 0'dan 7'ye, altta -8'den -1'e index'ler; son hücre 2023 çivit mavisi çerçeveyle vurgulu, index'i 7 ve -1; solda Son index 8 - 1 = 7. Durum slice: Aynı list; hücre sınırlarında 0'dan 8'e numaralar; 2009, 2010, 2011 ve 2012 açık mavi bantta, altında köşeli çizgi ve ballon_dor[0:4]; 4 numaralı sınır çivit mavisi halkayla vurgulu, oradan inen çizginin yanında bitiş, dahil değil. ballon_dor 2009 2010 2011 2012 2015 2019 2021 2023 8 item 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1 Son index 8 - 1 = 7. 0 1 2 3 4 5 6 7 8 ballon_dor[0:4] bitiş, dahil değil

IndexError

IndexError: grades[3] grades ismi (lacivert) C1, B2, A2'yi (str, yeşil) tutan bir list'i (vişneçürüğü) gösteriyor; üstte index 0, 1, 2, altta negatif index -3, -2, -1. Son hücreden sonra kırmızı kesikli boş bir hücre var, üstünde kırmızı 3: böyle bir index yok. Sağda kod: grades = ["C1", "B2", "A2"] ve kırmızı çerçeveli print(grades[3]) satırı. Altta kırmızı: IndexError: list index out of range. grades "C1" "B2" "A2" index 0 1 2 negatif index -3 -2 -1 3 grades = ["C1", "B2", "A2"] print(grades[3]) IndexError: list index out of range
Son index len(grades) - 1, yani 2'dir.

2. List üzerinde for ve split()

List'i dolaşmak ve bir satırı parçalara ayırmak

List üzerinde for


grades = ["C1", "B2", "A2"]
for letter in grades:
    print(letter)
Genel biçim
for <isim> in <list>:
    <satırlar>
Çıktı
C1
B2
A2

for, list'in item'larını sırayla tek tek verir.

List üzerinde for (2)

List ve accumulator


scores = [70, 85, 90]
total = 0
for score in scores:
    total += score
print(total)
Çıktı
245
List ve accumulator: izleme tablosu Üstte 70, 85, 90 (int, turuncu) list'i (vişneçürüğü). Altında üç turluk izleme tablosu, sütunlar tur, score, total: tur 1'de score 70, total 70; tur 2'de score 85, total 155; tur 3'te score 90, total 245. Son total 245 açık mavi, çivit mavisi çerçeveli hücrede vurgulu. 70 85 90 tur score total 1 70 70 2 85 155 3 90 245

Ders 3'teki accumulator, list üzerinde de aynı çalışır.

sum() ve len()


scores = [70, 85, 90]
print(sum(scores), len(scores))
print(sum(scores) / len(scores))
Çıktı
245 3
81.66666666666667
sum() ve len() Üstte 70, 85, 90 (int, turuncu) list'i (vişneçürüğü); altındaki köşeli çizgi bütün list'i gösteriyor. sum(scores) 245'i, len(scores) 3'ü veriyor (int, turuncu); 245 açık mavi, çivit mavisi çerçeveli şeridin içinde vurgulu. 70 85 90 sum(scores) 245 len(scores) 3

sum() toplamı, len() item sayısını verir.

split()


print("MAT123 4 C1".split())
Genel biçim
<str>.split()
Çıktı
['MAT123', '4', 'C1']

split() str'yi boşluklardan bölüp list verir.

split(): str'den list'e space durumu: MAT123 4 C1 str'si (yeşil) karakter karakter hücrelerde; iki boşluk hücresi çivit mavisi çerçeveli ve üstlerinde ayırıcı yazıyor. split() oku, üç str item'lık bir list'e (vişneçürüğü) gidiyor: MAT123, 4, C1. semicolon durumu: üst satır gri; altta MAT123;4;C1 str'sinde iki noktalı virgül hücresi çerçeveli ve ayırıcı; split(";") aynı üç item'lık list'i veriyor. M A T 1 2 3 4 C 1 ayırıcı split() "MAT123" "4" "C1" M A T 1 2 3 4 C 1 split() "MAT123" "4" "C1" M A T 1 2 3 ; 4 ; C 1 ayırıcı split(";") "MAT123" "4" "C1"

split() (2)


print("MAT123;4;C1".split(";"))
Genel biçim
<str>.split(<ayırıcı>)
Çıktı
['MAT123', '4', 'C1']

Parantezin içine başka bir ayırıcı yazılabilir.

split(): str'den list'e space durumu: MAT123 4 C1 str'si (yeşil) karakter karakter hücrelerde; iki boşluk hücresi çivit mavisi çerçeveli ve üstlerinde ayırıcı yazıyor. split() oku, üç str item'lık bir list'e (vişneçürüğü) gidiyor: MAT123, 4, C1. semicolon durumu: üst satır gri; altta MAT123;4;C1 str'sinde iki noktalı virgül hücresi çerçeveli ve ayırıcı; split(";") aynı üç item'lık list'i veriyor. M A T 1 2 3 4 C 1 ayırıcı split() "MAT123" "4" "C1" M A T 1 2 3 4 C 1 split() "MAT123" "4" "C1" M A T 1 2 3 ; 4 ; C 1 ayırıcı split(";") "MAT123" "4" "C1"

split() (3)

split() bir makas gibi Elle çizilmiş gibi basit bir resim. Üstte "MAT123 4 C1".split() kodu yazıyor. Altında açık yeşil bir kağıt şerit var; üzerinde MAT123, 4 ve C1 yazıyor ve iki boşluğun yerinde kesik çizgiler var. Bir makas ikinci boşluktan kesiyor. Aşağıda pembe bir list çerçevesine üç yeşil kağıt parçası düşmüş: 'MAT123', '4' ve 'C1'. Ortadaki '4' parçasının küçük bir yüzü var ve konuşma balonunda "Ben hala str'yim." diyor. "MAT123 4 C1".split() MAT123 4 C1 'MAT123' '4' 'C1' Ben hala str'yim.

split(), kağıt şeridini boşluklardan kesen makas gibidir; her parça yine str'dir.

Busa ve Index Thomisticus (1946-1980)

Roberto Busa 2006'da Gallarate'te; arkasındaki raflarda Index Thomisticus ciltleri.
Fotoğraf: Antonio G Colombo, “Roberto busa e index thomisticus”, Wikimedia Commons, CC0 1.0.

Busa'nın ilk adımı her cümleyi kelimelere ayırmaktı.

Python'da

verse = "in principio erat verbum"
words = verse.split()
print(words[1], len(words))
Çıktı
principio 4

split() ve type conversion


parts = "MAT123 4 C1".split()
print(parts[1] * 2)
print(int(parts[1]) * 2)
print(parts[0][:3])
Çıktı
44
8
MAT

split()'in parçaları str'dir; sayı için int() gerekir.

split() ve çevirim parts ismi (lacivert) üç str'lik (yeşil) bir list'i (vişneçürüğü) gösteriyor: "MAT123", "4", "C1". parts[1] olan "4" hücresi çivit mavisi çerçeveli, altında str yazıyor. Sağda üç satır: parts[1] * 2 sonucu "44" (str, tekrar); int(parts[1]) * 2 sonucu 8 (int, turuncu, çarpma); parts[0][:3] sonucu "MAT" (str; önce index, sonra slicing). parts "MAT123" "4" "C1" parts[0] parts[1] str parts[1] * 2 "44" tekrar int(parts[1]) * 2 8 çarpma parts[0][:3] "MAT" index, sonra slicing

split() ve TypeError

split() ve TypeError Üstte kod: 1. satır parts = "MAT123 4 C1".split(), 2. satır kırmızı çerçeveli print(parts[1] + 1). Altında parts ismi (lacivert) "MAT123", "4", "C1" str'lerini (yeşil) tutan list'i (vişneçürüğü) gösteriyor; "4" hücresi çivit mavisi çerçeveli, altında str. parts[1] + 1 ifadesinden çıkan kırmızı ok kırmızı TypeError kutusuna gidiyor. En altta kırmızı: TypeError: can only concatenate str (not "int") to str. 1 parts = "MAT123 4 C1".split() 2 print(parts[1] + 1) parts "MAT123" "4" "C1" parts[0] parts[1] str parts[1] + 1 TypeError TypeError: can only concatenate str (not "int") to str
Bir str'ye int eklenemez; toplamadan önce int() ile çevirmek gerekir.

3. List'i değiştirmek

Bir list'i yerinde değiştiren işlemler

Mutable (değiştirilebilir)


grades = ["C1", "B2", "A2"]
grades[0] = "B1"
print(grades)
Çıktı
['B1', 'B2', 'A2']
Item assignment: grades[0] = "B1" Solda Önce: grades ismi (lacivert) C1, B2, A2 str'lerini (yeşil) tutan list'i (vişneçürüğü) gösteriyor. Sağda Sonra, grades[0] = "B1" satırından sonra: aynı list object'i, yalnızca ilk hücredeki str C1'den B1'e değişti ve bu hücre çivit mavisi çerçeveli; grades'in oku aynı, altında ok aynı yazıyor. Önce grades "C1" "B2" "A2" Sonra grades[0] = "B1" grades "B1" "B2" "A2" ok aynı

List mutable'dır: bir item'a yeni değer atanabilir.

Mutable (2)

GeçersizGeçerli
code = "BBM101"grades = ["C1", "B2", "A2"]
code[0] = "C"grades[0] = "B1"
TypeError: 'str' object does not support item assignment['B1', 'B2', 'A2']

str immutable'dır; list mutable'dır.

Mutable (3)

List kurşun kalem, str tükenmez kalem Elle çizilmiş gibi basit bir resim. Solda pembe çerçeveli bir kağıtta kurşun kalemle B1, B2 ve A2 yazıyor; ilk kutudaki C1 silgiyle silinmiş, yerine B1 yazılmış. Altında bir silgi ve silgi kırıntıları var. Üstünde grades[0] = "B1" kodu yazıyor. Sağda açık yeşil bir kağıtta mavi tükenmezle MAT123 yazıyor; silinmeye çalışılmış ama yazı yerinde duruyor, kağıt yalnızca lekelenmiş. Üstünde code[0] = "m" kodu var ve kağıttan kırmızı bir TypeError etiketi sarkıyor. Ortada elinde kurşun kalem olan bir öğrenci şaşkın şaşkın sağdaki kağıda bakıyor. grades[0] = "B1" code[0] = "m" B1 B2 A2 MAT123 TypeError

List kurşun kalemle yazılmış gibidir, silip düzeltilir; str ise tükenmez kalemle yazılmıştır.

Eratosthenes'in eleği ve Horsley (1772)

Horsley'in 1772 tarihli makalesinden tablo: 3'ten 157'ye kadar tek sayılar altı satırda dizili; 9, 15, 21, 25 gibi bileşik sayıların üstü çizilmiş, asallar çizilmeden kalmış.
Görsel: Samuel Horsley, Philosophical Transactions 62 (1772), s. 334, “Formula. or, The Sieve of Eratosthenes …”, Wikimedia Commons, kamu malı. Kırpıldı.

Horsley'in tablosunda sayılar bir kez yazılır; katların üstü yerinde çizilir.

Python'da

is_prime = [True] * 10
for k in range(4, 10, 2):
    is_prime[k] = False
print(is_prime[4], is_prime[7])
Çıktı
False True

append()


grades = ["C1", "B2"]
grades.append("A2")
print(grades)
Çıktı
['C1', 'B2', 'A2']
Genel biçim
<list>.append(<değer>)
List method'ları Beş durum, her biri bir method: üstte append(), insert(), remove(), pop(), sort() çipleri; o anki method açık mavi, çivit mavisi çerçeveli, öncekiler düz, sonrakiler gizli. Altta solda önceki list (vişneçürüğü), okun sağında sonraki list; item'lar str (yeşil). append: [C1, B2] sonra [C1, B2, A2], yeni A2 çerçeveli. insert: [C1, B2, A2] sonra [C1, D, B2, A2], index 1'deki D çerçeveli, altında kaydı. remove: [C1, D, B2, A2] içinde B2 gri, sonra [C1, D, A2], sola kayan A2 çerçeveli. pop: [C1, D, A2] sonra [C1, D]; sağda ayrı bir kutuda geri verilen A2 vurgulu ve last ismi onu gösteriyor. sort: [C1, A2, B1] sonra [A2, B1, C1], üç hücre birlikte çerçeveli. append() "C1" "B2" "C1" "B2" "A2" append() insert() "C1" "B2" "A2" "C1" "D" "B2" "A2" kaydı append() insert() remove() "C1" "D" "B2" "A2" "C1" "D" "A2" append() insert() remove() pop() "C1" "D" "A2" "C1" "D" geri verir "A2" last append() insert() remove() pop() sort() "C1" "A2" "B1" "A2" "B1" "C1"

append(), list'in sonuna bir item ekler.

Ballon d'Or ve append()

Lionel Messi beyaz bir tişörtle kanepede oturmuş, önündeki alçak masada duran altın Ballon d'Or kupalarına bakıyor.
Fotoğraf: Florent Torchut, “Lionel MESSI Florent TORCHUT”, Wikimedia Commons, CC BY-SA 4.0. Kırpıldı.

2023'teki sekizinci ödül, append() ile list'in sonuna eklenir.


ballon_dor = [2009, 2010, 2011, 2012,
              2015, 2019, 2021]
ballon_dor.append(2023)
print(len(ballon_dor), ballon_dor[-1])
Çıktı
8 2023

insert()


grades = ["C1", "B2", "A2"]
grades.insert(1, "D")
print(grades)
Çıktı
['C1', 'D', 'B2', 'A2']
List method'ları Beş durum, her biri bir method: üstte append(), insert(), remove(), pop(), sort() çipleri; o anki method açık mavi, çivit mavisi çerçeveli, öncekiler düz, sonrakiler gizli. Altta solda önceki list (vişneçürüğü), okun sağında sonraki list; item'lar str (yeşil). append: [C1, B2] sonra [C1, B2, A2], yeni A2 çerçeveli. insert: [C1, B2, A2] sonra [C1, D, B2, A2], index 1'deki D çerçeveli, altında kaydı. remove: [C1, D, B2, A2] içinde B2 gri, sonra [C1, D, A2], sola kayan A2 çerçeveli. pop: [C1, D, A2] sonra [C1, D]; sağda ayrı bir kutuda geri verilen A2 vurgulu ve last ismi onu gösteriyor. sort: [C1, A2, B1] sonra [A2, B1, C1], üç hücre birlikte çerçeveli. append() "C1" "B2" "C1" "B2" "A2" append() insert() "C1" "B2" "A2" "C1" "D" "B2" "A2" kaydı append() insert() remove() "C1" "D" "B2" "A2" "C1" "D" "A2" append() insert() remove() pop() "C1" "D" "A2" "C1" "D" geri verir "A2" last append() insert() remove() pop() sort() "C1" "A2" "B1" "A2" "B1" "C1"

insert(1, "D"), "D"yi index 1'e koyar; sonrakiler bir sağa kayar.

remove()


grades = ["C1", "D", "B2", "A2"]
grades.remove("B2")
print(grades)
Çıktı
['C1', 'D', 'A2']
List method'ları Beş durum, her biri bir method: üstte append(), insert(), remove(), pop(), sort() çipleri; o anki method açık mavi, çivit mavisi çerçeveli, öncekiler düz, sonrakiler gizli. Altta solda önceki list (vişneçürüğü), okun sağında sonraki list; item'lar str (yeşil). append: [C1, B2] sonra [C1, B2, A2], yeni A2 çerçeveli. insert: [C1, B2, A2] sonra [C1, D, B2, A2], index 1'deki D çerçeveli, altında kaydı. remove: [C1, D, B2, A2] içinde B2 gri, sonra [C1, D, A2], sola kayan A2 çerçeveli. pop: [C1, D, A2] sonra [C1, D]; sağda ayrı bir kutuda geri verilen A2 vurgulu ve last ismi onu gösteriyor. sort: [C1, A2, B1] sonra [A2, B1, C1], üç hücre birlikte çerçeveli. append() "C1" "B2" "C1" "B2" "A2" append() insert() "C1" "B2" "A2" "C1" "D" "B2" "A2" kaydı append() insert() remove() "C1" "D" "B2" "A2" "C1" "D" "A2" append() insert() remove() pop() "C1" "D" "A2" "C1" "D" geri verir "A2" last append() insert() remove() pop() sort() "C1" "A2" "B1" "A2" "B1" "C1"

remove("B2"), değeri "B2" olan ilk item'ı siler.

pop()


grades = ["C1", "D", "A2"]
last = grades.pop()
print(grades, last)
Çıktı
['C1', 'D'] A2
List method'ları Beş durum, her biri bir method: üstte append(), insert(), remove(), pop(), sort() çipleri; o anki method açık mavi, çivit mavisi çerçeveli, öncekiler düz, sonrakiler gizli. Altta solda önceki list (vişneçürüğü), okun sağında sonraki list; item'lar str (yeşil). append: [C1, B2] sonra [C1, B2, A2], yeni A2 çerçeveli. insert: [C1, B2, A2] sonra [C1, D, B2, A2], index 1'deki D çerçeveli, altında kaydı. remove: [C1, D, B2, A2] içinde B2 gri, sonra [C1, D, A2], sola kayan A2 çerçeveli. pop: [C1, D, A2] sonra [C1, D]; sağda ayrı bir kutuda geri verilen A2 vurgulu ve last ismi onu gösteriyor. sort: [C1, A2, B1] sonra [A2, B1, C1], üç hücre birlikte çerçeveli. append() "C1" "B2" "C1" "B2" "A2" append() insert() "C1" "B2" "A2" "C1" "D" "B2" "A2" kaydı append() insert() remove() "C1" "D" "B2" "A2" "C1" "D" "A2" append() insert() remove() pop() "C1" "D" "A2" "C1" "D" geri verir "A2" last append() insert() remove() pop() sort() "C1" "A2" "B1" "A2" "B1" "C1"

pop() son item'ı çıkarır ve onu geri verir.

sort()


grades = ["C1", "A2", "B1"]
grades.sort()
print(grades)
Çıktı
['A2', 'B1', 'C1']
List method'ları Beş durum, her biri bir method: üstte append(), insert(), remove(), pop(), sort() çipleri; o anki method açık mavi, çivit mavisi çerçeveli, öncekiler düz, sonrakiler gizli. Altta solda önceki list (vişneçürüğü), okun sağında sonraki list; item'lar str (yeşil). append: [C1, B2] sonra [C1, B2, A2], yeni A2 çerçeveli. insert: [C1, B2, A2] sonra [C1, D, B2, A2], index 1'deki D çerçeveli, altında kaydı. remove: [C1, D, B2, A2] içinde B2 gri, sonra [C1, D, A2], sola kayan A2 çerçeveli. pop: [C1, D, A2] sonra [C1, D]; sağda ayrı bir kutuda geri verilen A2 vurgulu ve last ismi onu gösteriyor. sort: [C1, A2, B1] sonra [A2, B1, C1], üç hücre birlikte çerçeveli. append() "C1" "B2" "C1" "B2" "A2" append() insert() "C1" "B2" "A2" "C1" "D" "B2" "A2" kaydı append() insert() remove() "C1" "D" "B2" "A2" "C1" "D" "A2" append() insert() remove() pop() "C1" "D" "A2" "C1" "D" geri verir "A2" last append() insert() remove() pop() sort() "C1" "A2" "B1" "A2" "B1" "C1"

sort(), list'i küçükten büyüğe, yerinde sıralar.

sort() ve Türkçe harfler

sort() ve Türkçe harfler Solda kod: cities = ["Çorum", "Ankara", "Zonguldak", "İzmir", "Bursa"], cities.sort(), print(cities). Sağda bir eksen; eksende harfler ve Unicode numaraları: A 65, B 66, Z 90, sonra eksende bir kesinti, Ç 199, İ 304. Kesintiden sonraki bölüm açık mavi ve üstünde Türkçe harfler yazıyor. Eksenin üstünde sıralanmış beş şehir kartı (str, yeşil) kendi harflerinin üstünde: Ankara, Bursa, Zonguldak, Çorum, İzmir. Altta çıktı: ['Ankara', 'Bursa', 'Zonguldak', 'Çorum', 'İzmir']. cities = ["Çorum", "Ankara", "Zonguldak", "İzmir", "Bursa"] cities.sort() print(cities) A 65 "Ankara" B 66 "Bursa" Z 90 "Zonguldak" Ç 199 "Çorum" İ 304 "İzmir" Türkçe harfler Çıktı ['Ankara', 'Bursa', 'Zonguldak', 'Çorum', 'İzmir']
sort() harfleri Unicode numarasına göre dizer; Ç ve İ, Z'den sonra gelir.

Değiştiren method'ların sonucu

sort() aynı list'i değiştirir Solda kod: code = "bbm101"; code.upper(); grades = ["C1", "A2", "B1"]; grades.sort(); print(code, grades). Çıktı: bbm101 ['A2', 'B1', 'C1']. Sağ üstte code ismi (lacivert) "bbm101" str'sini (yeşil) gösteriyor; upper() ayrı, gri bir "BBM101" str'si yapıyor; altında: yeni str, ismi yok. Altta grades ismi aynı list'i (vişneçürüğü) gösteriyor; list yerinde A2, B1, C1 diye sıralanmış, açık mavi bantta çivit mavisi çerçeveyle vurgulu; altında: aynı list, yerinde sıralandı. code = "bbm101" code.upper() grades = ["C1", "A2", "B1"] grades.sort() print(code, grades) Çıktı bbm101 ['A2', 'B1', 'C1'] code "bbm101" upper() "BBM101" yeni str, ismi yok grades "A2" "B1" "C1" aynı list, yerinde sıralandı
append, insert, remove ve sort aynı list'i değiştirir, yeni bir list vermez.

Değiştiren method'ların sonucu (2)

Odayı toplamak yeni oda vermez Elle çizilmiş gibi basit bir resim. Üstte grades.sort() kodu yazıyor. Toplanmış bir oda: solda pembe bir duvar rafında üç yeşil kitap sıralı duruyor, A2, B1, C1; altında düzgünce yapılmış bir yatak var. Sağda kapının önünde bir öğrenci boş elini uzatmış. Konuşma balonunda "Yeni oda nerede?" diye soruyor. grades.sort() A2 B1 C1 Yeni oda nerede?

Odanızı toplamak size yeni bir oda vermez; sort() da aynı list'i düzenler.

Boş list'e eklemek

Boş list'e append: film şeridi Solda kod: squares = [], for i in range(1, 4):, squares.append(i * i), print(squares); çıktı [1, 4, 9]. Sağda dört kare. Kare 1, başta: squares ismi (lacivert) boş bir list'i (vişneçürüğü) gösteriyor; boş list açık mavi, çivit mavisi çerçeveli şeridin içinde. Kare 2, tur 1, i = 1: aynı list'te 1 (int, turuncu). Kare 3, tur 2, i = 2: 1 ve 4. Kare 4, tur 3, i = 3: 1, 4 ve 9. Her karede o turda eklenen hücre çivit mavisi çerçeveli; ok her karede aynı list'e gidiyor. Altta: Kare 2-4: o tur bittikten sonra; bu turda eklenen. squares = [] for i in range(1, 4): squares.append(i * i) print(squares) Çıktı [1, 4, 9] 1 başta squares [] 2 tur 1, i = 1 squares 1 3 tur 2, i = 2 squares 1 4 4 tur 3, i = 3 squares 1 4 9 Kare 2-4: o tur bittikten sonra bu turda eklenen
Önce boş bir list, sonra loop içinde append().

remove() ve ValueError

remove() ve ValueError Üstte beş method çipi; remove() çipi kırmızı çerçeveli. Altta grades list'i (vişneçürüğü) C1 ve A2'yi (str, yeşil) tutuyor; A1 değerinden (str, yeşil) list'e giden kırmızı ok list'e varmadan kırmızı bir çizgide duruyor, altında list'te yok. Sağda kod: grades = ["C1", "A2"] ve kırmızı çerçeveli grades.remove("A1"). En altta kırmızı: ValueError: list.remove(x): x not in list. append() insert() remove() pop() sort() "C1" "A2" "A1" list'te yok grades = ["C1", "A2"] grades.remove("A1") ValueError: list.remove(x): x not in list
remove() list'te olmayan bir item'ı silemez.

4. Tuple ve unpacking

Alanları sabit kayıtlar

Tuple (demet)


course = ("MAT123", 4, "C1")
print(course)
print(type(course))
Çıktı
('MAT123', 4, 'C1')
<class 'tuple'>
Tuple: course = ("MAT123", 4, "C1") course ismi (lacivert) bir tuple'ı (mavi-gri) gösteriyor: "MAT123" (str, yeşil), 4 (int, turuncu), "C1" (str, yeşil); hücrelerin üstünde code, credits, letter etiketleri, altında tuple, yanında immutable yazıyor. record durumunda tuple açık mavi, çivit mavisi çerçeveli şeridin içinde. index durumunda etiketler yukarı çıkıyor, altlarında index 0, 1, 2 var ve 1. hücre (4) çivit mavisi çerçeveli. course "MAT123" 4 "C1" tuple immutable code credits letter code credits letter 0 1 2

Tuple, değiştirilemeyen bir kayıttır; parantezle yazılır.

Tuple (2)


course = ("MAT123", 4, "C1")
print(course[0], len(course))
print(course[1] * 2)
Çıktı
MAT123 3
8
Tuple: course = ("MAT123", 4, "C1") course ismi (lacivert) bir tuple'ı (mavi-gri) gösteriyor: "MAT123" (str, yeşil), 4 (int, turuncu), "C1" (str, yeşil); hücrelerin üstünde code, credits, letter etiketleri, altında tuple, yanında immutable yazıyor. record durumunda tuple açık mavi, çivit mavisi çerçeveli şeridin içinde. index durumunda etiketler yukarı çıkıyor, altlarında index 0, 1, 2 var ve 1. hücre (4) çivit mavisi çerçeveli. course "MAT123" 4 "C1" tuple immutable code credits letter code credits letter 0 1 2

Index ve len(), tuple'da da çalışır.

List ve tuple

List ve tuple Solda list [ ]: grades ismi (lacivert) C1, B2, A2 str'lerini (yeşil) tutan bir list'i (vişneçürüğü) gösteriyor; altında çok sayıda benzer item, mutable, örnek bir öğrencinin harf notları. Sağda tuple ( ): course ismi "MAT123", 4, "C1" tutan bir tuple'ı (mavi-gri) gösteriyor; altında sabit alanlı tek kayıt, immutable, örnek transkriptin bir satırı. list [ ] grades "C1" "B2" "A2" çok sayıda benzer item mutable bir öğrencinin harf notları tuple ( ) course "MAT123" 4 "C1" sabit alanlı tek kayıt immutable transkriptin bir satırı
Çoğalıp değişen benzer item'lar için list; alanları sabit tek kayıt için tuple.

List ve tuple (2)

Bracket Symbols tablosu: her parantez çiftinin yanında uydurma bir anlam; ( ) normal parantez, [ ] daha güvenli, { } pahalı, sağda iç içe parantezler için Python function'ları anlaşamıyor.
xkcd 2954: Bracket Symbols, Randall Munroe, CC BY-NC 2.5, https://xkcd.com/2954/

Python'da her parantez çiftinin tek ve kesin bir anlamı var.


print(type([1, 2]), type((1, 2)))
Çıktı
<class 'list'> <class 'tuple'>

str, range, list ve tuple

str, range, list, tuple, dict ve set Collection tablosu; sütunlar sırası korunur mu?, değiştirilebilir mi?, index var mı?, tekrar olur mu?. str (yeşil): evet, hayır, evet, evet. range: evet, hayır, evet, hayır. list (vişneçürüğü): evet, evet, evet, evet. tuple (mavi-gri): evet, hayır, evet, evet. evet'ler petrol mavisi. w4a durumunda list'in değiştirilebilir mi? hücresi açık mavi, çivit mavisi çerçeveyle vurgulu; dict ve set satırları gri kesikli, Ders 5'te dolacak. w5a durumunda dict (kahverengi): evet (eklenme sırası), evet, hayır (key ile okunur), key hayır, value evet; set (zeytin yeşili): hayır, evet, hayır, hayır; dict ve set adları vurgulu. sırası korunur mu? değiştirilebilir mi? index var mı? tekrar olur mu? str evet hayır evet evet range evet hayır evet hayır list evet evet evet evet tuple evet hayır evet evet dict Ders 5 set Ders 5 evet (eklenme sırası) evet hayır (key ile okunur) key hayır, value evet hayır evet hayır hayır dict set
Dördü de sequence; yalnızca list değiştirilebilir.

Unpacking


course = ("MAT123", 4, "C1")
code, credits, letter = course
print(code, credits * 2)
Çıktı
MAT123 8
Unpacking: code, credits, letter = course course ismi (lacivert) bir tuple'ı (mavi-gri) gösteriyor: "MAT123" (str, yeşil), 4 (int, turuncu), "C1" (str, yeşil). Altta code, credits ve letter isimleri; her birinden tuple'ın kendi hücresine yukarı bir ok gidiyor. Üç yeni ok açık mavi, çivit mavisi çerçeveli bir şeridin üzerinde. course "MAT123" 4 "C1" code credits letter

Unpacking, bir tuple'ın item'larını tek satırda ayrı isimlere atar.

Descartes'ın x ve y'si (1637)

Descartes'ın 1637 tarihli La Géométrie'sinin 321. sayfası: üstte G, A, B, C, K, L harfleriyle etiketli doğrular ve noktalı bir eğri; altta CB ve BA uzunluklarına y ve x adını verdiği Fransızca metin.
Görsel: René Descartes, La Géométrie (Leiden, 1637), s. 321; tarama Bibliothèque nationale de France / Gallica, “Descartes - Discours de la méthode, éd. 1637”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

Descartes, bir noktayı belirleyen iki uzunluğa y ve x adını verdi.

Python'da

x, y = (3, 4)
print(x, y, (3, 4) == (4, 3))
Çıktı
3 4 False

Tuple'lardan oluşan list

Tuple'lardan oluşan list base durumu: solda kod transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")], total = 0, for code, credits, letter in transcript:, total += credits, print(total); çıktı 7. Sağda transcript ismi (lacivert) iki tuple'lık (mavi-gri) bir list'i (vişneçürüğü) gösteriyor: index 0'da "MAT123", 4, "C1"; index 1'de "FIZ127", 3, "B2". Altta izleme tablosu, sütunlar tur, code, credits, letter, total: tur 1'de "MAT123", 4, "C1", total 4; tur 2'de "FIZ127", 3, "B2", total 7; 7 vurgulu. problem durumunda kod backup = transcript ve backup.append(("BBM101", 3, "A3")) ile print(len(transcript)); çıktı 3. List'te üç tuple var, yeni BBM101 satırı açık mavi, çivit mavisi çerçeveli; solda altta backup ismi soluk ve oksuz. transcript transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")] total = 0 for code, credits, letter in transcript: total += credits print(total) Çıktı 7 0 "MAT123" 4 "C1" 1 "FIZ127" 3 "B2" tur code credits letter total 1 "MAT123" 4 "C1" 4 2 "FIZ127" 3 "B2" 7 transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")] backup = transcript backup.append(("BBM101", 3, "A3")) print(len(transcript)) Çıktı 3 0 "MAT123" 4 "C1" 1 "FIZ127" 3 "B2" 2 "BBM101" 3 "A3" backup
Transkript, tuple'lardan oluşan bir list; for satırı her tuple'ı açar.

Tuple ve TypeError

Tuple ve TypeError course ismi (lacivert) bir tuple'ı (mavi-gri) gösteriyor: "MAT123" (str, yeşil), 4 (int, turuncu), "C1" (str, yeşil); üstte code, credits, letter ve index 0, 1, 2. 2. hücrenin çevresinde kırmızı kesikli çerçeve. Sağda kod: course = ("MAT123", 4, "C1") ve kırmızı çerçeveli course[2] = "B1". En altta kırmızı: TypeError: 'tuple' object does not support item assignment. course "MAT123" 4 "C1" tuple code credits letter 0 1 2 course = ("MAT123", 4, "C1") course[2] = "B1" TypeError: 'tuple' object does not support item assignment
Tuple'ın bir item'ına yeni değer atanamaz.

Tuple ve TypeError (2)

Tuple bir otobüs bileti gibi Elle çizilmiş gibi basit bir resim. Ortada büyük, açık mavi-gri bir şehirlerarası otobüs bileti var. Biletin üç basılı alanında Ankara, 23 ve 10.11.2026 yazıyor; üstlerinde 0, 1 ve 2 numaraları var. Biletin sol ucunda küçük bir yüz var ve konuşma balonunda "Ben basılıyım." diyor. Altta bir yolcu elindeki kalemle 23'ü değiştirmeye çalışıyor. Solda ticket[1] = 24 kodu yazıyor ve biletten kırmızı bir TypeError etiketi sarkıyor. 0 Ankara 1 23 2 10.11.2026 Ben basılıyım. ticket[1] = 24 TypeError

Tuple otobüs bileti gibidir: alanlar basılıdır, değişiklik için yeni bilet kesilir.

Unpacking ve ValueError

Unpacking ve ValueError course ismi (lacivert) "MAT123", 4, "C1" tutan tuple'ı (mavi-gri) gösteriyor. Altta yalnızca code ve credits isimleri var, ilk iki hücreye ok gidiyor; üçüncü hücre ("C1") kırmızı kesikli çerçeveli, onu alacak isim yok. Sağda kırmızı çerçeveli kod: code, credits = course. En altta kırmızı: ValueError: too many values to unpack (expected 2, got 3). course "MAT123" 4 "C1" code credits code, credits = course ValueError: too many values to unpack (expected 2, got 3)
İsim sayısı item sayısına eşit olmalı.

5. Object, mutable, immutable ve aliasing

İsimler, object'ler ve aralarındaki oklar

backup = transcript

Tuple'lardan oluşan list base durumu: solda kod transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")], total = 0, for code, credits, letter in transcript:, total += credits, print(total); çıktı 7. Sağda transcript ismi (lacivert) iki tuple'lık (mavi-gri) bir list'i (vişneçürüğü) gösteriyor: index 0'da "MAT123", 4, "C1"; index 1'de "FIZ127", 3, "B2". Altta izleme tablosu, sütunlar tur, code, credits, letter, total: tur 1'de "MAT123", 4, "C1", total 4; tur 2'de "FIZ127", 3, "B2", total 7; 7 vurgulu. problem durumunda kod backup = transcript ve backup.append(("BBM101", 3, "A3")) ile print(len(transcript)); çıktı 3. List'te üç tuple var, yeni BBM101 satırı açık mavi, çivit mavisi çerçeveli; solda altta backup ismi soluk ve oksuz. transcript transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")] total = 0 for code, credits, letter in transcript: total += credits print(total) Çıktı 7 0 "MAT123" 4 "C1" 1 "FIZ127" 3 "B2" tur code credits letter total 1 "MAT123" 4 "C1" 4 2 "FIZ127" 3 "B2" 7 transcript = [("MAT123", 4, "C1"), ("FIZ127", 3, "B2")] backup = transcript backup.append(("BBM101", 3, "A3")) print(len(transcript)) Çıktı 3 0 "MAT123" 4 "C1" 1 "FIZ127" 3 "B2" 2 "BBM101" 3 "A3" backup
Satırı backup'a ekledik; transcript da üç satır oldu.

Object (nesne)


x = 5
grades = ["C1", "B2"]
print(type(x), type(grades))
Çıktı
<class 'int'> <class 'list'>
İsimler ve object'ler: Data object durumu: Memory (RAM) kutusunun Data bölmesi, çivit mavisi çerçeveli. Solda İsimler kutusunda iki isim, x ve grades (lacivert). Sağda Object'ler: int 5 (turuncu, type etiketi int) ve iki hücreli bir list (vişneçürüğü, type etiketi list); hücrelerde "C1" ve "B2" (str, yeşil). x'ten 5'e, grades'ten list'e birer ok gidiyor. İki object aynı açık mavi, çivit mavisi çerçeveli vurgu şeridinin içinde. Kod: x = 5, grades = ["C1", "B2"], print(type(x), type(grades)); çıktı <class 'int'> <class 'list'>. reference durumu: aynı resim, büyük vurgu şeridi yok; isimlerden çıkan iki okun üstünde reference yazıyor. List'in iki hücresinde artık değer yazmıyor, birer çivit mavisi nokta var (hücreler list'in rengini alıyor); her noktadan yukarıya, ayrı bir str object'ine ok gidiyor: "C1" ve "B2" (yeşil). Bu iki str object'i ve okları açık mavi, çivit mavisi çerçeveli şeridin içinde. Memory (RAM) Data Object'ler İsimler x grades 5 int list "C1" "B2" reference reference "C1" "B2"

Python'da her değer bir object'tir; her object'in bir type'ı vardır.

Reference (referans)

İsimler ve object'ler: Data object durumu: Memory (RAM) kutusunun Data bölmesi, çivit mavisi çerçeveli. Solda İsimler kutusunda iki isim, x ve grades (lacivert). Sağda Object'ler: int 5 (turuncu, type etiketi int) ve iki hücreli bir list (vişneçürüğü, type etiketi list); hücrelerde "C1" ve "B2" (str, yeşil). x'ten 5'e, grades'ten list'e birer ok gidiyor. İki object aynı açık mavi, çivit mavisi çerçeveli vurgu şeridinin içinde. Kod: x = 5, grades = ["C1", "B2"], print(type(x), type(grades)); çıktı <class 'int'> <class 'list'>. reference durumu: aynı resim, büyük vurgu şeridi yok; isimlerden çıkan iki okun üstünde reference yazıyor. List'in iki hücresinde artık değer yazmıyor, birer çivit mavisi nokta var (hücreler list'in rengini alıyor); her noktadan yukarıya, ayrı bir str object'ine ok gidiyor: "C1" ve "B2" (yeşil). Bu iki str object'i ve okları açık mavi, çivit mavisi çerçeveli şeridin içinde. Memory (RAM) Data Object'ler İsimler x grades 5 int list "C1" "B2" reference reference "C1" "B2"
İsim object'i içinde tutmaz, onu gösterir; bu oka reference denir.

int ile reassignment

int ile reassignment: film şeridi Üç karelik film şeridi. Solda kod: x = 5 (# 1), y = x (# 2), x = x + 1 (# 3), print(x, y); altında çıktı: 6 5. 5 ve 6 int olduğu için kutuları her karede turuncu. Kare 1, x = 5 satırından sonra: lacivert x etiketinden çıkan ok 5'i gösteriyor; 5 çivit mavisi çerçeveli açık mavi şeridin içinde (yeni object). Kare 2, y = x satırından sonra: y de aynı 5'i gösteriyor; y'den 5'e giden yeni ok açık mavi şeridin üzerinde. Kare 3, x = x + 1 satırından sonra: yeni bir 6 oluşuyor, açık mavi şeridin içinde; x'in oku 6'ya geçiyor; x'ten 5'e giden eski ok gri ve kesikli; y hala 5'i gösteriyor. Değerler kareler boyunca yerini değiştirmez; yalnızca oklar değişir. Alttaki açıklama: kare n, # n satırı çalıştıktan sonraki durumdur; düz ok şu anki bağ, kesikli gri ok eski bağ, çivit mavisi çerçeveli açık mavi şerit bu adımda değişen. x = 5 # 1 y = x # 2 x = x + 1 # 3 print(x, y) Çıktı 6 5 1 x 5 2 x y 5 3 x y 6 5 Kare n: # n satırı çalıştıktan sonra şu anki bağ eski bağ bu adımda değişen
x = x + 1 yeni bir int yapar; y eski 5'i göstermeye devam eder.

Aliasing

Aliasing: iki isim, tek list Dört karelik film şeridi. Solda kod: a = [4, 3] (# 1), b = a (# 2), b.append(2) (# 3), print(a), a.append(1) (# 4), print(b); altında çıktı iki satır: [4, 3, 2] ve [4, 3, 2, 1]. Her karede tek bir list object'i (vişneçürüğü) var, hücrelerindeki sayılar int (turuncu). Kare 1, # 1'den sonra: a ismi (lacivert) [4, 3] list'ini gösteriyor; list açık mavi, çivit mavisi çerçeveli şeridin içinde (yeni object). Kare 2, # 2'den sonra: b ismi de aynı list'i gösteriyor; b'nin yeni oku açık mavi şeridin üzerinde. Kare 3, # 3'ten sonra: b üzerinden eklenen 2 ile list [4, 3, 2] oldu; yeni hücre çivit mavisi çerçeveli; iki ok da değişmedi. Kare 4, # 4'ten sonra: a üzerinden eklenen 1 ile list [4, 3, 2, 1] oldu; yeni hücre çivit mavisi çerçeveli. Hiçbir ok taşınmadı; değişen, tek list object'inin kendisi. Alttaki açıklama: kare n, # n satırı çalıştıktan sonraki durumdur; düz ok şu anki bağ, çivit mavisi çerçeve bu adımda değişen. a = [4, 3] # 1 b = a # 2 b.append(2) # 3 print(a) a.append(1) # 4 print(b) Çıktı [4, 3, 2] [4, 3, 2, 1] 1 a 4 3 2 a b 4 3 3 a b 4 3 2 4 a b 4 3 2 1 Kare n: # n satırı çalıştıktan sonra şu anki bağ bu adımda değişen
İki isim aynı list'i gösterirse, birinden yapılan değişiklik ötekinden de görünür.

Aliasing (2)

Aynı oyuncuya iki bant Elle çizilmiş gibi basit bir resim. Sahada pembe formalı tek bir oyuncu var. Bir kolunu kaldırmış, öbür eliyle pembe çerçeveli küçük bir tahta tutuyor; tahtada 4, 3 ve yeni yazılmış 9 var. İki kolunda birer lacivert kaptanlık bandı var: birinde a, diğerinde b yazıyor. Konuşma balonunda "İki bant, tek ben." diyor. Altta iki satır kod var: b.append(9) ve print(a) → [4, 3, 9]. a b 4 3 9 İki bant, tek ben. b.append(9) print(a) → [4, 3, 9]

Aliasing, aynı oyuncuya iki bant takmaktır: b'nin oyuncusuna ne olursa a'nınkine de olur.

backup = transcript (2)

List üzerinde for ve isim

List üzerinde for ve loop'taki isim Üç karelik film şeridi, her tur için bir kare. Solda kod: nums = [1, 2, 3], for x in nums:, x = x * 10, print(nums); çıktı [1, 2, 3]. Her karede nums ismi (lacivert) aynı list'i (vişneçürüğü) gösteriyor; list'in üç hücresinde birer çivit mavisi nokta var ve her noktadan aşağıya, ayrı bir int object'ine ok gidiyor: 1, 2, 3 (turuncu). Bu kısım üç karede de aynı. Kare 1, tur 1 bittikten sonra: x'in eski oku 1'e gidiyordu, gri ve kesikli; x'in yeni oku yeni bir int'e, 10'a gidiyor; 10 açık mavi, çivit mavisi çerçeveli şeridin içinde. Kare 2, tur 2: eski ok 2'ye, yeni ok 20'ye. Kare 3, tur 3: eski ok 3'e, yeni ok 30'a. List hiç değişmiyor. Solda açıklama: düz ok şu anki bağ, kesikli gri ok eski bağ, çivit mavisi çerçeveli açık mavi şerit bu adımda değişen. Altta: kare n, n. tur bittikten sonraki durumdur. nums = [1, 2, 3] for x in nums: x = x * 10 print(nums) Çıktı [1, 2, 3] şu anki bağ eski bağ bu adımda değişen 1 tur 1 nums 1 2 3 x 10 2 tur 2 nums 1 2 3 x 20 3 tur 3 nums 1 2 3 x 30 Kare n: n. tur bittikten sonra
Loop'taki isme yeni değer atamak list'i değiştirmez.

copy()

copy(): iki ayrı list Solda kod: a = [4, 3], c = a.copy(), c.append(9), print(a, c); altında çıktı: [4, 3] [4, 3, 9]. Sağda a ismi (lacivert) [4, 3] list'ini (vişneçürüğü) gösteriyor; c ismi ayrı, ikinci bir list'i, [4, 3, 9]'u gösteriyor. Sayılar int (turuncu). c'ye eklenen 9'un hücresi çivit mavisi çerçeveyle vurgulu; a'nın list'i değişmedi. İki list'in arasında: iki ayrı list. a = [4, 3] c = a.copy() c.append(9) print(a, c) Çıktı [4, 3] [4, 3, 9] a c 4 3 4 3 9 iki ayrı list
copy() yeni ve ayrı bir list yapar; birindeki değişiklik ötekine geçmez.

== ve is

== ve is: eşitlik ve kimlik Solda kod a = [4, 3], b = a, c = a.copy(), print(a == b, a is b), print(a == c, a is c); çıktı True True ve True False. Ortada a ve b isimleri (lacivert) aynı [4, 3] list'ini (vişneçürüğü, sayılar int, turuncu) gösteriyor; c ismi copy() ile yapılmış ayrı bir [4, 3] list'ini gösteriyor. Sağda tablo, sütunlar == (içerik aynı mı?) ve is (aynı object mi?): a, b satırında == True, is True; a, c satırında == True, is False (bool, deniz yeşili). Son False hücresi açık mavi, çivit mavisi çerçeveyle vurgulu. a = [4, 3] b = a c = a.copy() Çıktı a b c 4 3 4 3 copy() == is içerik aynı mı? aynı object mi? print(a == b, a is b) print(a == c, a is c) True True True False a, b True True a, c True False
== değerleri kıyaslar: equality (eşitlik). is, aynı object mi diye sorar: identity (kimlik).

Mutable ve immutable

value
  1. Numbers(sayılar)

    1. Integral

      • int7
      • boolTrue
    2. Real

      • float3.5
  2. Sequences(diziler)

    1. Immutable

      • str"7"
      • rangerange(3)
      • tuple(3, 4)
    2. Mutable

      • list[1, 2]
  3. Set types(kümeler)

    • setDers 5
  4. Mappings

    • dictDers 5
  5. None

    • NoneTypeDers 5
bu derstedaha öncesonraki derslerde

Liskov ve CLU (1979)

Barbara Liskov 2010'da: kıvırcık kısa saçlı, çiçek desenli gömlekli.
Fotoğraf: Kenneth C. Zirkel, “Barbara Liskov MIT computer scientist 2010”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

Liskov'un CLU dilinde atama object'i kopyalamaz; iki isim aynı object'i paylaşır.

Python'da

a = [4, 3]
b = a
b.append(2)
print(a, a is b)
Çıktı
[4, 3, 2] True

Python ne yazdırır?


a = [1, 2]
b = a
c = [1, 2]
b.append(3)
print(a == c, a is b)
      
  1. True True
  2. False True
  3. True False
  4. False False

10 dakika ara

4A
List, tuple, mutable, immutable ve aliasing
4B
try, except, import, module, function ve return value

Sırada 4B

4B'nin hedefi

4B'nin hedefi: transkriptten AGNO Solda beş satırlık transkript tablosu, sütunlar code, credits ve letter: MAT123 4 C1, FIZ127 3 B2, TKD103 2 A2, BBM101 3 A3, BBM102 3 B1. Ders kodları ve harf notları str (yeşil), krediler int (turuncu); son satırın yanında: klavyeden. Ortada gpa(transcript) yazan bir ok, sağdaki çıktı paneline gidiyor. Çıktı sekiz satır: 4 ders, AGNO: 3.08; Yeni dersin kodu: bbm102; Kredi: üç; Tam sayı girin.; Kredi: 3; Harf notu: b1; 5 ders, son ders BBM102; AGNO: 3.12. Kullanıcının yazdıkları petrol mavisi; AGNO: 3.12 satırı açık mavi, çivit mavisi çerçeveli bir bantla vurgulu. code credits letter "MAT123" 4 "C1" "FIZ127" 3 "B2" "TKD103" 2 "A2" "BBM101" 3 "A3" "BBM102" 3 "B1" klavyeden gpa(transcript) Çıktı 4 ders, AGNO: 3.08 Yeni dersin kodu: bbm102 Kredi: üç Tam sayı girin. Kredi: 3 Harf notu: b1 5 ders, son ders BBM102 AGNO: 3.12
Bu yarının sonunda 4A'nın başında çalışan AGNO programını kendiniz yazabileceksiniz.

4B konuları

  1. 6. try, except ve exceptiontry, except ValueError, while True
  2. 7. import ve moduleimport math, import random, import this
  3. 8. def, call ve parameterdef, say_hello("Yusuf"), pass
  4. 9. Return valuereturn, call'un yerine geçen değer

6. try, except ve exception

Hatalı girdide programı durdurmadan devam etmek

int(input()) ve ValueError


credits = int(input("Kredi: "))
print(credits * 2)
int(input()) ve ValueError: traceback Run penceresi, başlığı Çıktı. İlk satır: Kredi: dört; kullanıcının yazdığı dört'ün altı çizili. Sonra traceback: Traceback (most recent call last): / File "…/python-kurs/example.py", line 1, in <module> / credits = int(input("Kredi: ")) / kırmızı son satır: ValueError: invalid literal for int() with base 10: 'dört'. 1 numaralı işaret son satırı gösteriyor. 2 numaralı işaret line 1'i gösteriyor: hangi satır. Sağda gri çerçeveli bir kutuda gri print(credits * 2) satırı, altında: çalışmadı. Çıktı Kredi: dört Traceback (most recent call last): File "…/python-kurs/example.py", line 1, in <module> credits = int(input("Kredi: ")) ValueError: invalid literal for int() with base 10: 'dört' 2 hangi satır 1 son satır print(credits * 2) çalışmadı
Kullanıcı dört yazınca program durur; ikinci satır hiç çalışmaz.

Software Testing Day (xkcd 2928)

İki kişi konuşuyor: test mühendisinin bayram planı, zamanlama sistemi çökmezse. Altında: Software Testing Day her eksi 1 yılda bir, Ocak'ın 0'ında, saat 25:71'de kutlanır.
xkcd 2928: Software Testing Day, Randall Munroe, CC BY-NC 2.5, https://xkcd.com/2928/

Test mühendisleri programları böyle girdilerle dener.

Exception (sıra dışı durum)

Error ve exception İki sütunlu tablo. Sol başlık: Çalışmadan önce bulunur; altında SyntaxError ve IndentationError, en altta gri: hiçbir satır çalışmaz. Sağ başlık açık mavi, çivit mavisi çerçeveli, vurgulu: Çalışırken ortaya çıkar: exception; altında kırmızı NameError, TypeError, ValueError, IndexError ve ZeroDivisionError, en altta gri: önceki satırlar çalışmıştır; except yakalayabilir. Çalışmadan önce bulunur Çalışırken ortaya çıkar: exception SyntaxError IndentationError NameError TypeError ValueError IndexError ZeroDivisionError hiçbir satır çalışmaz önceki satırlar çalışmıştır; except yakalayabilir
Program çalışırken ortaya çıkan hataya exception denir.

Exception (2)

Exception'ların adları Beş satır; her satırda solda gri bir panelde kod, bir ok ve sağda traceback'in gerçek son satırı, exception'ın adı kırmızı. int("abc"): ValueError: invalid literal for int() with base 10: 'abc' (Ders 2); bu satır açık mavi, çivit mavisi çerçeveli bir şeritle vurgulu. "BBM101"[6]: IndexError: string index out of range (Ders 3). prnt("A"): NameError: name 'prnt' is not defined. Did you mean: 'print'? (Ders 1). "A" - "B": TypeError: unsupported operand type(s) for -: 'str' and 'str' (Ders 2). 7 / 0: ZeroDivisionError: division by zero (Ders 1). int("abc") Ders 2 ValueError: invalid literal for int() with base 10: 'abc' "BBM101"[6] Ders 3 IndexError: string index out of range prnt("A") Ders 1 NameError: name 'prnt' is not defined. Did you mean: 'print'? "A" - "B" Ders 2 TypeError: unsupported operand type(s) for -: 'str' and 'str' 7 / 0 Ders 1 ZeroDivisionError: division by zero
Exception'ın adını traceback'in son satırı söyler.

try / except


try:
    credits = int(input("Kredi: "))
    print("Kredi alındı")
except ValueError:
    print("Tam sayı girin.")
print("Program devam ediyor")
Genel biçim
try:
    <riskli satırlar>
except <exception adı>:
    <exception çıkınca yapılacaklar>
Çıktı
Kredi: dört
Tam sayı girin.
Program devam ediyor

try riskli satırları çalıştırır; except, adı verilen exception'ı yakalar.

try / except (2)

try / except akışı: dört yazıldı try kodunun akışı, dört yazıldığında. Solda altı satırlık kod: 1 try:, 2 credits = int(input("Kredi: ")), 3 print("Kredi alındı"), 4 except ValueError:, 5 print("Tam sayı girin."), 6 print("Program devam ediyor"). 2. ve 3. satır kesikli bir try çerçevesinde, 5. satır kesikli bir except çerçevesinde. 2. satırda ValueError çıkıyor: kırmızı ok 2. satırın sonundan çıkıp except ValueError satırına iniyor; yanında kırmızı ValueError ve gri geri dönülmez yazıyor, 2. satıra geri dönen ok yok. 3. satır gri ve yanında atlandı yazıyor. Siyah oklar 4. satırdan 5. satıra, oradan 6. satıra gidiyor; 5. satır açık mavi vurgulu. Sağda Çıktı: Kredi: dört, Tam sayı girin., Program devam ediyor. Debugger durumunda (data-state="debugger") 2. satır açık mavi, solunda çivit mavisi dolu bir üçgen (şu anki satır), 4. satırın solunda kesikli bir üçgen (F8'den sonraki satır); sağda F8 tuşu ve Step Over yazısı. try except 1 try: 2 credits = int(input("Kredi: ")) 3 print("Kredi alındı") 4 except ValueError: 5 print("Tam sayı girin.") 6 print("Program devam ediyor") atlandı ValueError geri dönülmez Çıktı Kredi: dört Tam sayı girin. Program devam ediyor F8Step Overşu anki satırF8'den sonraki satır
Hata çıkınca try'ın kalanı atlanır; akış except'e geçer.

try / except (3)

try / except: 4 ve dört yazılınca Aynı altı satırlık try kodu iki kez yan yana. Solda "4" yazıldı (yeşil str kutusu): 1, 2, 3 ve 6. satırların solunda çivit mavisi nokta var, bu satırlar çalıştı; 4. ve 5. satır, except ValueError: ve print("Tam sayı girin."), gri, çalışmadı. Çıktı: Kredi: 4, Kredi alındı, Program devam ediyor. Sağda "dört" yazıldı (yeşil str kutusu): 1, 2, 4, 5 ve 6. satırlar çalıştı; 3. satır, print("Kredi alındı"), gri, atlandı. 5. satır açık mavi vurgulu. Çıktı: Kredi: dört, Tam sayı girin., Program devam ediyor. İki çalıştırmada da son satır çalışıyor. Yazılanlar int() çevirene kadar str. "4" yazıldı 1 try: 2 credits = int(input("Kredi: ")) 3 print("Kredi alındı") 4 except ValueError: 5 print("Tam sayı girin.") 6 print("Program devam ediyor") Çıktı Kredi: 4 Kredi alındı Program devam ediyor "dört" yazıldı 1 try: 2 credits = int(input("Kredi: ")) 3 print("Kredi alındı") 4 except ValueError: 5 print("Tam sayı girin.") 6 print("Program devam ediyor") Çıktı Kredi: dört Tam sayı girin. Program devam ediyor çalışan satır; gri satır çalışmadı
Yalnızca girdi değişti: 4 yazılınca except hiç çalışmaz.

try / except (4)

Debugger'da try

try / except akışı: dört yazıldı try kodunun akışı, dört yazıldığında. Solda altı satırlık kod: 1 try:, 2 credits = int(input("Kredi: ")), 3 print("Kredi alındı"), 4 except ValueError:, 5 print("Tam sayı girin."), 6 print("Program devam ediyor"). 2. ve 3. satır kesikli bir try çerçevesinde, 5. satır kesikli bir except çerçevesinde. 2. satırda ValueError çıkıyor: kırmızı ok 2. satırın sonundan çıkıp except ValueError satırına iniyor; yanında kırmızı ValueError ve gri geri dönülmez yazıyor, 2. satıra geri dönen ok yok. 3. satır gri ve yanında atlandı yazıyor. Siyah oklar 4. satırdan 5. satıra, oradan 6. satıra gidiyor; 5. satır açık mavi vurgulu. Sağda Çıktı: Kredi: dört, Tam sayı girin., Program devam ediyor. Debugger durumunda (data-state="debugger") 2. satır açık mavi, solunda çivit mavisi dolu bir üçgen (şu anki satır), 4. satırın solunda kesikli bir üçgen (F8'den sonraki satır); sağda F8 tuşu ve Step Over yazısı. try except 1 try: 2 credits = int(input("Kredi: ")) 3 print("Kredi alındı") 4 except ValueError: 5 print("Tam sayı girin.") 6 print("Program devam ediyor") atlandı ValueError geri dönülmez Çıktı Kredi: dört Tam sayı girin. Program devam ediyor F8Step Overşu anki satırF8'den sonraki satır
Step Over ile hata satırından except satırına atlandığı görülür.

LBYL ve EAFP


code = "BBM101"
i = 6
if i < len(code):
    print(code[i])
else:
    print("Böyle bir indis yok.")
try:
    print(code[i])
except IndexError:
    print("Böyle bir indis yok.")
Çıktı
Böyle bir indis yok.
Böyle bir indis yok.

if önce bakar, try önce dener; ikisi aynı satırı yazar.

Girdiyi yeniden sormak


while True:
    try:
        credits = int(input("Kredi: "))
        break
    except ValueError:
        print("Tam sayı girin.")
print("Kredi:", credits)
Çıktı
Kredi: dört
Tam sayı girin.
Kredi: 4
Kredi: 4

while True, try, break ve except: doğru girdi gelene kadar sorulur.

Girdiyi yeniden sormak (2)

Yeniden sorma loop'u: while True, try, break, except Yeniden sorma loop'unun akış şeması. Karar baklavasında True (bool, deniz yeşili), while True'nun başı. Petrol mavisi True oku aşağıda kesikli try çerçevesine iniyor; içinde credits = int(input("Kredi: ")). Buradan iki yol çıkıyor. Petrol mavisi sayı geldi oku açık mavi, çivit mavisi çerçeveli break kutusuna gidiyor; break'ten çıkan ok loop'tan çıkıp print("Kredi:", credits) kutusuna, oradan Bitir'e gidiyor. Kırmızı ValueError oku kesikli except ValueError çerçevesindeki print("Tam sayı girin.") kutusuna iniyor; oradan siyah bir ok soldan yukarı çıkıp True kararına geri dönüyor, yanında yeniden sor yazıyor. Sağ altta Çıktı: Kredi: dört, Tam sayı girin., Kredi: 4, Kredi: 4. dört reddediliyor, 4 kabul ediliyor. True True try credits = int(input("Kredi: ")) sayı geldi break print("Kredi:", credits) Bitir ValueError except ValueError print("Tam sayı girin.") yeniden sor Çıktı Kredi: dört Tam sayı girin. Kredi: 4 Kredi: 4
int() başarılı olursa break; ValueError çıkarsa mesaj ve yeniden soru.

Traceback'i okumak

PyCharm ekran görüntüsü, Traceback'i okumak

Traceback alttan yukarı okunur; mavi bağlantı hatalı satıra götürür.

  1. 1exception'ın adı
  2. 2mavi bağlantı

except ValueError ve NameError

Adsız except ve except ValueError İki sütun. Solda kırmızı Adsız except başlığı: try:, credits = int(inptu("Kredi: ")), except:, print("Tam sayı girin."); inptu yazım hatası kırmızı kesikli bir elipsle çevrili. Çıktı yalnızca Tam sayı girin.; altında asıl hata saklandı. Sağda petrol mavisi except ValueError başlığı: aynı kod, ama except ValueError:; ValueError açık mavi vurgulu. Çıktı kırmızı: NameError: name 'inptu' is not defined. Did you mean: 'input'?; altında yazım hatası görünüyor. Adsız except yazım hatasını saklıyor; except ValueError ile asıl hata, NameError, görünüyor. Adsız except try: credits = int(inptu("Kredi: ")) except: print("Tam sayı girin.") Çıktı Tam sayı girin. asıl hata saklandı except ValueError try: credits = int(inptu("Kredi: ")) except ValueError: print("Tam sayı girin.") Çıktı NameError: name 'inptu' is not defined. Did you mean: 'input'? yazım hatası görünüyor
except'ten sonra exception'ın adı her zaman yazılır.

Adsız except ve bekçi

Adı yazılmayan except ve bekçi Elle çizilmiş gibi basit bir resim. Gece, sağ üstte hilal var. Ortada kasketli bir bekçi çite yaslanmış, uykulu gözlerle esniyor ve el feneriyle çitin üstünde oturan kediyi aydınlatıyor; konuşma balonunda "Kedidir." yazıyor. Kedinin boynundaki etikette ValueError yazıyor. Bekçinin arkasında, solda bir bahçe kapısı açılmış; kapıdaki tabelada kırmızıyla NameError: inptu yazıyor. NameError:inptu ValueError Kedidir.

Adı yazılmayan except, her tıkırtıya "kedidir" diyen bekçi gibidir: asıl sorunu kaçırır.

Python ne yazdırır?


try:
    x = int("3.5")
    print("A")
except ValueError:
    print("B")
      
  1. B
  2. A
  3. A B
  4. ValueError

7. import ve module

Başkasının yazdığı kodu kullanmak

Module (modül)

Module: ders4.py ve math Durum file: python-kurs klasöründe ders4.py dosyası, içinde import math ve math.sqrt(16) satırları. Sağda Python'la gelen module'ler: math module'ü, içinde sqrt, pi, floor ve ceil isimleri; solundaki module etiketi açık mavi ve çivit mavisi çerçeveyle vurgulu. Durum import: Aynı resim; ders4.py'den math'e giden bir ok var, okun üstünde import math yazıyor ve bu yazı vurgulu; module etiketi artık vurgusuz. python-kurs/ import math math.sqrt(16) ders4.py Python'la gelen module'ler sqrt pi floor ceil math module import math
Module, başkasının yazıp denediği kodu tutan bir .py dosyasıdır.

Library (kütüphane)

Standard library rafı Durum shelf: Python'la gelen standard library rafı; rafın başlığı açık mavi, çivit mavisi çerçeveli bantla vurgulu. Rafta module kutuları: math, random, this, antigravity; turtle, statistics, datetime, string; sys, os, json ve üç nokta; altında ve yaklaşık 180 module daha. Sağda kesik çizgili ayrı bir raf, Ayrıca kurulan: numpy ve matplotlib gri kutularda, pip ile kurulur. Durum today: Aynı raf; bugün kullanacağımız ilk sıra, math, random, this ve antigravity, açık mavi ve çivit mavisi çerçeveli bantla vurgulu. Python'la gelen: standard library math random this antigravity turtle statistics datetime string sys os json ... ve yaklaşık 180 module daha Ayrıca kurulan numpy matplotlib pip ile kurulur
Library, birlikte gelen module'lerin topluluğudur; Python'la gelene standard library denir.

Python'la gelen module'ler

Standard library rafı Durum shelf: Python'la gelen standard library rafı; rafın başlığı açık mavi, çivit mavisi çerçeveli bantla vurgulu. Rafta module kutuları: math, random, this, antigravity; turtle, statistics, datetime, string; sys, os, json ve üç nokta; altında ve yaklaşık 180 module daha. Sağda kesik çizgili ayrı bir raf, Ayrıca kurulan: numpy ve matplotlib gri kutularda, pip ile kurulur. Durum today: Aynı raf; bugün kullanacağımız ilk sıra, math, random, this ve antigravity, açık mavi ve çivit mavisi çerçeveli bantla vurgulu. Python'la gelen: standard library math random this antigravity turtle statistics datetime string sys os json ... ve yaklaşık 180 module daha Ayrıca kurulan numpy matplotlib pip ile kurulur
Python'un anlayışı batteries included: math ve random gibi yaklaşık 200 module kurulumla gelir.

import


import math
print(math.pi)
Çıktı
3.141592653589793
Module: ders4.py ve math Durum file: python-kurs klasöründe ders4.py dosyası, içinde import math ve math.sqrt(16) satırları. Sağda Python'la gelen module'ler: math module'ü, içinde sqrt, pi, floor ve ceil isimleri; solundaki module etiketi açık mavi ve çivit mavisi çerçeveyle vurgulu. Durum import: Aynı resim; ders4.py'den math'e giden bir ok var, okun üstünde import math yazıyor ve bu yazı vurgulu; module etiketi artık vurgusuz. python-kurs/ import math math.sqrt(16) ders4.py Python'la gelen module'ler sqrt pi floor ceil math module import math

import math, math module'ünü programa getirir.

math.sqrt()

math.sqrt(16) parçaları Ortada math.sqrt(16) ifadesi, dört numaralı açıklamayla: 1 math, module'ün adı; 2 nokta, içindeki demek; 3 sqrt, isim: karekök; 4 16, argument (int, turuncu). İfadeden çıkan ok 4.0 değerine gidiyor; 4.0 float (hardal sarısı), açık mavi, çivit mavisi çerçeveli bantla vurgulu. Altta kod paneli: import math, print(math.sqrt(16)); yanında Çıktı: 4.0. math.sqrt(16) 1 module'ün adı 3 isim: karekök 2 içindeki 4 argument 4.0 float import math print(math.sqrt(16)) Çıktı 4.0
math.sqrt(16), print() gibi parantezle çalışır ve 4.0 değerini verir.

NameError ve import


print(math.sqrt(16))

import yazılmazsa math ismi yoktur; Python bunu error message'ta söyler.

Çıktı
Traceback (most recent call last):  File "…/python-kurs/example.py", line 1, in <module>    print(math.sqrt(16))          ^^^^NameError: name 'math' is not defined. Did you forget to import 'math'?

Random Number (xkcd 221)

Tek satırlık C benzeri kod: getRandomNumber her seferinde 4 döndürüyor, yorumda adil bir zar atışıyla seçildiği yazıyor.
xkcd 221: Random Number, Randall Munroe, CC BY-NC 2.5, https://xkcd.com/221/

Bir kez atılıp koda yazılan zar artık rastgele değildir.

import random

randint(1, 6) ve range(1, 6) Üstte kod: import random, die = random.randint(1, 6), print(die >= 1 and die <= 6); yanında Çıktı: True. Altta iki sayı doğrusu, 0'dan 7'ye. random.randint(1, 6) için 1, 2, 3, 4, 5 ve 6'da dolu noktalar; 6'daki nokta açık mavi, çivit mavisi çerçeveli bantla vurgulu, üstünde 6 da gelir. range(1, 6) için 1'den 5'e dolu noktalar, 6'da içi boş çivit mavisi halka, üstünde 6 yok. Dolu noktalar ve sayıları int (turuncu). import random die = random.randint(1, 6) print(die >= 1 and die <= 6) Çıktı True random.randint(1, 6) 0 1 2 3 4 5 6 7 6 da gelir range(1, 6) 0 1 2 3 4 5 6 7 6 yok
random.randint(1, 6) iki ucu da verebilir; range(1, 6) ise 6'yı vermez.

Tavla zarı

randint(1, 6) bir tavla zarı gibi Elle çizilmiş gibi basit bir resim. Kahvehane masasında açık bir tavlanın yarısı duruyor; üçgenleri iki renk. Tavlanın önünde iki zar var, ikisi de altı gösteriyor. Masanın arkasında elinde ince belli çay bardağı tutan bir oyuncu gülüyor ve konuşma balonunda "Düşeş geldi." diyor. Üstte random.randint(1, 6) kodu yazıyor. random.randint(1, 6) Düşeş geldi.

random.randint(1, 6) tavla zarı gibidir: 6 da gelir, yoksa düşeş hiç olmazdı.

52 kartlık deste


import math
ways = math.factorial(52)
print(len(str(ways)), "basamak")
Çıktı
68 basamak

52 kart, 52 faktöriyel farklı sırada dizilebilir; bu sayı 68 basamaklıdır.

52 kartın dizilişleri: 52 faktöriyel Üstte yedi kart yuvası: 52 çarpı 51 çarpı 50 çarpı 49 çarpı ... çarpı 2 çarpı 1; altlarında 1. kart, 2. kart, 3. kart, 4. kart, 51. kart, 52. kart; sağda = 52 faktöriyel. Aşağı inen ok 68 basamaklı sonuca gidiyor: 80658175170943878571660636856403766975289505440883277824000000000000 (int, turuncu); sonuç açık mavi, çivit mavisi çerçeveli bantla vurgulu. 52 1. kart 51 2. kart 50 3. kart 49 4. kart ... 2 51. kart 1 52. kart × × × × × × = 52 faktöriyel 80658175170943878571660636856403766975289505440883277824000000000000 int

52 kartlık deste (2)


import math
seconds = 60 * 60 * 24 * 365 * 13800000000
shuffles = 8000000000 * seconds
print(shuffles)
print(math.factorial(52) // shuffles)
Çıktı
348157440000000000000000000023167155402723514560441574035127259373026

Herkes evrenin başından beri saniyede bir deste karıştırsaydı, 52 faktöriyele yine yaklaşamazdı.

Ingenuity ve açık kaynak (2021)

Mars yüzeyinde duran küçük Ingenuity helikopteri; Perseverance aracının kamerasıyla 5 Nisan 2021'de çekilmiş.
Fotoğraf: NASA/JPL-Caltech/ASU/MSSS, “Mastcam-Z Gives Ingenuity a Close-up”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

Mars helikopteri Ingenuity'de kullanılan açık kaynak projeler arasında Python, NumPy ve Matplotlib vardı.

ModuleNotFoundError


import math
import numpy
Çıktı
Traceback (most recent call last):  File "…/python-kurs/example.py", line 2, in <module>    import numpyModuleNotFoundError: No module named 'numpy'

Kurulu olmayan bir module import edilemez.

import this

import this ve Readability counts. Solda kod: import this. Ok, çıktı penceresine gidiyor. Çıktı: The Zen of Python, by Tim Peters; boş bir satır; ilk yedi ilke: Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Son satır, Readability counts., açık mavi, çivit mavisi çerçeveli bantla vurgulu. Altında ... ve 12 satır daha. Solda PEP 20: 19 ilke yazılı, 20.'si boş. import this Çıktı The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. ... ve 12 satır daha PEP 20 19 ilke yazılı, 20.'si boş
import this, Tim Peters'ın Python için yazdığı 19 ilkeyi, Zen of Python'u yazdırır.

import antigravity

Uçan Cueball'a yerdeki arkadaşı nasıl uçtuğunu soruyor; Cueball Python öğrendiğini ve tek yaptığının import antigravity yazmak olduğunu söylüyor.
xkcd 353: Python, Randall Munroe, CC BY-NC 2.5, https://xkcd.com/353/

import antigravity gerçek bir module'dür; çalışınca tarayıcıda xkcd 353'ü açar.


import antigravity

EDSAC'ın subroutine library'si (1949-1951)

1948'de EDSAC'ta W. Renwick öne eğilmiş, elindeki delikli kağıt şeridi düzeltiyor; şerit soldaki tahta gövdeli şerit okuyucunun üzerinden geçiyor, önünde kağıdına sayılar basılmış Creed teleprinter.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (20)”, Wikimedia Commons, CC BY 2.0 UK.

EDSAC'ın programcıları denenmiş kod parçalarını kağıt şeritlerde bir library'de topladı.

AttributeError ve dosya adı

Kendi random.py dosyanız library'yi gölgeler Solda python-kurs klasörü: example.py (import random, print(random.randint(1, 6))) ve öğrencinin random.py dosyası (# my dice experiments); random.py açık mavi, çivit mavisi çerçeveyle vurgulu. example.py'den çıkan import random oku klasördeki random.py'ye gidiyor. Sağda Python'un library'si: gri çerçeveli random.py (randint, shuffle); oraya giden gri kesik ok yarıda kırmızı bir çarpıyla kesiliyor, altında kırmızı buraya ulaşamaz. Altta kırmızı çerçeveli kutuda error message'ın son satırı: AttributeError: module 'random' has no attribute 'randint' (consider renaming '…/python-kurs/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module) python-kurs/ import random print(random.randint(1, 6)) example.py # my dice experiments random.py import random Python'un library'si randint shuffle random.py buraya ulaşamaz AttributeError: module 'random' has no attribute 'randint' (consider renaming '…/python-kurs/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
Module adını taşıyan dosya önce import edilir.

8. def, call ve parameter

Kendi function'ımızı yazmak

Function (fonksiyon)

def satırının parçaları Solda üstte genel biçim: def <isim>(): ve indentation'lı <gövde>. Ortada iki satır kod: def draw_line(): ve indentation'lı print("-" * 20); "-" str (yeşil), 20 int (turuncu). Numaralı açıklamalar: 1 def, keyword; 2 draw_line, function'ın adı; 3 parantez; 4 iki nokta; 5 indentation'lı gövde: block. Gövde satırı açık mavi, çivit mavisi çerçeveli bantla vurgulu. Sağda draw_line yazan bir function kutusu: def bu object'i yapar. Genel biçim def <isim>(): <gövde> def draw_line(): print("-" * 20) 1 keyword 2 function'ın adı 3 parantez 4 iki nokta 5 indentation'lı gövde: block draw_line function def bu object'i yapar
Function, isim verilmiş ve çağrılınca çalışan bir kod block'udur.

Function (2)

Tekrarlanan kod ve function Üç sütun. Solda Tekrarlanan kod: print("-" * 20), print("MAT123"), print("-" * 20), print("FIZ127"), print("-" * 20); çizgi satırının üç kopyası kırmızı kesik çerçeveli, yanlarında kopya 1, kopya 2, kopya 3. Ortada Function ile: def draw_line(): ve indentation'lı print("-" * 20), boş satır, draw_line(), print("MAT123"), draw_line(), print("FIZ127"), draw_line(); def block'u açık mavi, çivit mavisi çerçeveli bantla vurgulu, üç draw_line() call'undan block'a geri dönen oklar var. Sağda İkisinin de çıktısı: 20 tire, MAT123, 20 tire, FIZ127, 20 tire. Tekrarlanan kod Function ile İkisinin de çıktısı print("-" * 20) print("MAT123") print("-" * 20) print("FIZ127") print("-" * 20) kopya 1 kopya 2 kopya 3 def draw_line(): print("-" * 20) draw_line() print("MAT123") draw_line() print("FIZ127") draw_line() -------------------- MAT123 -------------------- FIZ127 --------------------
Bir işi bir kez yazıp isimle çağırırız; değişiklik tek yerde yapılır.

Kantinde tost

Tost tarifi bir function gibi Elle çizilmiş gibi basit bir resim. Kantin tezgahının arkasında aşçı şapkalı bir usta tost makinesinin başında duruyor. Arkasındaki duvarda bir tarif kartı asılı; kartın başlığında def toast(): yazıyor, altında içeri girintili üç karalama satırı var. Tezgahın önündeki öğrencinin konuşma balonunda "Bir tost." yazıyor. Üstte sağda toast() kodu var. def toast(): toast() Bir tost.

Kantinde "bir tost" demek yeter; tostun nasıl yapıldığını her seferinde anlatmazsınız.

Call (çağrı)

Call: akış gövdeye gider ve geri döner Durum call: Solda numaralı kod: 1 def show_inside():, 2 indentation'lı print("içeride"), 3 boş, 4 print("önce"), 5 show_inside(), 6 print("sonra"). def satırları kesik çerçeve içinde, altında tanım, şimdi çalışmaz. Numaralı adımlar: 1 önce yazılır; 2 show_inside() call'u gövdeye atlar, bu ok açık mavi, çivit mavisi çerçeveli bantla vurgulu; 3 içeride yazılır; 4 petrol mavisi ok akışı call satırına geri döndürür, geri döner; 5 sonra yazılır. Sağda Çıktı: önce (1), içeride (3), sonra (5). Durum nocall: Kod dört satır: def show_inside():, indentation'lı print("içeride") gri ve yanında çağrılmadı, boş satır, print("dışarıda"). def block'u açık mavi, çivit mavisi çerçeveli bantla vurgulu; call yok. 1 dışarıda yazılır. Çıktı yalnızca dışarıda. 1 2 3 4 5 6 def show_inside(): print("içeride") print("içeride") çağrılmadı tanım, şimdi çalışmaz print("önce") show_inside() print("sonra") geri döner 3 1 5 2 4 Çıktı 1 önce 3 içeride 5 sonra print("dışarıda") 1 Çıktı 1 dışarıda
Call, function'ın gövdesini çalıştırır; sonra akış call'dan sonraki satıra döner.

Call adım adım

def tek başına

Call: akış gövdeye gider ve geri döner Durum call: Solda numaralı kod: 1 def show_inside():, 2 indentation'lı print("içeride"), 3 boş, 4 print("önce"), 5 show_inside(), 6 print("sonra"). def satırları kesik çerçeve içinde, altında tanım, şimdi çalışmaz. Numaralı adımlar: 1 önce yazılır; 2 show_inside() call'u gövdeye atlar, bu ok açık mavi, çivit mavisi çerçeveli bantla vurgulu; 3 içeride yazılır; 4 petrol mavisi ok akışı call satırına geri döndürür, geri döner; 5 sonra yazılır. Sağda Çıktı: önce (1), içeride (3), sonra (5). Durum nocall: Kod dört satır: def show_inside():, indentation'lı print("içeride") gri ve yanında çağrılmadı, boş satır, print("dışarıda"). def block'u açık mavi, çivit mavisi çerçeveli bantla vurgulu; call yok. 1 dışarıda yazılır. Çıktı yalnızca dışarıda. 1 2 3 4 5 6 def show_inside(): print("içeride") print("içeride") çağrılmadı tanım, şimdi çalışmaz print("önce") show_inside() print("sonra") geri döner 3 1 5 2 4 Çıktı 1 önce 3 içeride 5 sonra print("dışarıda") 1 Çıktı 1 dışarıda
def yalnızca tanımlar; call yoksa gövde hiç çalışmaz.

Parameter (parametre)

Parameter: call anında name = "Yusuf" Solda kod: def say_hello(name):, indentation'lı print(f"Selam {name}"), boş satır, say_hello("millet"), say_hello("Yusuf"); "millet" ve "Yusuf" str (yeşil). "Yusuf" argument'ının altından çıkan kalın ok, kodun sağından dolaşıp birinci satırdaki name parameter'ına iniyor; yanında name = "Yusuf" yazıyor, açık mavi ve çivit mavisi çerçeveyle vurgulu. Sağda ikinci call'un say_hello frame'i: lacivert name etiketi "Yusuf" değerini (str, yeşil) gösteriyor; altında call bitince bu kutu kapanır. Çıktı: Selam millet, Selam Yusuf. def say_hello(name): print(f"Selam {name}") say_hello("millet") say_hello("Yusuf") name = "Yusuf" say_hello 2. call name "Yusuf" str call bitince bu kutu kapanır Çıktı Selam millet Selam Yusuf
Parameter, call anında argument'ın atandığı isimdir: name = "Yusuf".

Birden çok parameter

Argument'lar sırayla atanır Durum ok: Üstte kod: def print_credits(code, credits):, indentation'lı print(f"{code}: {credits} kredi"), boş satır, course = "MAT123", print_credits(course, 4). Ortada parameter'lar, lacivert code ve credits etiketleri. Altlarında argument'lar call sırasıyla: 1 numaralı ok "MAT123"ten (str, yeşil; course'un gösterdiği değer) code'a, 2 numaralı ok 4'ten (int, turuncu) credits'e çıkıyor. Çıktı: MAT123: 4 kredi, açık mavi, çivit mavisi çerçeveli bantla vurgulu. Durum swap: Call satırı print_credits(4, course). 1 numaralı ok 4'ten (int, turuncu) code'a, 2 numaralı ok "MAT123"ten (str, yeşil) credits'e gidiyor; iki değer kırmızı kesik bir çerçeve içinde. Çıktı kırmızı: 4: MAT123 kredi; yanında kırmızı hata yok, ama satır yanlış. def print_credits(code, credits): print(f"{code}: {credits} kredi") course = "MAT123" print_credits(course, 4) print_credits(4, course) code credits 1 2 "MAT123" course 4 4 "MAT123" course Çıktı MAT123: 4 kredi 4: MAT123 kredi hata yok, ama satır yanlış
Argument'lar parameter'lara sırayla atanır.

Birden çok parameter (2)

Argument'lar sırayla atanır Durum ok: Üstte kod: def print_credits(code, credits):, indentation'lı print(f"{code}: {credits} kredi"), boş satır, course = "MAT123", print_credits(course, 4). Ortada parameter'lar, lacivert code ve credits etiketleri. Altlarında argument'lar call sırasıyla: 1 numaralı ok "MAT123"ten (str, yeşil; course'un gösterdiği değer) code'a, 2 numaralı ok 4'ten (int, turuncu) credits'e çıkıyor. Çıktı: MAT123: 4 kredi, açık mavi, çivit mavisi çerçeveli bantla vurgulu. Durum swap: Call satırı print_credits(4, course). 1 numaralı ok 4'ten (int, turuncu) code'a, 2 numaralı ok "MAT123"ten (str, yeşil) credits'e gidiyor; iki değer kırmızı kesik bir çerçeve içinde. Çıktı kırmızı: 4: MAT123 kredi; yanında kırmızı hata yok, ama satır yanlış. def print_credits(code, credits): print(f"{code}: {credits} kredi") course = "MAT123" print_credits(course, 4) print_credits(4, course) code credits 1 2 "MAT123" course 4 4 "MAT123" course Çıktı MAT123: 4 kredi 4: MAT123 kredi hata yok, ama satır yanlış
Sıra karışırsa Python hata vermez; yanlış satırı yazar.

Optik form

Argument'lar optik form gibi sırayla okunur Elle çizilmiş gibi basit bir resim. Üstte print_credits(4, "MAT123") kodu, altında lacivert bir çıktı şeridinde 4: MAT123 kredi yazıyor. Ortada açık mavi bir optik form şeridi var; iki satırın adı code ve credits. code satırına 4, credits satırına MAT123 yazılmış. Sağda bir öğrenci iki elini başına koymuş, endişeli; konuşma balonunda "Kaydırmışım." diyor. print_credits(4, "MAT123") 4: MAT123 kredi code 4 credits M A T 1 2 3 Kaydırmışım.

Argument'lar optik form gibi sırayla okunur; kaydırırsanız her cevap yanlış soruya gider.

The General Problem (xkcd 974)

Üç panel: yemek masasında biri tuzu istiyor, karşısındaki her türlü sosu uzatacak bir sistem geliştirdiğini, uzun vadede zaman kazandıracağını söylüyor; yirmi dakika geçmiş.
xkcd 974: The General Problem, Randall Munroe, CC BY-NC 2.5, https://xkcd.com/974/

Parameter, function'ın yalnızca gerçekten değişen kısmı için yazılır.

Euler ve f(x) yazımı (1734)

Leonhard Euler'in 1753 tarihli portresi: başında kumaş bir başlık, üzerinde mavi çizgili bir giysi, yüzü sola dönük.
Görsel: Jakob Emanuel Handmann, Leonhard Euler portresi (1753), Kunstmuseum Basel. “Leonhard Euler - Jakob Emanuel Handmann (Kunstmuseum Basel)”, Wikimedia Commons, Kamu malı (PD-art-old-100-expired). Boyutu küçültüldü.

Matematikteki f(x) yazımı Euler'den gelir; def square(x): aynı biçimdedir.

polygon() ile çizim

Aynı function, farklı argument'larla üçgen, kare ve altıgen çizer.

polygon() ile üçgen, kare ve altıgen Beyaz zemin üzerinde aynı köşeden başlayan üç düzgün çokgen: kırmızı bir üçgen, çivit mavisi bir kare ve yeşil bir altıgen, her kenarı 100 birim. Üçü de aynı function'ın üç call'u: polygon(3, 100, "red"), polygon(4, 100, "blue"), polygon(6, 100, "green").

import turtle

def polygon(sides, size, color):
    turtle.pencolor(color)
    for i in range(sides):
        turtle.forward(size)
        turtle.left(360 / sides)

polygon(3, 100, "red")
polygon(4, 100, "blue")
polygon(6, 100, "green")
turtle.done()

polygon() ile çiçek

polygon() 36 kez çağrılınca Beyaz zemin üzerinde 36 altıgenden oluşan bir çiçek, toplam 216 çizgi. Altıgenler sırayla kırmızı, turuncu, hardal sarısı, yeşil, çivit mavisi ve deniz yeşili; her altıgenden sonra kalem 10 derece dönüyor. Hepsi aynı polygon(6, 100, renk) call'u.

polygon() 36 kez çağrılınca bu çiçek ortaya çıkar.


colors = ["red", "orange",
          "gold", "green",
          "blue", "teal"]
for i in range(36):
    color = colors[i % 6]
    polygon(6, 100, color)
    turtle.left(10)

TypeError ve eksik argument

Function'da iki hata ve pass Durum missing: Üç sıra; birincisi açık mavi, çivit mavisi çerçeveli bantla vurgulu: def say_hello(name):, indentation'lı print(f"Selam {name}"), boş satır, say_hello(); boş parantez kırmızı kesik halkayla işaretli; yanında kırmızı TypeError: say_hello() missing 1 required positional argument: 'name'. İkinci sıra gri: call'un def'ten önce yazılması, say_hello("Yusuf") ve NameError. Üçüncü sıra gri: pass ile boş gövde, Geçerli, çıktı bitti. Durum order: İkinci sıra vurgulu: 1 say_hello("Yusuf"), 2 boş, 3 def say_hello(name):, 4 indentation'lı print. Kırmızı ok 1. satırdan 3. satıra iniyor: bu satır çalışırken isim henüz yok. Yanında kırmızı NameError: name 'say_hello' is not defined. Birinci ve üçüncü sıra gri. Durum pass: Üçüncü sıra vurgulu, petrol mavisi Geçerli: def check_grades():, indentation'lı pass (kesik çerçevede, boş gövde), boş satır, check_grades(), print("bitti"); çıktı bitti. Birinci ve ikinci sıra gri. def say_hello(name): print(f"Selam {name}") say_hello() def say_hello(name): print(f"Selam {name}") say_hello() TypeError: say_hello() missing 1 required positional argument: 'name' 1 2 3 4 say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") NameError: name 'say_hello' is not defined bu satır çalışırken isim henüz yok def check_grades(): pass check_grades() print("bitti") def check_grades(): pass check_grades() print("bitti") boş gövde Geçerli Çıktı bitti
Her parameter'a bir argument gerekir; yoksa TypeError.

NameError ve call sırası

Function'da iki hata ve pass Durum missing: Üç sıra; birincisi açık mavi, çivit mavisi çerçeveli bantla vurgulu: def say_hello(name):, indentation'lı print(f"Selam {name}"), boş satır, say_hello(); boş parantez kırmızı kesik halkayla işaretli; yanında kırmızı TypeError: say_hello() missing 1 required positional argument: 'name'. İkinci sıra gri: call'un def'ten önce yazılması, say_hello("Yusuf") ve NameError. Üçüncü sıra gri: pass ile boş gövde, Geçerli, çıktı bitti. Durum order: İkinci sıra vurgulu: 1 say_hello("Yusuf"), 2 boş, 3 def say_hello(name):, 4 indentation'lı print. Kırmızı ok 1. satırdan 3. satıra iniyor: bu satır çalışırken isim henüz yok. Yanında kırmızı NameError: name 'say_hello' is not defined. Birinci ve üçüncü sıra gri. Durum pass: Üçüncü sıra vurgulu, petrol mavisi Geçerli: def check_grades():, indentation'lı pass (kesik çerçevede, boş gövde), boş satır, check_grades(), print("bitti"); çıktı bitti. Birinci ve ikinci sıra gri. def say_hello(name): print(f"Selam {name}") say_hello() def say_hello(name): print(f"Selam {name}") say_hello() TypeError: say_hello() missing 1 required positional argument: 'name' 1 2 3 4 say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") NameError: name 'say_hello' is not defined bu satır çalışırken isim henüz yok def check_grades(): pass check_grades() print("bitti") def check_grades(): pass check_grades() print("bitti") boş gövde Geçerli Çıktı bitti
Önce def, sonra call: Python yukarıdan aşağı okur.

pass

Function'da iki hata ve pass Durum missing: Üç sıra; birincisi açık mavi, çivit mavisi çerçeveli bantla vurgulu: def say_hello(name):, indentation'lı print(f"Selam {name}"), boş satır, say_hello(); boş parantez kırmızı kesik halkayla işaretli; yanında kırmızı TypeError: say_hello() missing 1 required positional argument: 'name'. İkinci sıra gri: call'un def'ten önce yazılması, say_hello("Yusuf") ve NameError. Üçüncü sıra gri: pass ile boş gövde, Geçerli, çıktı bitti. Durum order: İkinci sıra vurgulu: 1 say_hello("Yusuf"), 2 boş, 3 def say_hello(name):, 4 indentation'lı print. Kırmızı ok 1. satırdan 3. satıra iniyor: bu satır çalışırken isim henüz yok. Yanında kırmızı NameError: name 'say_hello' is not defined. Birinci ve üçüncü sıra gri. Durum pass: Üçüncü sıra vurgulu, petrol mavisi Geçerli: def check_grades():, indentation'lı pass (kesik çerçevede, boş gövde), boş satır, check_grades(), print("bitti"); çıktı bitti. Birinci ve ikinci sıra gri. def say_hello(name): print(f"Selam {name}") say_hello() def say_hello(name): print(f"Selam {name}") say_hello() TypeError: say_hello() missing 1 required positional argument: 'name' 1 2 3 4 say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") say_hello("Yusuf") def say_hello(name): print(f"Selam {name}") NameError: name 'say_hello' is not defined bu satır çalışırken isim henüz yok def check_grades(): pass check_grades() print("bitti") def check_grades(): pass check_grades() print("bitti") boş gövde Geçerli Çıktı bitti
pass hiçbir şey yapmaz; boş bir gövdenin yerini tutar.

9. Return value

Function'dan bir değer geri almak

Return value (dönüş değeri)

return değeri call'un yerine taşır Solda kod: def weighted_points(credits, grade_point):, indentation'lı return credits * grade_point, boş satır, points = weighted_points(4, 2.5), print(points); 4 int (turuncu), 2.5 float (hardal sarısı). Sağda weighted_points call'unun frame'i: lacivert credits etiketi 4'ü (int, turuncu), grade_point etiketi 2.5'i (float, hardal sarısı) gösteriyor; altta return credits * grade_point. Frame'den çıkan petrol mavisi return oku 10.0 değerine (float, hardal sarısı) gidiyor; 10.0 açık mavi, çivit mavisi çerçeveli bantla vurgulu ve oradan bir ok call satırındaki weighted_points(4, 2.5) ifadesine çıkıyor. points etiketi aynı 10.0'ı gösteriyor. Çıktı: 10.0. def weighted_points(credits, grade_point): return credits * grade_point points = weighted_points(4, 2.5) print(points) weighted_points credits 4 int grade_point 2.5 float return credits * grade_point return 10.0 float points Çıktı 10.0
return, bir değeri call'un yapıldığı yere geri gönderir.

Return value (2)

Call dönen değerle yer değiştirir Durum points: Üstte points = weighted_points(4, 2.5), call kısmının altı çizili. Aşağı ok, call bitince. Altta points = 10.0; 10.0 float (hardal sarısı), açık mavi, çivit mavisi çerçeveli bantla vurgulu. Durum expr: Üstte print(weighted_points(3, 3.0) + 1), call kısmının altı çizili. Call bitince altta print(9.0 + 1); 9.0 float (hardal sarısı), vurgulu. Sağda Çıktı: 10.0. Durum bool: Üstte if has_passed(2.5):, call kısmının altı çizili. Call bitince altta if True:; True bool (deniz yeşili), vurgulu. call bitince points = weighted_points(4, 2.5) points = 10.0 float print(weighted_points(3, 3.0) + 1) print( 9.0 float + 1) Çıktı 10.0 if has_passed(2.5): if True bool :
Call, döndürdüğü değerle yer değiştirir.

Otomat

Return value bir otomat gibi Elle çizilmiş gibi basit bir resim. Üstte weighted_points(4, 2.5) kodu yazıyor. Solda mavi bir otomat var. Turuncu 4 ve sarı 2.5 yazan iki para, bir okla para deliğine giriyor. Otomatın alttaki ürün kapağında sarı bir kutu içecek yatıyor ve üzerinde 10.0 yazıyor. Sağda bir öğrenci gülerek kapaktaki kutuyu gösteriyor. weighted_points(4, 2.5) 4 2.5 10.0

Return value, otomatın tepsiye düşürdüğü ürün gibidir: call'un yerini o alır.

Return value ve expression

Call dönen değerle yer değiştirir Durum points: Üstte points = weighted_points(4, 2.5), call kısmının altı çizili. Aşağı ok, call bitince. Altta points = 10.0; 10.0 float (hardal sarısı), açık mavi, çivit mavisi çerçeveli bantla vurgulu. Durum expr: Üstte print(weighted_points(3, 3.0) + 1), call kısmının altı çizili. Call bitince altta print(9.0 + 1); 9.0 float (hardal sarısı), vurgulu. Sağda Çıktı: 10.0. Durum bool: Üstte if has_passed(2.5):, call kısmının altı çizili. Call bitince altta if True:; True bool (deniz yeşili), vurgulu. call bitince points = weighted_points(4, 2.5) points = 10.0 float print(weighted_points(3, 3.0) + 1) print( 9.0 float + 1) Çıktı 10.0 if has_passed(2.5): if True bool :
Return value bir expression'ın içinde kullanılabilir: önce call, sonra + 1.

bool döndüren function


def has_passed(grade_point):
    return grade_point >= 1.75

if has_passed(2.5):
    print("geçti")
Çıktı
geçti

bool döndüren bir call, if'in şartı olabilir.

Call dönen değerle yer değiştirir Durum points: Üstte points = weighted_points(4, 2.5), call kısmının altı çizili. Aşağı ok, call bitince. Altta points = 10.0; 10.0 float (hardal sarısı), açık mavi, çivit mavisi çerçeveli bantla vurgulu. Durum expr: Üstte print(weighted_points(3, 3.0) + 1), call kısmının altı çizili. Call bitince altta print(9.0 + 1); 9.0 float (hardal sarısı), vurgulu. Sağda Çıktı: 10.0. Durum bool: Üstte if has_passed(2.5):, call kısmının altı çizili. Call bitince altta if True:; True bool (deniz yeşili), vurgulu. call bitince points = weighted_points(4, 2.5) points = 10.0 float print(weighted_points(3, 3.0) + 1) print( 9.0 float + 1) Çıktı 10.0 if has_passed(2.5): if True bool :

return ve loop

return function'ı o anda bitirir Solda numaralı kod: def first_passing(scores):, for score in scores:, if score >= 50:, return score, return 0, boş satır, scores = [30, 65, 80], print(first_passing(scores)), print(first_passing([30, 40])). Sağda iki iz tablosu, sütunlar score, score >= 50, ne olur. first_passing([30, 65, 80]): 30, False, devam; 65, True, return 65 (açık mavi, çivit mavisi çerçeveli hücre); 80 gri, hiç bakılmadı. first_passing([30, 40]): 30, False, devam; 40, False, devam; sonra loop bitti, return 0. Puanlar int (turuncu), True ve False bool (deniz yeşili). Çıktı: 65 ve 0. 1 def first_passing(scores): 2 for score in scores: 3 if score >= 50: 4 return score 5 return 0 6 7 scores = [30, 65, 80] 8 print(first_passing(scores)) 9 print(first_passing([30, 40])) Çıktı 65 0 first_passing([30, 65, 80]) score score >= 50 ne olur 30 False devam 65 True 80 hiç bakılmadı return 65 first_passing([30, 40]) score score >= 50 ne olur 30 False devam 40 False devam loop bitti, return 0
return, loop'un içinde de function'ı o anda bitirir.

first_passing() adım adım

ask_int()


def ask_int(prompt):
    while True:
        try:
            number = int(input(prompt))
            return number
        except ValueError:
            print("Tam sayı girin.")

credits = ask_int("Kredi: ")
print(credits * 2)
Çıktı
Kredi: üç
Tam sayı girin.
Kredi: 3
6

Sayı gelince return hem loop'u hem function'ı bitirir.

Wheeler jump (EDSAC, 1949-1952)

Cambridge Matematik Laboratuvarı ekibi, Mayıs 1949: üç sıra halinde poz veren yirmi kişi; ön sırada ortada Maurice Wilkes, sağdan ikinci gözlüklü ve açık yakalı David Wheeler.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (14)”, Wikimedia Commons, CC BY 2.0 UK.

EDSAC'ta call'dan geri dönmenin yolunu David Wheeler buldu; Python bunu kendisi yapar.

SyntaxError ve return


return 5
Çıktı
  File "…/python-kurs/example.py", line 1    return 5    ^^^^^^^^SyntaxError: 'return' outside function

return yalnızca bir function'ın gövdesinde yazılabilir.

Python ne yazdırır?


def f():
    return 1
    print("A")

print(f())
      
  1. 1 A
  2. A 1
  3. 1
  4. A

Ders 4'ün hedef programı (2)

Ders 4'ün hedef programı: parçalar Solda hedef programın anahtar satırları, gri bir panelde 18 satır, atlanan yerler üç noktayla: def coefficient(letter):, if letter == "A1":, return 4.00; def gpa(transcript):, for code, credits, letter in transcript:, total_points += credits * coefficient(letter), total_credits += credits, return total_points / total_credits; def ask_int(prompt):, while True:, try:, number = int(input(prompt)), return number, except ValueError:; en altta transcript.append((code, credits, letter)). Sağda dört köşeli parantez: coefficient için Ders 2: elif zinciri, her dalda return; gpa için 4A: tuple ile for, accumulator ve return; ask_int için 6. bölüm: try, except ve 9. bölüm: return; append satırı için 4A: append, yeni ders list'e girer. ask_int satırları açık mavi bantta, çivit mavisi çerçeveyle vurgulu. def coefficient(letter): if letter == "A1": return 4.00 … def gpa(transcript): … for code, credits, letter in transcript: total_points += credits * coefficient(letter) total_credits += credits return total_points / total_credits def ask_int(prompt): while True: try: number = int(input(prompt)) return number except ValueError: … transcript.append((code, credits, letter)) Ders 2: elif zinciri her dalda return 4A: tuple ile for accumulator ve return 6. bölüm: try, except 9. bölüm: return 4A: append yeni ders list'e girer

Ödev 4

Ödev 4'ü teslim etmek: üç adım Üç numaralı adım yukarıdan aşağı, oklarla bağlı. 1: TODO'ları doldurun; odev4.py dosyasında # TODO ve # Beklenen çıktı: satırları. 2: Run ile karşılaştırın; Run penceresinde Görev 1'in ilk beklenen satırı [30, 45, 65, 70, 85, 90]. 3: Aynı dosyayı yükleyin; formun Ödev dosyası alanına aynı odev4.py yükleniyor; bu form kutusu açık mavi, çivit mavisi çerçeveli. 1 TODO'ları doldurun # TODO # Beklenen çıktı: odev4.py 2 Run ile karşılaştırın Run penceresi [30, 45, 65, 70, 85, 90] 3 Aynı dosyayı yükleyin Ödev dosyası odev4.py

Ödev 4, odev4.py dosyasıdır; reposundaki README bu haftanın kodlarını özetler.

Son gün: 15 Kasım Pazar, 23.59

Form: forms.gle/eMHjvPfSRP9cp1JH7

Ders sonrası videolar

4A
Corey Schafer, Lists, Tuples, and Sets
4A, derinlemesine
Ned Batchelder, Facts and Myths about Python names and values (PyCon 2015)
4B
CS50P, Lecture 3, Exceptions (try, except, yeniden sorma)
4B
CS50P, Lecture 4, Libraries (import, random)
4B
Chuck Severance, PY4E Functions

Bugün neler yapabiliyorsunuz

  1. 1Birçok değeri tek bir list'te tutup değiştirmek
  2. 2Bir kaydı tuple ile tutup unpacking ile açmak
  3. 3İki ismin aynı list'i gösterdiğini fark etmek
  4. 4Hatalı girişi try/except ile yakalamak
  5. 5Hazır module'leri import edip kullanmak
  6. 6Kendi function'ınızı yazıp değer return etmek

Çalışma soruları

Dersten sonra kendi başınıza: önce soruyu çözün, tıklayınca cevap gelir.

Python ne yazdırır?


grades = ["C1", "B2", "A2"]
print(grades[1], len(grades))
print("A1" in grades)
      
  1. C1 3 False
  2. B2 3 False
  3. B2 2 False
  4. B2 3 True

1 ikinci item'dır; üç item var; "A1" diye bir item yok.

Python ne yazdırır?


ballon_dor = [2009, 2010, 2011,
              2012, 2015, 2019,
              2021, 2023]
print(len(ballon_dor[2:5]))
print(ballon_dor[-2])
      
  1. 4 2021
  2. 3 2019
  3. 4 2019
  4. 3 2021

[2:5] index 2, 3 ve 4'ü alır, 3 item; -2 sondan ikinci item.

Python ne yazdırır?


codes = "MAT123 FIZ127 TKD103".split()
print(len(codes), codes[-1][:3])
      
  1. 3 TKD
  2. 20 TKD
  3. 3 103
  4. 3 TKD103

split() üç item'lık bir list yapar; codes[-1] son item'dır, [:3] onun ilk üç karakteri.

Python ne yazdırır?


a = [3, 1, 2]
a.sort()
last = a.pop()
print(a, last)
      
  1. [3, 1] 2
  2. [1, 2, 3] 3
  3. [1, 2] 3
  4. [2, 3] 1

sort() aynı list'i sıralar: [1, 2, 3]; pop() son item'ı, 3'ü çıkarıp geri verir.

Python ne yazdırır?


course = ("FIZ127", 3, "B2")
code, credits, letter = course
print(code[:3], credits + 1)
      
  1. FIZ 4
  2. FIZ127 4
  3. FIZ 31
  4. Hata verir

code[:3] ilk üç karakteri alır; credits bir int, 3 + 1 = 4.

Python ne yazdırır?


a = [1, 2]
c = a
c.append(3)
print(a == c, a is c)
      
  1. True True
  2. False True
  3. True False
  4. False False

c = a yeni list yapmaz; a ile c aynı object'tir.

Python ne yazdırır?


a = [10]
b = a
n = len(a)
a.append(11)
print(n, len(b))
      
  1. 1 2
  2. 2 2
  3. 1 1
  4. 2 1

n, append'den önce alınan 1'i gösterir; b ile a aynı list'tir, list 2 item'a çıktı.

Python ne yazdırır?


import random
rolls = []
for i in range(200):
    rolls.append(random.randint(1, 3))
print(0 in rolls, 3 in rolls)
      
  1. True True
  2. False True
  3. True False
  4. False False

randint(1, 3) 0'ı hiç vermez; 3'ü verir ve 200 atışta 3 mutlaka çıkar.

Python ne yazdırır?


def print_credits(code, credits):
    print(code, credits)

print("başla")
print_credits("MAT123", 4)
      
  1. başla MAT123 4
  2. MAT123 4 başla
  3. başla
  4. code credits başla

def yalnızca tanımlar; gövdeyi call'lar çalıştırır.