Python & Algoritma
Tags: python, algorithms
Published: 2023-04-03 02:30:37

Sorular ve daha fazlası için [tıklayınız](https://github.com/erkamesen/Python-ve-Algoritma).
# Python-ve-Algoritma

<div style="width:100%;height:0;padding-bottom:43%;position:relative;">
<img src="https://media.giphy.com/media/eChf44Gyj2VrO/giphy.gif">
</div>
# Algoritma
# Algoritma Nedir ?

Problemlerin çözümünün mantıksal sıralamasıdır.Günlük hayatta yapacağımız işler için hazırladığımız planlar aslında algoritmanın günlük hayatta kullanıldığının ispatıdır.Tüm programlama dillerinin temeli algoritmadır. <br>
Önemli algoritma türleri: 
- Arama algoritmaları
- Bellek yönetimi algoritmaları
- Bilgisayar grafiği algoritmaları
- Birleşimsel algoritmalar
- Genetik algoritmalar
- Optimizasyon algoritmaları vb.



## Akış Diyagramları 

Algoritmanın belirli semboller yardımı ile görsel bir şekilde oluşturulmasında yardımcı olur. Programlamaya başlarken planlı hareket etmek ve uygulamanın karanlık yollarında kaybolmamak için önemlidir

<img src="https://user-images.githubusercontent.com/120065120/219083131-e7772ee6-5b96-4df3-adb2-9716348446c0.png" width=500px alt="Akış Diyagramı">

## Operatörler

### İşlem Operatörleri

- Toplama operatörü: **+ (artı)**
- Çarpma operatörü: **\* (yıldız)**
- Çıkarma operatörü: **– (eksi)** 
- Bölme operatörü: **/ (slash)** 
- Üs alma operatörü: **^ (caret)** 
- Mod operatörü: **% (yüzde)** 

#### İşlem Önceliği
1) Parantez içleri
2) Üs alma işlemleri
3) Çarpma ve bölme işlemleri
4) Toplama ve çıkarma işlemleri

### Karşılaştırma Operatörleri

- Eşit mi operatörü: **==** simgesi ile ifade edilir.
- Eşit değil mi operatörü: **!=** simgesi ile ifade edilir.
- Küçüktür operatörü: **<** simgesi ile ifade edilir.
- Büyüktür operatörü: **>** simgesi ile ifade edilir.
- Küçük veya eşittir operatörü: **<=** simgesi ile ifade edilir.
- Büyük veya eşittir operatörü: **>=** simgesi ile ifade edilir.

### Mantıksal Operatörler

- Ve(and) operatörü && simgesi ile ifade edilir.Python da "and" ile ifade edilir. True dönmesi için tüm durumların True olması gerekiyor.
- Veya(or) operatörü II simgesi ile ifade edilir.Python da "or" ile ifade edilir. True dönmesi için her hangi bir durumun True olması gerekiyor.
- Değil (not) operatörü ! simgesi ile ifade edilir.Python da "not" veya "!" ile ifade edilir. Durum True ise False, False ise True döndürüyor.

# Python
## Temel Veri Tipleri

integer, float, boolean, string, bytes 

- int: 783, 0, -192, 0b019(binary), 0o0642(octal), 0xF3(hexa)
- float: 9.23, 0.0, -1.7e-6
- bool: True, False
- str: "DörtBeş", "21", "Ben\nErkam"
- bytes: b"toto\xfe\775"

☝️☝️ immutables

## Container Veri Tipleri
### Sıralı Diziler
hızlı index erişimi ve tekrarlanabilir değer
- list: [7, 8, 3, 4], ["z", 5, 0.3], ["eko"] [] -> Mutable
- tuple: (7, 8, 3, 4), 5, 0.3, "z", ("eko",) () -> Immutable
- str bytes: b"" -> Immutable
### Key Containers
Hızlı anahtar erişimi ve her anahtar unique
- dictionary -> dict {"key":"value"} dict(a=2, b=0.3, c="sa") {}
- collection -> set {"key1", "key2"} {1, 9, 3, 0} set() 

## Değişken Tanımlama

