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])
FIZ1 127 I
FIZ 127 I
FIZ 27 I
FIZ 127 F
[:3] ilk üç, [-3:] son üç karakter; code[1] ikinci karakter.
4A konuları
1. List[ ], index, len(), + ve *
2. List üzerinde for ve split()for, sum(), split()
3. List'i değiştirmekappend(), remove(), pop(), sort()
4. Tuple ve unpacking( ), course[0], x, y = (3, 4)
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)
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
Numbers (sayılar)
Integral
Real
Sequences (diziler)
Immutable
str"7"rangerange(3)tuple(3, 4)
Mutable
Set types (kümeler)
Mappings
None
bu derste daha önce sonraki 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.
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 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"
Busa ve Index Thomisticus (1946-1980)
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çersiz Geç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.
Eratosthenes'in eleği ve Horsley (1772)
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()
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.
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.
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)
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.
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.
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
Numbers (sayılar)
Integral
Real
Sequences (diziler)
Immutable
str"7"rangerange(3)tuple(3, 4)
Mutable
Set types (kümeler)
Mappings
None
bu derste daha önce sonraki derslerde
Liskov ve CLU (1979)
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)
True True
False True
True False
False False
b ile a aynı list'tir; c ayrı bir list ve değeri artık farklı.
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ı
6. try, except ve exceptiontry, except ValueError, while True
7. import ve moduleimport math, import random, import this
8. def, call ve parameterdef, say_hello("Yusuf"), pass
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.
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
F8 Step Over şu anki satır F8'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.
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
F8 Step Over şu anki satır F8'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
Traceback alttan yukarı okunur; mavi bağlantı hatalı satıra götürür.
1 exception'ın adı 2 mavi 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.
Python ne yazdırır?
try:
x = int("3.5")
print("A")
except ValueError:
print("B")
B
A
A
B
ValueError
int("3.5") hata verir; print("A") atlanır, except çalışır.
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'?
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.
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ı
3481574400000000000000000000 23167155402723514560441574035127259373026
Herkes evrenin başından beri saniyede bir deste karıştırsaydı, 52 faktöriyele yine yaklaşamazdı.
ModuleNotFoundError
import math
import numpy
Çıktı
Traceback (most recent call last): File "…/python-kurs/example.py", line 2, in <module> import numpy ModuleNotFoundError: 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.
EDSAC'ın subroutine library'si (1949-1951)
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.
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.
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.
Euler ve f(x) yazımı (1734)
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.
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.
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)
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
A
A
1
1
A
return 1 function'ı bitirir; print("A") hiç çalışmaz.
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 Birçok değeri tek bir list'te tutup değiştirmek 2 Bir kaydı tuple ile tutup unpacking ile açmak 3 İki ismin aynı list'i gösterdiğini fark etmek 4 Hatalı girişi try/except ile yakalamak 5 Hazır module'leri import edip kullanmak 6 Kendi 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)
C1 3
False
B2 3
False
B2 2
False
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])
4
2021
3
2019
4
2019
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])
3 TKD
20 TKD
3 103
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)
[3, 1] 2
[1, 2, 3] 3
[1, 2] 3
[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)
FIZ 4
FIZ127 4
FIZ 31
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)
True True
False True
True False
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 2
2 2
1 1
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)
True True
False True
True False
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)
başla
MAT123 4
MAT123 4
başla
başla
code credits
başla
def yalnızca tanımlar; gövdeyi call'lar çalıştırır.