Her Geliştiricinin Ustalaşması Gereken Temel Python Komutları
Python, okunabilirlik ve ifade edici sözdizimi üzerine inşa edilmiş, yüksek seviyeli, yorumlanan bir programlama dilidir. G/Ç, tür dönüşümü, kontrol akışı, veri yapıları, dosya işleme ve modül içe aktarmayı kapsayan temel yerleşik komutları, geliştiricilerin karmaşık görevleri son derece az satır kodla gerçekleştirmesine olanak tanır.
Bu referans, giriş düzeyindeki eğitimlerin ötesine geçen uç durumlar, yaygın tuzaklar ve üretime yönelik nüanslar dahil olmak üzere en kritik Python komutlarını derinlemesine ele almaktadır. Bir VPS Hosting ortamında sunucu görevlerini otomatikleştiriyor, bir Django API’si oluşturuyor veya büyük veri kümelerini işliyor olun, bu temeller her Python iş akışının temelini oluşturur.
Giriş ve Çıkış Komutları
`print()` Fonksiyonu
`print()` varsayılan olarak `stdout`’a çıktı yazar. Tam imzası şöyledir:
“`python
print(*objects, sep=' ', end='n', file=sys.stdout, flush=False)
“`
Çoğu geliştirici yalnızca konumsal argümanları kullanır, ancak anahtar kelime parametreleri üretimde önem taşır:
- `sep` birden fazla nesne arasındaki ayırıcıyı kontrol eder (varsayılan: tek boşluk).
- `end` sonlandırma karakterini kontrol eder (varsayılan: yeni satır). `end=''` ayarı, ilerleme göstergeleri ve satır içi çıktı için kritik öneme sahiptir.
- `file` çıktıyı herhangi bir yazılabilir akışa yönlendirir — yapılandırılmış günlükleri doğrudan bir dosya nesnesine yazmak için kullanışlıdır.
- `flush=True` tamponun hemen boşaltılmasını zorlar; bu, gerçek zamanlı olarak uzun süre çalışan süreçleri izlerken gereklidir.
“`python
Practical example: progress output without newlines
import time
for i in range(5):
print(f"Processing step {i+1}/5…", end='r', flush=True)
time.sleep(0.5)
print("Done. ")
“`
Tuzak: Üretim kodunda günlükleme için `print()` kullanmak bir anti-kalıptır. Bunun yerine `logging` modülünü kullanın — `stdout`’a dokunmadan günlük seviyeleri, zaman damgaları ve yapılandırılabilir işleyiciler sağlar.
`input()` Fonksiyonu
`input()`, `stdin`’dan bir satır okur, sondaki yeni satırı kaldırır ve bunu `str` olarak döndürür. İstem argümanı isteğe bağlıdır, ancak etkileşimli betikler için her zaman dahil edilmelidir.
“`python
name = input("Enter your name: ")
print(f"Hello, {name}")
“`
Kritik uç durum: `input()` yürütmeyi süresiz olarak engeller. Otomatik ardışık düzenlerde veya bir sunucuda çalışan betiklerde, beklenmedik bir `input()` çağrısı süreci askıya alır. Etkileşimli istemleri her zaman ortam kontrolleriyle koruyun veya etkileşimli olmayan girdi için `argparse` / `sys.argv` kullanın.
Sayısal girdi için tür dönüşümü zorunludur:
“`python
try:
age = int(input("Enter your age: "))
except ValueError:
print("Invalid input: please enter a whole number.")
“`
Kullanıcı tarafından sağlanan verilere dokunan herhangi bir kodda `input()` çıktısını `try/except` bloğu olmadan asla dönüştürmeyin.
Değişkenler, Veri Türleri ve Tür İncelemesi
`type()` ve `isinstance()`
`type()` bir nesnenin tam sınıfını döndürür. Ancak çoğu üretim kodunda, kalıtım hiyerarşilerine saygı gösterdiği için `isinstance()` tercih edilen araçtır.
“`python
num = 42
print(type(num)) # <class 'int'>
print(isinstance(num, int)) # True
print(isinstance(num, (int, float))) # True — checks multiple types at once
“`
Her birinin ne zaman kullanılacağı:
| Kullanım Durumu | Önerilen Fonksiyon |
|---|
| — | — |
|---|
| Tam tür kontrolü (alt sınıf yok) | `type(x) is SomeClass` |
|---|
| Polimorfik / kalıtım farkındalıklı kontrol | `isinstance(x, SomeClass)` |
|---|
| Hata ayıklama ve inceleme | `type(x)` |
|---|
| Duck-typing doğrulaması | `hasattr(x, 'method_name')` |
|---|
Tür Dönüşümü: `int()`, `float()`, `str()`, `bool()`
Bunlar, basit dönüştürme operatörleri değil, Python’ın yerleşik türleri için yapıcı fonksiyonlardır. Sınıfın `__init__` metodunu çağırır ve geniş bir girdi yelpazesini kabul edebilirler.
“`python
int() with a base argument — often overlooked
binary_str = "1010"
print(int(binary_str, 2)) # Output: 10 (binary to decimal)
print(int("0xFF", 16)) # Output: 255 (hex to decimal)
bool() truthiness rules
print(bool(0)) # False
print(bool("")) # False
print(bool([])) # False
print(bool("False")) # True — non-empty string is always truthy
“`
Tuzak: `bool("False")`, boş olmayan bir dize olduğu için `True` olarak değerlendirilir. Bu durum, yapılandırma değerlerini ayrıştırırken birçok geliştiricinin gafil avlanmasına neden olur.
`len()`
`len()`, nesnenin `__len__` metodunu çağırır ve bir tamsayı döndürür. Dizeler, listeler, demetler, sözlükler, kümeler ve `__len__` uygulayan herhangi bir özel sınıf üzerinde çalışır.
“`python
text = "Python"
print(len(text)) # 6
data = {"a": 1, "b": 2}
print(len(data)) # 2 — counts keys, not key-value pairs
“`
Uç durum: Bir üretece `len()` uygulamak, üreçlerin tanımlı bir uzunluğu olmadığı için `TypeError` hatası fırlatır. Üreteci tüketmesine rağmen üretec öğelerini saymak için `sum(1 for _ in generator)` kullanın.
Kontrol Akışı Komutları
Koşullu İfadeler: `if`, `elif`, `else`
Python, koşulları katı boolean karşılaştırması yerine doğruluk değeri kullanarak değerlendirir. Yanlış değerleri anlamak çok önemlidir:
- Yanlış: `None`, `0`, `0.0`, `""`, `[]`, `{}`, `set()`, `False`
- Diğer her şey doğrudur
“`python
user_input = ""
if user_input:
print("Input received.")
else:
print("No input provided.") # This branch executes
“`
Üçlü ifade (satır içi koşul):
“`python
status = "adult" if age >= 18 else "minor"
“`
Yapısal örüntü eşleştirme (Python 3.10+): Karmaşık dallanma mantığı için `match/case`, uzun `elif` zincirlerinden daha okunabilirdir:
“`python
command = "start"
match command:
case "start":
print("Starting service…")
case "stop":
print("Stopping service…")
case _:
print("Unknown command.")
“`
Döngüler: `for` ve `while`
`for` döngüleri herhangi bir yinelenebilir üzerinde yineleme yapar. `range()` fonksiyonu, büyük aralıklar için bile bellek açısından verimli olmasını sağlayan tamsayı dizilerini tembel olarak üretir.
“`python
range(start, stop, step)
for i in range(0, 10, 2):
print(i) # 0, 2, 4, 6, 8
“`
`enumerate()`, hem dizin hem de değeri almanın doğru yoludur — `range(len(iterable))` kullanmaktan kaçının:
“`python
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")
“`
`while` döngüleri açık sonlandırma mantığı gerektirir. Döngü koşulunun `False` olabileceğinden her zaman emin olun veya bir `break` ifadesi ekleyin:
“`python
attempts = 0
max_attempts = 3
while attempts < max_attempts:
response = input("Enter password: ")
if response == "secret":
print("Access granted.")
break
attempts += 1
else:
The 'else' clause on a while loop executes if the condition
becomes False without hitting 'break' — a rarely used but powerful feature
print("Too many failed attempts.")
“`
Döngü kontrol anahtar kelimeleri:
- `break` — döngüden hemen çıkar
- `continue` — mevcut yinelemenin geri kalanını atlar
- `pass` — boş bloklarda yer tutucu olarak kullanılan null ifadesi
Yerleşik Veri Yapıları
Python’ın dört temel yerleşik veri yapısının her birinin farklı performans özellikleri ve uygun kullanım durumları vardır.
Python Veri Yapılarının Karşılaştırması
| Yapı | Sıralı | Değiştirilebilir | Yinelemeler | Anahtar-Değer | Arama Süresi |
|---|
| — | — | — | — | — | — |
|---|
| `list` | Evet | Evet | Evet | Hayır | O(n) |
|---|
| `tuple` | Evet | Hayır | Evet | Hayır | O(n) |
|---|
| `dict` | Evet (3.7+) | Evet | Anahtarlar: Hayır | Evet | O(1) ort. |
|---|
| `set` | Hayır | Evet | Hayır | Hayır | O(1) ort. |
|---|
| `frozenset` | Hayır | Hayır | Hayır | Hayır | O(1) ort. |
|---|
Listeler
Listeler dinamik dizilerdir. Temel işlemler ve zaman karmaşıklıkları:
“`python
fruits = ["apple", "banana", "cherry"]
fruits.append("orange") # O(1) amortized — adds to end
fruits.insert(1, "mango") # O(n) — shifts elements right
fruits.remove("banana") # O(n) — searches then removes
popped = fruits.pop() # O(1) — removes from end
popped_idx = fruits.pop(0) # O(n) — removes from beginning, avoid in hot loops
List comprehension — faster than equivalent for loop
squares = [x**2 for x in range(10)]
“`
Tuzak: `list.insert(0, item)` veya `list.pop(0)` işlemini tekrar tekrar kullanmak, işlem başına O(n) maliyetlidir. Kuyruk davranışı için, her iki uçtan O(1) ekleme ve çıkarma sağlayan `collections.deque` kullanın.
Sözlükler
Python 3.7’den itibaren sözlükler, ekleme sırasını bir dil garantisi olarak korur (yalnızca bir uygulama ayrıntısı değil).
“`python
person = {"name": "Alice", "age": 30, "role": "engineer"}
Safe key access — avoids KeyError
city = person.get("city", "Unknown") # Returns "Unknown" if key absent
Iterating
for key, value in person.items():
print(f"{key}: {value}")
Dictionary comprehension
squared = {x: x**2 for x in range(5)}
Merging dicts (Python 3.9+)
defaults = {"timeout": 30, "retries": 3}
config = {"timeout": 60}
merged = defaults | config # config values override defaults
“`
Kümeler
Kümeler dahili olarak hash tabloları kullanır ve büyük koleksiyonlar için listelerden çok daha hızlı olan O(1) ortalama durum üyelik testi sağlar.
“`python
unique_ids = {101, 202, 303, 101} # Duplicate 101 is silently dropped
print(unique_ids) # {101, 202, 303}
Set operations — extremely useful for data deduplication
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # Intersection: {3, 4}
print(a | b) # Union: {1, 2, 3, 4, 5, 6}
print(a – b) # Difference: {1, 2}
print(a ^ b) # Symmetric difference: {1, 2, 5, 6}
“`
Fonksiyonlar: `def`, `return` ve `lambda`
`def` ile Fonksiyon Tanımlama
“`python
def calculate_discount(price, discount=0.10):
"""
Returns the discounted price.
Args:
price (float): Original price.
discount (float): Discount rate as a decimal. Default is 10%.
Returns:
float: Price after discount.
"""
return price * (1 – discount)
print(calculate_discount(100)) # 90.0
print(calculate_discount(100, 0.25)) # 75.0
“`
`*args` ve `kwargs`, fonksiyonların değişken sayıda argüman kabul etmesine olanak tanır:
“`python
def log_event(event_type, *messages, **metadata):
print(f"[{event_type}]", " | ".join(messages))
for key, value in metadata.items():
print(f" {key}: {value}")
log_event("ERROR", "Connection failed", "Retrying…", host="db01", port=5432)
“`
Tuzak — değiştirilebilir varsayılan argümanlar: Varsayılan argüman değeri olarak asla değiştirilebilir bir nesne (liste, sözlük) kullanmayın. Her çağrıda değil, fonksiyon tanımı sırasında bir kez oluşturulur:
“`python
WRONG — the list persists between calls
def add_item(item, items=[]):
items.append(item)
return items
CORRECT
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
“`
Lambda Fonksiyonları
Lambda ifadeleri, anonim tek ifadeli fonksiyonlar oluşturur. En çok `sorted()`, `map()` ve `filter()` gibi yüksek dereceli fonksiyonlara argüman olarak kullanışlıdır.
“`python
Sorting a list of dicts by a specific key
users = [{"name": "Charlie", "age": 25}, {"name": "Alice", "age": 30}]
sorted_users = sorted(users, key=lambda u: u["age"])
filter() with lambda
even_numbers = list(filter(lambda x: x % 2 == 0, range(10)))
[0, 2, 4, 6, 8]
map() with lambda
doubled = list(map(lambda x: x * 2, [1, 2, 3]))
[2, 4, 6]
“`
Lambda ne zaman kullanılmamalı: Fonksiyon gövdesi karmaşıksa veya bir docstring gerektiriyorsa, `def` kullanın. PEP 8, bir lambda’yı değişken adına atamayı açıkça önerir — bunun için `def` vardır.
Dosya İşleme
`open()`, `read()`, `write()` ve `with` İfadesi
`open()` fonksiyonu bir dosya nesnesi döndürür. Tam imzası bir `mode` ve `encoding` parametresi içerir:
“`python
Always specify encoding explicitly — avoids platform-dependent behavior
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
“`
Dosya modları:
| Mod | Açıklama |
|---|
| — | — |
|---|
| `"r"` | Okuma (varsayılan). Dosya yoksa `FileNotFoundError` hatası fırlatır. |
|---|
| `"w"` | Yazma. Dosya oluşturur veya mevcut içeriği keser. |
|---|
| `"a"` | Ekleme. Dosya yoksa oluşturur, varsa sonuna ekler. |
|---|
| `"x"` | Özel oluşturma. Dosya mevcutsa `FileExistsError` hatası fırlatır. |
|---|
| `"b"` | İkili mod (diğerleriyle birleştirin: `"rb"`, `"wb"`). |
|---|
| `"+"` | Okuma ve yazma (diğerleriyle birleştirin: `"r+"`, `"w+"`). |
|---|
Okuma stratejileri:
“`python
Read entire file into memory — fine for small files
with open("config.txt", "r", encoding="utf-8") as f:
content = f.read()
Read line by line — memory-efficient for large files (logs, datasets)
with open("server.log", "r", encoding="utf-8") as f:
for line in f:
process(line.strip())
Read all lines into a list
with open("hosts.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
“`
Üretimde `with` neden zorunludur: `with` ifadesi, blok içinde bir istisna oluşsa bile dosyanın kapatılmasını garanti etmek için bağlam yöneticisi protokolünü (`__enter__` / `__exit__`) kullanır. `f.close()`’ı manuel olarak çağırmak hataya açıktır — `close()`’dan önce bir istisna oluşursa, dosya tanımlayıcısı sızar.
Tuzak: Bir dosyayı `"w"` modunda açmak, herhangi bir şey yazmadan önce bile dosyayı hemen sıfır bayta keser. Yazma mantığınız başarısız olursa, orijinal içerik zaten kaybolmuştur. `"x"` modunu kullanın veya geçici bir dosyaya yazıp atomik olarak yeniden adlandırın:
“`python
import os
import tempfile
with tempfile.NamedTemporaryFile("w", delete=False, encoding="utf-8") as tmp:
tmp.write(new_content)
tmp_path = tmp.name
os.replace(tmp_path, "config.txt") # Atomic on POSIX systems
“`
Modül İçe Aktarma
`import`, `from … import` ve `as`
Python’ın modül sistemi en büyük güçlerinden biridir. Standart kütüphane kriptografi, ağ iletişimi, eşzamanlılık, veri serileştirme ve çok daha fazlasını kapsar.
“`python
import math
print(math.sqrt(144)) # 12.0
print(math.ceil(4.2)) # 5
print(math.floor(4.9)) # 4
Import specific names into the current namespace
from os.path import join, exists, dirname
Alias long module names
import numpy as np
import pandas as pd
“`
Sunucu taraflı Python için kullanışlı standart kütüphane modülleri:
| Modül | Amaç |
|---|
| — | — |
|---|
| `os` / `pathlib` | Dosya sistemi işlemleri, yol düzenleme |
|---|
| `sys` | Yorumlayıcı durumu, `argv`, `stdin`/`stdout`/`stderr` |
|---|
| `subprocess` | Sistem süreçlerini başlatma ve iletişim kurma |
|---|
| `logging` | Seviyeler ve işleyicilerle üretim kalitesinde günlükleme |
|---|
| `json` | JSON verilerini serileştirme/seri çözme |
|---|
| `re` | Düzenli ifadeler |
|---|
| `datetime` | Tarih ve saat aritmetiği |
|---|
| `collections` | `deque`, `Counter`, `defaultdict`, `OrderedDict` |
|---|
| `itertools` | Bellek açısından verimli yineleme birleştiricileri |
|---|
| `functools` | `lru_cache`, `partial`, `reduce` |
|---|
| `threading` / `multiprocessing` | Eşzamanlılık ve paralellik |
|---|
| `socket` | Düşük seviyeli ağ iletişimi |
|---|
| `hashlib` | Kriptografik karma (SHA-256, MD5, vb.) |
|---|
Üçüncü Taraf Paketlerin Yönetimi
Standart kütüphanenin ötesinde, Python Paket Dizini (PyPI) 500.000’den fazla paket barındırır. Bunları yüklemek için `pip` kullanın ve her zaman sanal ortam içinde çalışın:
“`bash
Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS
.venvScriptsactivate.bat # Windows
Install packages
pip install requests flask gunicorn
Freeze dependencies for reproducible deployments
pip freeze > requirements.txt
Recreate environment on another machine
pip install -r requirements.txt
“`
Tuzak: Paketleri global olarak (sanal ortam olmadan) yüklemek, sistem Python’ını kirletir ve projeler arasında bağımlılık çakışmalarına neden olur. Bir üretim VPS Hosting sunucusunda her zaman proje başına sanal ortamlar veya konteynerleştirme kullanın.
Bir Sunucuda Python Uygulamalarını Dağıtma
Python komutlarını anlamak resmin yalnızca yarısıdır. Python kodunu bir sunucu ortamında güvenilir biçimde çalıştırmak ek değerlendirmeler gerektirir.
Bir cPanel ile VPS veya çıplak bir Linux VPS üzerinde Flask ya da Django uygulaması dağıtırken standart iş akışı şunları içerir:
- Bir WSGI sunucusu (Gunicorn, uWSGI) Python uygulamasını sunmak için
- Bir ters proxy (Nginx, Apache) SSL sonlandırma ve statik dosyaları işlemek için
- Bir süreç yöneticisi (systemd, Supervisor) uygulamanın çökmeler ve yeniden başlatmalar sonrasında çalışmaya devam etmesini sağlamak için
- Gizli bilgiler için ortam değişkeni yönetimi (kimlik bilgilerini asla sabit kodlamayın)
“`bash
Example: running a Flask app with Gunicorn
gunicorn –workers 4 –bind 0.0.0.0:8000 wsgi:app
Example: systemd service unit for auto-restart
/etc/systemd/system/myapp.service
[Unit]
Description=My Python App
After=network.target
[Service]
User=deploy
WorkingDirectory=/var/www/myapp
ExecStart=/var/www/myapp/.venv/bin/gunicorn –workers 4 –bind 0.0.0.0:8000 wsgi:app
Restart=always
[Install]
WantedBy=multi-user.target
“`
Makine öğrenmesi çıkarımı veya büyük ölçekli veri işleme gibi kaynak yoğun iş yükleri için GPU Hosting, NumPy, TensorFlow ve PyTorch işlemlerini önemli ölçüde hızlandıran CUDA destekli donanım sağlar.
Python uygulamanız işlemsel e-postalar gönderiyorsa veya posta listelerini yönetiyorsa, bunu özel bir E-posta Hosting hizmetiyle eşleştirmek, yerel bir `sendmail` kurulumuna güvenmek yerine güvenilir teslimat ve uygun SPF/DKIM yapılandırması sağlar.
Temel Kontrol Listesi
Bunu dağıtım öncesi ve kod inceleme referansı olarak kullanın:
- G/Ç: Gözetimsiz çalışan herhangi bir kodda `print()`’ı `logging` modülüyle değiştirin. `input()`’ı her zaman `try/except ValueError` içine alın.
- Tür kontrolü: Doğrulama mantığı için `isinstance()`’ı `type()` yerine tercih edin. `bool("False")`’ın `True` olduğunu unutmayın.
- Veri yapıları: O(1) aramalar için `dict` veya `set` kullanın. Kuyruk gerektiğinde `collections.deque`’ı `list` yerine kullanın.
- Fonksiyonlar: Varsayılan argüman değerleri olarak asla değiştirilebilir nesneler kullanmayın. Tüm genel fonksiyonları docstring ile belgeleyin.
- Dosya işleme: Her zaman `with open(…)` kullanın ve `encoding="utf-8"`’ı her zaman açıkça belirtin. Kritik dosyalar için atomik yazma kullanın.
- Modüller: Her zaman sanal ortam içinde çalışın. Bağımlılıkları `pip freeze > requirements.txt` ile sabitleyin.
- Kontrol akışı: Döngü sonrası mantık için `else` / `for` döngülerindeki `while` yan tümcesinden yararlanın. Karmaşık dallanma için `match/case` (Python 3.10+) kullanın.
- Dağıtım: Gizli bilgiler için bir WSGI sunucusu, süreç yöneticisi ve ortam değişkenleri kullanın. Flask geliştirme sunucusunu asla üretimde çalıştırmayın.
Sıkça Sorulan Sorular
Python’da `print()` ile `logging` arasındaki fark nedir?
`print()` doğrudan `stdout`’a meta veri olmadan yazar. `logging` modülü, `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` gibi önem seviyeleri, zaman damgaları, modül adları ve yapılandırılabilir çıktı hedefleri sağlar. Üretimde veya arka plan hizmeti olarak çalışan herhangi bir betik için `logging` doğru araçtır.
Python’ın `input()`’ı neden her zaman bir dize döndürür?
`input()`, `stdin`’dan ham baytları okur ve bunları metin olarak çözer. Python, kullanıcının bir sayı, tarih veya dize sağlamayı amaçlayıp amaçlamadığını bilemez; bu nedenle en genel türü (`str`) döndürür ve tür dönüşümünü geliştiriciye bırakır. Bu tasarım, örtük zorlamadan daha güvenli olan açık doğrulamayı zorunlu kılar.
Üyelik testi için `list` ile `set` arasındaki performans farkı nedir?
`x in my_list` kontrolü O(n)’dir — Python her öğeyi tarar. `x in my_set` kontrolü, kümeler hash tablosu kullandığından ortalamada O(1)’dir. Üyeliği sık sık test ettiğiniz birkaç düzineden fazla öğe içeren koleksiyonlar için `set`’e dönüştürmek büyük bir hız iyileştirmesi sağlar.
`lambda` yerine ne zaman `def` fonksiyonu kullanmalıyım?
`lambda`’ı yalnızca kısa, tek ifadeli bir fonksiyonu başka bir fonksiyona argüman olarak geçirirken kullanın (örn. `sorted()`, `map()`, `filter()`). Mantık birden fazla ifade gerektiriyorsa, hata işleme ihtiyacı varsa veya başka yerlerde yeniden kullanılacaksa `def` ile tanımlayın. Bir `lambda`’yı değişken adına atamak PEP 8 tarafından açıkça önerilmez.
Bir Linux sunucusunda yeniden başlatmanın ardından Python betiğini otomatik olarak nasıl çalıştırabilirim?
En sağlam yöntem, `Restart=always` ve `WantedBy=multi-user.target` ile bir `systemd` servis birimi kullanmaktır. Alternatif olarak, betiği `@reboot /path/to/venv/bin/python /path/to/script.py` ile `crontab`’a ekleyin. `systemd` yaklaşımı tercih edilir çünkü `journalctl` aracılığıyla günlükleme, bağımlılık sıralaması ve ayrıntılı yeniden başlatma politikaları sağlar.