Python programlarımızda bellekte geçici olarak veri saklamak için oluşturduğumuz alanlara değişken denir.Eşitliğin sağ tarafı değerimizi
sol tarafı ise değişkenimizin adını gösterir.

x=2 <br>
\# 2 -> integer

a=b=c=0 -> 3 Farklı değşkene aynı değeri atamak <br>
\# 0 -> integer

y, z, r=0.2, -7.6, 0 - Çoklu değişken atama
\# y=0.2, z=-7.6, r=0 

a, b=b, a değişken swap leme

- - - 
Dizi Açılımı
a, *b = seq <br>
*a , b = seq

```
a, *b = ["a", 2, True, 3.2, "c"]
# a = "a"
# b = [2, True, 3.2, 'c']
```
```
*a, b = ["a", 2, True, 3.2, "c"]
# a = ['a', 2, True, 3.2]
# b = "c"
```

x += 1 <-> x = x + 1 <br>
x -= 2 <-> x = x - 2 <br>
x *= 3 <-> x = x * 3 <br>
x /= 4 <-> x = x / 4 <br>
x %= 5 <-> x = x % 5 <br>
<br>

x = None  -> undefined

del x -> Değişkeni silme

## Dönüşümler

type() ile elimizdeki verinin türünü öğrenebiliriz.

type("a") -> <class 'str'> <br>
type(13) -> <class 'int'> <br>
type(1.5) -> <class 'float'> <br>
type(False) -> <class 'bool'> <br>
type(b"bc0ca") -> <class 'bytes'> <br>
type(None) -> <class 'NoneType'> <br>

Şimdi veri tiplerinin kendi arasındaki dönüşümlerine göz atalım.

- int("15") -> 15 <br>
- int(16,86) -> 16 > Float kısmı kesiyor yuvarlama işlemi daima tabana oluyor. <br>
- float(-44) -> -44.0 <br>
- round(23.12491204, 1) -> 23.1 > 2. parametre(virgülden sonrası) float kısmın basamak sayısını belirtmek için kullanılıyor. <br>
- list("abc") -> ["a", "b", "c"] <br>
- dict([(3, "three"), (1, "one")]) -> {1:"one", 3:"three"} <br>
- set([one,two]) -> {"one", "two"} <br> 
- str(5) -> "5"<br> 
--- --- --- ---

## Dizilerde Slice ve Index

Dizideki ilk itemin indexi 0, son itemin indexi -1 dir.

