Ders 5: None, dict, set ve file
17 Kasım 2026, Salı, 18.00, E4
Nezih Arhan Tözenbilek
Hacettepe University, Department of Computer Engineering
IEEE Hacettepe University Student Branch, Güz 2026
def average(a, b):
return (a + b) / 2
x = average(3, 4)
print(x + 1)
4.543.5
4.5TypeErroraverage() 3.5'i return eder; x 3.5'i gösterir, x + 1 de 4.5 verir.
NameError, Step IntoNone, is None, return{key: value}, GRADE_POINTS, get()counts.get(g, 0) + 1set(), add(), &, -, |Function'ın kendi isimleri ve yaşadıkları yer.
Local variable sınavdaki müsvedde kağıdı gibidir: call bitince toplanır, dışarı çıkmaz.
def solve():
local = 5
solve()
print(local)
Function'da oluşan isim dışarıda yoktur; değeri dışarı return ile çıkar.
Traceback (most recent call last): File "…/python-kurs/example.py", line 5, in <module> print(local) ^^^^^NameError: name 'local' is not defined. Did you mean: 'locals'?
Call'ların frame'leri üst üste bir stack'te durur; fikir Bauer ve Samelson'dan.
F7 (Step Into) call'un içine girer; Frames listesi açık frame'leri gösterir.
Bilinmeyen bir değeri tutmak.
Haaland'ın piyasa değerini bilmiyoruz. 0 yazarsak hiç para etmiyor demiş oluruz.
None ertelenen maçın skoru gibidir; 0-0 ise oynanmış bir maçın skorudur.
Numbers(sayılar)
Integral
int7boolTrueReal
float3.5Sequences(diziler)
Immutable
str"7"rangerange(3)tuple(3, 4)Mutable
list[1, 2]Set types(kümeler)
set5AMappings
dict5ANone
NoneTypeNone
market_value = None
print(market_value is None)
print(market_value == 0)
True False
None'ı is None ile kontrol ederiz.
market_value = None
if market_value is None:
print("Değeri bilinmiyor")
Değeri bilinmiyor
Bilinmeyen değer, hesaba girmeden önce if ile ayrılır.
market_value = None
print(150 + market_value)
Traceback (most recent call last): File "…/python-kurs/example.py", line 2, in <module> print(150 + market_value) ~~~~^~~~~~~~~~~~~~TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
None ile hesap yapılamaz.
Hoare 1965'te null reference'ı ekledi; 2009'da ona "milyar dolarlık hatam" dedi.
def greet():
print("Afiyet olsun")
s = greet()
print(s)
Afiyet olsun None
return yazılmayan her function None döndürür.
return'süz function, "Afiyet olsun" yazıp ürün düşürmeyen otomat gibidir: elde None kalır.
Function hesaplar ve return eder; ana program print eder.
def square(x):
return x * x
print(square(4))
16
def calc(x):
print(x * x)
result = calc(4)
print(result)
16
None16
16Nonecalc 16'yı yazdırır ama bir şey döndürmez; result None'ı gösterir.
Bir değeri adıyla bulmak
dict, kantindeki fiyat panosu gibidir: ürünün adı key, fiyatı value.
<isim> = {<key>: <value>, <key>: <value>}
<dict>[<key>]
grades = {"MAT123": "C1", "FIZ127": "B2"}
print(grades)
print(type(grades), len(grades))
{'MAT123': 'C1', 'FIZ127': 'B2'}<class 'dict'> 2
Yazdırınca dict olduğu gibi görünür; len() çift sayısını verir.
Soldaki her kelime bir key, sağdaki karşılığı onun value'su.
swaps = {"Space": "Spaaace"}
print(swaps["Space"])
Spaaace
Numbers(sayılar)
Integral
int7boolTrueReal
float3.5Sequences(diziler)
Immutable
str"7"rangerange(3)tuple(3, 4)Mutable
list[1, 2]Set types(kümeler)
set{1, 2}Mappings
dict{"a": 1}None
NoneTypeNone
dict key'i baştan aramaz; key'den yerini hesaplar.
MAX_GPA = 4.0
print(GRADE_POINTS["A1"] == MAX_GPA)
True
Hiç değişmeyecek değerlerin adı, PEP 8 geleneğiyle büyük harfle yazılır.
grades = {}
print(type(grades), len(grades))
grades["MAT123"] = "C1"
print(grades)
<dict>[<key>] = <value>
<class 'dict'> 0
{'MAT123': 'C1'}
Olmayan bir key'e atama yapılırsa dict'e yeni bir satır eklenir.
Zam gelince usta yeni satır açmaz, eski fiyatın üstüne yazar.
<dict>.get(<key>, <yoksa bu değer>)
get(), annenin "ekmek yoksa simit al" demesi gibidir: aranan yoksa yedeği gelir.
grades = {"MAT123": "C1", "FIZ127": "B2"}
print(grades["mat123"])
Traceback (most recent call last): File "…/python-kurs/example.py", line 2, in <module>2 print(grades["mat123"]) ~~~~~~^^^^^^^^^^3KeyError: 'mat123'1
Olmayan bir key KeyError verir; mat123 ile MAT123 farklıdır.
Bir dict'in bütün satırlarını dolaşmak
for <key ismi>, <value ismi> in <dict>.items():
Sayma, sınıf başkanlığı seçimi gibidir: isim tahtada yoksa yazılır, sonra çizik atılır.
counts = {}
print(counts.get("B2", 0))
counts["B2"] = counts.get("B2", 0) + 1
print(counts)
get(g, 0), ilk kez görülen değer için 0 verir.
0
{'B2': 1}
<sayaç>[<değer>] = <sayaç>.get(<değer>, 0) + 1
F klavyenin tuşları, Türkçede harflerin ne sıklıkla geçtiği sayılarak dizildi.
Her değeri bir kez tutmak
set, gezdiğiniz iller haritası gibidir: Ankara'ya on kez gitseniz de bir kez boyanır.
Kümenin elemanları birbirinden ayrıdır; aynı eleman iki kez bulunmaz.
codes = ["MAT123", "BBM101", "BBM102"]
departments = set()
for code in codes:
departments.add(code[:3])
print(len(departments), "BBM" in departments)
2 True
letters = {"C1", "B2", "C1"}
print(len(letters), "B2" in letters)
2 True
set süslü parantezle de yazılır; tekrar eden değer yine bir kez sayılır.
İki arkadaşın haritasında mine & friend ortak illeri, mine | friend hepsini, mine - friend yalnız sizinkileri verir.
Ortadaki bölge front & wanted: ikisinde de olan tek şey okulun tam adı.
front = {"foto", "haber", "tam ad"}
wanted = {"takvim", "tam ad"}
print(front & wanted)
{'tam ad'}
print(type({}), type(set()))
<class 'dict'> <class 'set'>
{} boş bir dict'tir; boş set set() ile yazılır.
s = {"BBM", "MAT", "BBM"}
e = {}
print(len(s), e == set())
2 False3 True2 True3 Falseset BBM'yi bir kez tutar; {} boş bir dict'tir, boş set'e eşit değildir.
Sırada 5B
with open(), strip(), split(";")"w", "a", write(), \ntranscript.txt, report.txt, AGNOProgram bittikten sonra da kalan veri
Dosya okumak fotokopi çekmek gibidir: kopya memory'ye gelir, asıl kağıt diskte kalır.
Programın satır satır okuyabildiği file düz metindir: .txt gibi.
Şimdilik grades.txt, .py dosyasıyla aynı klasörde durmalı.
with open(<dosya adı>, encoding="utf-8") as <isim>: <dosyayla çalışan satırlar>
with open("grades.txt", encoding="utf-8") as f:
for line in f:
print(line)
for, dosyanın satırlarını sırayla verir.
with open("grades.txt", encoding="utf-8") as f:
for line in f:
print(len(line))
12 12
with open("grades.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
MAT123;4;C1 FIZ127;3;B2
strip(), satırın sonundaki \n'i siler.
Kara delik sinyali bir metin dosyasında: her satırda bir sayı, 32 saniyede 131072 satır.
131072 32.0
with open("grades.txt", encoding="utf-8") as f:
for line in f:
code, credits, grade = line.strip().split(";")
print(code, int(credits) * 2, grade)
MAT123 8 C1 FIZ127 6 B2
open(<dosya adı>, encoding="utf-8")
encoding, F klavye ile Q klavye gibidir: yazanla okuyan aynı düzeni kullanmalıdır.
with open("names.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
with open("names.txt", encoding="cp1254") as f:
for line in f:
print(line.strip())
Büşra Melikşah Büşra MelikÅŸah
UTF-8 ile yazılmış bir file cp1254 ile okununca Büşra, Büşra olur.
open(<dosya adı>, "r", encoding="utf-8")
r sayfayı okur, w sayfayı yırtıp baştan yazar, a kaldığı satırdan sürer.
grades = {}
with open("grades.txt", encoding="utf-8") as f:
for line in f:
code, credits, grade = line.strip().split(";")
grades[code] = grade
print(grades)
{'MAT123': 'C1', 'FIZ127': 'B2'}
Her satır dict'e bir çift olur; boş dict döngüden önce kurulur.
with open("missing.txt", encoding="utf-8") as f:
for line in f:
print(line)
Traceback (most recent call last): File "…/python-kurs/example.py", line 1, in <module>2 with open("missing.txt", encoding="utf-8") as f: ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^3FileNotFoundError: [Errno 2] No such file or directory: 'missing.txt'1
Dosya yoksa ya da başka klasördeyse bu hata gelir.
name = "missing.txt"
try:
with open(name, encoding="utf-8") as f:
for line in f:
print(line.strip())
except FileNotFoundError:
print(name, "bulunamadı")
Ders 4'teki try burada da çalışır: program mesajla devam eder.
missing.txt bulunamadı
Memory'deki sonucu diskteki bir file'a kaydetmek.
Program bitince memory boşalır; yalnızca file'a yazılan sonuç kalır.
report.txt, log.txt, history.txt
with open(<dosya adı>, "w", encoding="utf-8") as <isim>: <isim>.write(<str>)
"w", "Üzerine yazılsın mı?" diye sormayan bir Kaydet düğmesi gibidir.
with open("report.txt", "w", encoding="utf-8") as f:
f.write("AGNO: 3.08\n")
write() ekrana değil, file'a yazar.
with open("codes.txt", "w", encoding="utf-8") as f:
f.write("MAT123")
f.write("FIZ127")
with open("codes.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
MAT123FIZ127
with open("codes.txt", "w", encoding="utf-8") as f:
f.write("MAT123\n")
f.write("FIZ127\n")
with open("codes.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
MAT123 FIZ127
with open("log.txt", "w", encoding="utf-8") as f:
f.write("spam\n")
with open("log.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
with open(<dosya adı>, "a", encoding="utf-8") as <isim>: <isim>.write(<str>)
with open("log.txt", "a", encoding="utf-8") as f:
f.write("spam\n")
with open("log.txt", encoding="utf-8") as f:
for line in f:
print(line.strip())
Yazılan file, .py dosyasıyla aynı klasörde görünür.
"r", "w" ve "a" harfleri C dilinin fopen() function'ından geliyor.
open("log.txt", "a", encoding="utf-8")
with open("test.txt", "w",
encoding="utf-8") as f:
f.write("bir")
print("iki")
f.write("üç\n")
birikiüçbir
iki
üçikiEkrana yalnızca print yazar; iki write test.txt'ye gider.
Beş haftanın parçaları tek bir programda
Numbers(sayılar)
Integral
int7boolTrueReal
float3.5Sequences(diziler)
Immutable
str"7"rangerange(3)tuple(3, 4)Mutable
list[1, 2]Set types(kümeler)
set{1, 2}Mappings
dict{"a": 1}None
NoneTypeNoneOn type'ın hepsini tanıyorsunuz.
Kursun bittiği yerden açılan kapılar
import matplotlib.pyplot as plt
codes = ["MAT123", "FIZ127",
"BBM101", "TKD103"]
points = [2.50, 3.00, 3.50, 3.75]
plt.rcParams["font.size"] = 24
plt.figure(figsize=(4.6, 3.8))
plt.barh(codes, points,
color="#49B0D7")
plt.axvline(3.08, color="#181C3E",
linewidth=3)
plt.title("Katsayılar ve AGNO")
plt.savefig("grades.png", dpi=200,
bbox_inches="tight")
Aynı notlar, matplotlib ile bir grafikte.
Python for Everybody (Ek kaynaklar)
Kurulumla gelmeyen paketler PyPI'dadır; eski takma adı Cheese Shop, bir Monty Python skecidir.
pip install matplotlib
latest_grade = {"MAT123": "C1", "FIZ127": "B2",
"BBM101": "A3", "TKD103": "A2"}
for code, grade in latest_grade.items():
name = f"{code}.txt"
with open(name, "w", encoding="utf-8") as f:
f.write(f"{code} {grade}\n")
print(len(latest_grade), "file yazıldı")
4 file yazıldı
Dört derse dört file; yüz derse de aynı loop yeter.
Automate the Boring Stuff (Ek kaynaklar)
Ödev 5'in son görevinde kahve falı programını kendiniz yazıyorsunuz.
Son gün: 22 Kasım Pazar, 23.59
İsteğe bağlı; bağlantılar Ek kaynaklar sayfasında.
Dersten sonra kendi başınıza: önce soruyu çözün, tıklayınca cevap gelir.
def f(x):
x = x + 1
return x
x = 5
y = f(x)
print(x, y)
6 65 5NameError5 6Parameter x, call'un içinde ayrı bir isimdir; dönen 6 y'ye bağlanır.
def calc(x):
return x * x
result = calc(4)
print(result)
16
None16Nonecalc 16'yı return eder; ekrana yalnızca son satırdaki print yazar.
grades = {"MAT123": "C1"}
grades["BBM101"] = "F3"
grades["BBM101"] = "A3"
print(len(grades), grades["BBM101"])
3 A32 F3KeyError2 A3Var olan bir key'e atama value'nun üstüne yazar; dict'te 2 key var.
counts = {}
for c in ["B", "B", "M"]:
counts[c] = counts.get(c, 0) + 1
print(counts["B"], len(counts))
1 22 22 3KeyErrorget(c, 0) ilk B'de 0, ikinci B'de 1 verir; iki farklı harf, iki key.
points = {"A1": 4.0, "B1": 3.25}
print("A1" in points, 4.0 in points)
True TrueFalse TrueKeyErrorTrue Falsedict üzerinde in yalnızca key'lere bakar; 4.0 bir value'dur.
name = "grades.txt"
with open(name, encoding="utf-8") as f:
for line in f:
parts = line.strip().split(";")
print(parts[0], len(parts))
MAT123 11
FIZ127 11MAT123 3
(boş satır)
FIZ127 3MAT123 3
FIZ127 3M 3
F 3strip() \n'i siler, split(";") 3 parça yapar; parts[0] ders kodudur.