![image](https://user-images.githubusercontent.com/120065120/219366076-43526a7e-4d86-4581-9e19-fef769b1d4cd.png)

- Dizideki item sayısı -> len(lst) = 5 <br> 

### Index
- lst[0] = 10 <br> 
- lst[1] = 20 <br> 
- lst[2] = 30 <br> 
- lst[3] veya lst[-2] = 40 <br> 
- lst[4] veya lst[-1] = 50 <br> 

### Slice

> lst[başlangıçIndex:bitişIndex:Adım]

- lst[::] = [10, 20, 30, 40, 50]
- lst[:] = [10, 20, 30, 40, 50]
- lst [:-1] = [10, 20, 30, 40]
- lst[1:-1] = [20, 30, 40]
- lst[::2] = [10, 30, 50]
- lst[::-1] = [50, 40, 30, 20, 10]
- lst[::-2] = [50, 30, 10]
- lst[1:3] = [20,30]
- lst[-3:-1] = [30,40]
- lst[:3] = [10, 20 30]
- lst[3:] = [40, 50]


## Koşullar

![if-else-flowchart](https://user-images.githubusercontent.com/120065120/219370219-8da20fab-9aa9-4dd3-beb1-22f921cf63c5.jpg)

```
if koşul:
    statements block
elif koşul:
    statements block
else:
    statements block
    
```

Eğer if bloğundaki koşul doğru ise blokda yazılan kodlar çalışacaktır. <br> 
Eğer if bloğundaki koşul doğru değil ise ve elif bloğu var ise elif bloğu çalışacaktır. <br> 
Eğer koşulların hiç biri gerçekleşmez ise else bloğu çalışacaktır. <br> 

```
yas=19
if yas<18:
  print("Çocuk")
elif yas>65:
  print("Yaşlı")
else:
  print("Genç")
  
# Genç
```

Eğer koşulları etkili bir şekilde kullanmak istiyorsak hangi durumların True hangi durumların False döndüreceğini bilmemiz gerekiyor.

- bool(0) -> False
- bool(1) -> True
- bool(-152123213) -> True
- bool([]) -> False
- bool(["a", 2, False]) -> True
- bool({}) -> False
- bool({1, 3}) -> True
- bool(None) -> False
- bool(b"") -> False
- bool(b"x") -> True
- bool("") -> False
- bool("3") -> True

Örnek vermek gerekirse bir web sitesinden veri çekiceksiniz.Veriyi çekmeden önce verileri eklemek için bir liste oluşturalım.
> veri_cek = []
programımızı çalıştırdığımızda koşul için şöyle bir if-else bloğu yazabiliriz.

```
if veri_cek:
    # Veri çekilirse yapılacak işlemler.
else:
    # Veri çekilmezse yapılacak işlemler.
```
Özetlemek gerekirse; eğer veri çekilip de listemize eklenirse listemiz True değer döndürecektir lakin siteden veri kalkmış olabilir veya HTML tag leri değişmiş olabilir böyle bir durumda veriyi çekemeyeceğimizden listemiz boş olacaktır bu sebeple bize False değer döndürecektir ve dolayısıyla else bloğu çalışacaktır.

## Hata Yakalama


![12345 finally 1](https://user-images.githubusercontent.com/120065120/219376767-2fea18f2-d3de-48c1-9e06-b5f43c0bf88e.jpg)

```
try:
    Normal durumda çalışan blok
except <Hataismi>:
    İsmi verilen hata gerçekleştiğinde çalışacak blok
    """ EĞER İSİM VERİLMEZSE SADECE except: YAZILIRSA TÜM HATALARI YAKALAR"""
finally:
    Hata olsa da olmasa da en son çalışacak blok
```

## Döngüler
### While Döngüsü
![623c0c66fad507a80764a3f5_while-loop-flowchart](https://user-images.githubusercontent.com/120065120/219427685-dfb78785-0661-4fdd-872a-c692aac1bfd4.png)

verilen koşul True olduğu sürece sonsuza kadar dönebilen döngülerdir.

```
while koşul:
    # koşul True ise gerçekleşicek kod.
```
> Loop Control
> - Break -> Döngüyü durdur.
> - continue -> Adımı atla.

```
s = 0
i = 1
while i <= 100:
    s += i**2
    i+=1
print("Toplam:", s)
# Toplam: 338350
```
Burda her adımda ilk olarak i nin karesini alıp s değişkeni ile topluyoruz ve s değişkenini güncelliyoruz.
Ardından her döngüde i değerini 1 arttırıyoruz. i 100 veya 100 den küçük olduğu sürece koşulumuz True döneceği için döngü devam ediyor.
i 101 olduğu an while döngüsünün kapısında bekleyen bodyguardlar tarafından hoop dur hemşerim nereye denilerek hor görülüyor ve içeri alınmıyor :)

### For Döngüsü

![623c0c5447c67e81d4ac3f35_for-loop-flowchart](https://user-images.githubusercontent.com/120065120/219440910-f21b0b04-e95e-4c63-8286-10ec343f4019.png)

for loopu verilen dizinin her elemanını döndüğü için koşula bağlı olmaktan ziyade item sayısı kadar döner.

```
for <variable> in dizi:
    # kod bölümü
```

Listelerde for: <br>

Listenin uzunluğu kadar bir döngü oluşturur ve değişkene teker teker listenin içindeki itemleri tanımlar.
```
isim_listesi = ["Erkam","Ensar","Furkan"]
for isim in isim_listesi:
    print(isim)
# Erkam
# Ensar
# Furkan
```
Stringlerde for: <br>

stringler de for döngüsü ile tüm karakterleri teker teker dolaşabiliriz.
```
kelime = "safranbolu çok güzel şehirdir."
count = 0
for harf in kelime:
    if harf == "a":
        count += 1
print(count)
# 2
```

range() ile for: <br>

range() fonksiyonu bize girilen değere kadar (varsayılan olarak 0 dan başlayıp) verilen değere kadar olan sayıları kapsayan bir dizi oluşturur.
range(başlangıç, bitiş, adım)
```
meyveler = ["elma","armut","kivi","portakal","mandalina","greyfurt"]
for i in range(len(meyveler)):
    if i%2 == 0:
        print(meyveler[i])
# elma
# kivi
# mandalina
```

- list(range(5)) -> [0,1, 2, 3, 4]
- set(range(3, 7)) -> {3, 4, 5, 6, 7}
- tuple(range(2, 12, 3) -> (2, 5, 8, 11)

## print() Parametreleri

Default olarak:
- sep=" "
- end = "\n"
- file = sys.stdout

"sep" parametresi virgül ile ayırıp display etmek için yazdığımız parametreleri varsayılan olarak aralarında birer boşluk(" ") bırakarak bize çıktısını veriyor. <br>
Eğer farklı bir karakter harf vs. ile ayırmak istiyorsak bunu belirtmemiz yeterli.

```
print("elma","armut","kiraz","kivi")
# elma armut kiraz kivi
print("elma","armut","kiraz","kivi", sep="-")
# elma-armut-kiraz-kivi
```

"end" parametresi varsayılan olarak verilen parametreleri çıktı olarak verdikten sonra "\n" ile bir alt satıra geçer.Özellikle bunu looplarda print() kullandığımız zaman daha iyi anlayabiliriz.

```
for i in range(5):
    print(i)
# 0
# 1
# 2
# 3
# 4
for i in range(5):
    print(i, end=",")
# 0,1,2,3,4,
```

"file" parametresi bize çıktının nereye verileceğini gösterir varsayılan olarak kullandığımız IDE nin konsolu yani sys.stdout dur.Bir dosya açıp dilersek print() fonksiyonu ile çıktılarımızı oraya da verebiliriz.


```
f = open("deneme.txt", "w") 
print("bu konsola değil txt dosyasına yazılacak", file=f)
f.close()
```

## Fonksiyonlar
Diğer programlama dillerinde olduğu gibi pythonda da kendimizi belli bölümlerde defalarca tekrar etmek yerine fonksiyon yazıp hem kendimizi yormayız hem de kodun okunaklığı açısından güzel bir harekette bulunmuş oluruz. Fonksiyonu bir kere yazdıktan sonra istediimiz kadar çağırıp istediğimiz yerde  def i kullandam sadece isimi ve parantez içini yazarak kullanabiliriz.

def keywordu ile başlayıp fonksiyonumuzun ismi ile devam ediyoruz. Parantez içine ise parametrelerimizi yazıyoruz.
```
def fonksiyonAdı(a, b, c):
    """Dökümantasyon"""
    # Kodlarımızı buraya yazıyoruz.
    return res
# res i burda bir result döndürüyoruz anlamında yazdım oraya her hangi bir şey gelebilir.
```
verilen 3 sayıyı toplayıp 2 ile çarpan fonksiyon:
```
def toplaVeCarp(sayi1, sayi2, sayi3):
    toplam = sayi1 + sayi2 + sayi3
    sonuc = toplam*2
    return sonuc
print(toplaVeCarp(1,4,8)) veya a = toplaVeCarp(1,4,8) print(a)
# 13
```
İleri düzey fonksiyonlar
```
def (x, y, z, *args, a=3, b=5, **kwargs):
    # *args -> tuple olarak gelecektir.
    # ** kwargs -> dict olarak gelecektir.
    # eşitlik verilenler default olarak verilen değerlerdir.
```


## Genel Built-in Fonksiyonlar

lst1 = ["erik", "ayva", "vişne", "çilek"]
lst2 = [12, 2, 7, 21]

- len() -> Dizi içindeki eleman sayısını verir -> len(lst1) = 4
- min() -> Dizi içindeki en küçük elemanı verir eğer veri stringse karakter sayısına bakar -> min(lst1) = 2 & min(lst1) = "ayva"
- max() -> Dizi içindeki en büyük elemanı verir eğer veri stringse karakter sayısına bakar -> max(lst1) = 21 & max(lst1) = "çilek"
- sum() -> Eğer dizi içindeki elemanlar integer veya float ise hepsini toplar aksi halde hata döndürür. -> sum(lst2) = 42
- sorted() -> Dizi içindeki elemanları default olarak küçükten büyüğe göre sıralar. reversed=False parametresi True yapılırsa büyükten küçüğe göre sıralar -> sorted(lst2) = [2, 7, 12, 21] & sorted(lst2, reversed=True) = [21, 12, 7, 2]
- <val> in dizi -> Eğer aradığımız değer listede varsa True, yoksa False döndürecektir. -> 3 in lst2 = False & 2 in lst2 = True
- zip() -> zip() ile birden fazla diziye indexlerine göre eşleyip tuple a çevirebiliriz. -> zip(lst1, lst2) = <zip object at 0x7f0a1c394640> &  list(zip(lst1, lst2)) = [('erik', 12), ('ayva', 2), ('vişne', 7), ('çilek', 21)]

## Dictionary Metotları


- d[key] = value -> sözlüğe item eklemek
> d[key] -> # value
- d.update(d2) -£ 2 sözlüğü birleştirmek
- d.keys() d.values() d.items() -> Sözlüğü iterable olarak döngüde kullanmak için kullanırız. keys() sadece keyleri verir, values() sadece keylere karşılık gelen değerleri verir, items() tuple şeklinde (key, value) çifti verir.
- d.pop(key, None) -> verilen keyi value ile birlikte siler.Default olarak 2. parametresi None dur.
- d.get(key, None) -> Keyi verilen değeri getirir. Default olarak None dur.

## Küme Metotları

Operatorler:
- | -> union - 2 kümeyi birleştirir.
- & -> intersection - 2 kümenin kesişimini alır.
- - -
- s.update(s2) -> 2 kümeyi birleştirir.
- s.add(key) -> Kümeye key ekler.
- s.discard(key) & a.remove(key) -> verilen keyi kümeden siler
- s.pop() -> ilk elemanı atar

## Liste Metotları

- lst.append(value) -> verilen değeri listenin en sonuna ekler.
- lst.extend(dizi) -> verilen değerleri listenin en sonuna ekler.
- lst.insert(index, value) -> verilen indexe verilen value yu ekler.
- lst.remove(value) -> verilen değeri listden siler.
- lst.pop(index) -> indexi verilen değeri listeden atar. Varsayılan olarak en sonuncuyu atar.
- lst.sort & lst.reverse() -> listeyi sıralar / terse çevirir.

## String Metotları

- s.startswith() -> string verilen parametre ile başlıyorsa True başlamıyorsa False döndürür.
- s.endswith() -> string verilen parametre ile bitiyorsa True bitmiyorsa False döndürür.
- s.count() -> verilen karakterin stringde ki sayısını döndürür.
- s.index() -> verilen karakterin bulunduğu ilk indexi döndürür.
- s.upper() -> Tüm harfleri büyük yapar.
- s.lower() -> Tüm harfleri küçük yapar.
- s.title() -> Tüm kelimelerin ilk harfini büyük yapar.
- s.capitalize() -> Yalnızca ilk kelimenin ilk harfini büyük yapar.
- s.strip() -> Sağ ve soldaki fazla boşlukları yok eder.
- s.lstrip() & s.rstrip() -> sol/sağ boşlukları yok eder.
- s.split() -> belirtilen karakterden stringi ayırıp listeye dönüştürür varsayılan olarak " " dur.
- s.join() -> parametre olarak liste alır. liste elemanlarını kullandığımız string ile araları doldurarark birleştirir.
- s.isalnum() -> String, en az bir karakterden oluşuyor ve tüm karakterler alfanümerik (harf veya rakam) değerlerden oluşuyorsa, “TRUE” değeri üretir.
- s.isalpha() -> String, en az bir karakterden oluşuyor ve tüm karakterler alfabetik (harf) değerlerden oluşuyorsa, “TRUE” değeri üretir. 
- s.isdecimal() -> String, en az bir karakterden oluşuyor ve tüm karakterler ondalık değerlerden oluşuyorsa, “TRUE” değeri üretir.
- s.isdigit() -> String, en az bir karakterden oluşuyor ve tüm karakterler rakamlardan oluşuyorsa, “TRUE” değeri üretir.