🌟Python'da Önemli Hususlar

Python için bilmeniz ve öğrenmeniz gereken, faydalı olacak konular ve derlediğim bilgiler

🧐 Aceleci Olma Temel Kavramları Öğren

  • 🤿 Python temellerini öğrenmeden proje işlerine girmeyin

  • 📖 Terminolojiyi ve yazım kurallarını az da olsa bil

  • 🪓 Eğer ağaç kesmen söylenirse, vaktinin çoğunu baltanı bilemek için kullan

  • 😊 Sabırlı ol ve bu yazıyı sonuna kadar oku

  • 👀 Python ile tüm kavramlara Getting Started with Python Programming alanından bakabilirsin

📂 Proje Yapını ve Ortamını Belirle

  • 🏗️ Alttaki tüm dosya & dizinler root yani proje dizininde olmalıdır

  • 📈 Projende verimlilik içinvenv komutu ile sanal bir python ortamı oluşturman tavsiye edilir

    • 👷‍♂️python3 -m venv venv komutu ile venv isimli sanal ortamı oluşturursun

    • 🌃 Oluşturulan sanal ortam, bilgisayarındaki python paketlerinden etkilenmez ve onları etkilemez

    • 💁‍♂️ Sanallaştırma ile paket sürümlerindeki çakışmalardan kurtulmuş olursun

📃 Dosya İsmi
💎 Açıklama

LICENSE

Projenin lisans bilgilerini taşır (Apache, MIT vs)

README

Projen hakkında açıklamalar ve dokümanlarına bağlantılara burada yer verirsin

requirements.txt

Projenin bağımlılıklarını tutar, pip freeze > requirements.txt komutu ile oluşturulur ve pip install -r requirements.txt komutu ile indirilir

tests

Projenin test metotlarının hepsi, tests dizininde saklanmalıdır

🤷‍♂️ Boşluk veya Tab Herhangi Birini Seç

  • 🤯 Her ikisini birden kullanmaya çalışma, python bunu idare edemeyebilir

  • 💫 Her proje için kendi tarzına göre boşluk ve tab verilerini birbirileri arasında dönüştür

  • 🎯 Sadece tek bir yapıyı kullan, çok sık değiştirme

‍🧙‍♂ Detaylı bilgi için 📃 Python Pro Tips alanına bakabilirsin.

🖤 Komut İsteminden ipython Kullan

  • 💁‍♂️ python ile terminalden hızlıca işlemler yapmak havalı geliyor ama kendine eziyet etme

  • 📈 ipython sayesinde gelen kod tamamlamaları ve ekstra özelliklerle efektif ilerle

  • 📦 pip install ipython komutu ile indir ve ipython komutu ile kullan

📝 Değişken Tiplerini de Belirt

  • 🙄 Değişken tipleri ile de mi uğraşacağım demeyin, tipler gereksiz uğraş değil avantajdır

  • 🤯 Objenin tipini bilmemek, kodda karmaşıklığa sebep olacaktır

  • 🧐 typing modülü içerisinden Dict, List gibi sınıflar ile değişkenlerin tipini linter için belirle

  • 💁‍♂️ Tipleri bilen linter size doğru ve uygun kod önerileri de sunacaktır

  • 👷‍♂️ Değişken tiplerini de kontrol ettirmek istersen mypy modülüne bakabilirsin

👨‍💻 Alttaki kod parçasında yazım sırasında önerilerin düzgün olduğunu fark edeceksiniz

from typing import Dict

class YEmreAk:

    def __init__(self):
        self.job = "Analyzing"
    
people: Dict[str, YEmreAK] = {}
people["Ben"] = YEmreAk()
people["Ben"].job = "🦅"

💎 Değişkenlere Farklı Tipler Atama

  • 👮‍♂️ Her farklı obje için farklı isimlendirme yapılmalı

  • 🙄 Aynı değişkene birden farklı obje atılması verimliliği artırmıyor

# Hatalı kullanım
items = 'a b c d'  # This is a string...
items = items.split(' ')  # ...becoming a list
items = set(items)  # ...and then a set

# Doğru kullanım
item_str = "a b c d"
item_list = item_str.split(" ")
item_set = set(item_list)

‍🧙‍♂ Detaylı bilgi için 📖 Dynamic Typing alanına bakabilirsin.

📦 Kütüphanelerden İşine Yarayanları Dahil Et

  • 🤯 Paketin veya modülün tüm metotlarını from ypackage import * şeklinde dahil etme kodunu karmaşıklaştırır

  • 👨‍💼 Sadece ihtiyacın olan metotları dahil et from ypackage import write_file ve kodunda kullan

  • 💁‍♂️ Çok fazla metoduna ihtiyacın varsa ve kategorize etmek istersen import cache şeklinde dahil et cache.counter = 5 olarak kullan

📖 Dictionary için get Kullan

  • 📈 Sözlükte olmazsa hata vermez, varsayılanı alırsın

  • 💠 Switch-case yapıları için de kullanabilirsin

team = {
   "productor": "Lionsgate",
   "actor": "Keanu Reeves",
   "director": "Chad Stahelski" 
}

actress = team["bullet"] # KeyError: 'bullet'
actress = team.get("bullets", 2000000)

# Switch - Case kullanımı
handlers = {
   "hello": greeting,
   "exit": good_bye,
}
handlers.get(response, smile)()

‍🧙‍♂ Detaylı bilgi için 📃 Python Pro Tips alanına bakabilirsin.

🆔 == ile is aynı değildir

  • 💡 Öncelikle == eşitlik sorgularken, is adres bilgisi (veya id) sorgular

  • 💁‍♂️ Primitif değişkenlerde (int, bool … ) adresler değil değerler tutulur,is ile == eş değerdir

  • 👮‍♂️ Objeler ve list, dict gibi tipler için eş değer değildir

x = 111
y = 111
id(x) # 4457849408
id(x) # 4457849408
x is y # True
x == y # True

a = [1, 2, 3]
b = [1, 2, 3]
a is b # False
a == b # True

‍🧙‍♂ Detaylı bilgi için 📃 Python Pro Tips alanına bakabilirsin.

👮‍♂️ If - Else Yapılarını Kısaltın

  • 🚄 Uzun yapı 1 gibi tekrarlı kontrolleri liste içerisine alın

  • 🧐 Oluşturduğunuz liste için and için all veya or için any metotlarını da kullanabilirsiniz

  • 👮‍♂️ Switch - Case yapıları için, dict objesi tanımlayın

    • 💾 Yapılacak fonksiyonları dict içerisine kaydedin

    • 🐣 dict üzerinden get metodu ile fonksiyonları çağırın

    • 🤯 Kod karmaşıklığını azaltacaktır

    • 📈 CPU kullanımını azaltıp, RAM kullanımı artıracaktır

# Uzun yapı 1
if myvar == 1 or myvar == 7 or myvar == 9:
    pass
    
# Kısa yapı 1
if myvar in [1,7,9]:
    pass

# Uzun yapı 2
if iwant:
    var = 1
else:
    var = 2

# Kısa yapı 2 (ternary)
var = 1 if iwant else 2

# Uzun yapı 3
if response == "hello":
    greeting()
elif response == "exit":
    good_bye()
else:
    smile()

# Kısa yapı 3
handlers = {
   "hello": greeting,
   "exit": good_bye,
}
handlers.get(response, smile)()

‍🧙‍♂ Detaylı bilgi için 📃 Switch Case Kullanmadan Kod Yazabilmek alanına bakabilirsin.

🍢 Tek Satır Yapılarını Kullan

  • list ve dict gibi yapılar için tek satırlık yapılar ile işini hızlıca halledebilirsin

  • [ expression for item in list if conditional ] yapısı ile listoluşturabilirsin

  • { expression for item in dict if conditional } yapısı ile dictoluşturabilirsin

  • [on_true] if [expression] else [on_false] yapısı ile koşullu atama yapabilirsin

  • a < b < c gibi zincirleme yapıları python destekler

from typing import Dict, List

a = 1
b = 2
a, b = b, a 
a  # 2
b  # 1

c = 5
a < b < c == a < b and b < c  # True

y = 2
x = "Success!" if (y == 2) else "Failed!"  # 'Success!'

mylist: List[int] = [i for i in range(10)]     # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squares: List[int] = [x**2 for x in range(7)]  # [0, 1, 4, 9, 16, 25, 36, 49]

[1, 2, 3, 4, 5][0:5:2]  # [1, 3, 5]

def some_function(a):
    return (a + 5) / 2
    
my_formula: List[float] = [some_function(i) for i in range(10)]
my_formula  # [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]

filtered: List[int] = [i for i in range(20) if i%2==0]
filtered  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

MAIN_SYMBOLS: List[str] = ["Y", "E"]
values: Dict[str, int] = {MAIN_SYMBOL: 0 for MAIN_SYMBOL in MAIN_SYMBOLS}
values  # {'Y': 0, 'E': 0}

dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
merged  # {'a': 1, 'b': 3, 'c': 4}

🤹‍♂️ Sık Kullanılabilecek İşlemleri Bil

  • set küme yapısı ile sadece eşsiz verileri tutarsın

  • max yapısı ile verilen key'e göre en yüksek değerleri bul

  • map yapısı ile üzerinde gezinebilir (ilst, set vs) verilerde her veri için fonksiyon çalıştır

  • collections.Counter yapısı ile veri listesi içerisindeki elemanları say

  • dateutil.parser.parse ile loglardan zaman bilgilerini rastgele konumlarda da olsa çek

  • chardet ile dosya içerisindeki metinleri inceleyebilirsin

# Eşsiz verileri bulma
mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
set(mylist)  # {1, 2, 3, 4, 5, 6}

# Sayıca en çok olan değeri bulma 
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
max(set(test), key = test.count)  # 4

# Map ile her eleman için işlem yapma
mywords = ['sentence', 'fragment']
list(map(lambda x: x.upper(), mywords))  # ['SENTENCE', 'FRAGMENT']

mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
c = Counter(mylist)         # Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})
Counter("aaaaabbbbbccccc")  # Counter({'a': 5, 'b': 5, 'c': 5})

# pip3 install python-dateutil 
logline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'
timestamp = parse(logline, fuzzy=True)  # 2020-01-01 00:00:01

# pip install chardet
chardetect somefile.txt
somefile.txt: ascii with confidence 1.0

🔤 String İşlemlerine Hakim Ol

  • 🌟 En çok kullanılan değişken türlerindendir ve hayatında çoooook sık karşılaşacaksın

  • 💁‍♂️ String bir char dizisi olduğundan list özelliklerini de taşır string[başlangıç:son:adım]

mystring = "The quick brown fox"

mystring.title()             # 'The Quick Brown Fox'
mylist = mystring.split(' ') # ['The', 'quick', 'brown', 'fox']
mystring = " ".join(mylist)  # 'The quick brown fox'

"abcdefg"[::-1]        # 'gfedcba'
[1, 2, 3, 4, 5][::-1]  # [5, 4, 3, 2, 1]
"abcdefdn nimt"[::2]   # 'aced it'

import emoji
emoji.emojize('Python is :thumbs_up:') # 'Python is 👍'
emoji.demojize('Python is 👍')         # 'Python is :thumbs_up:'

mywords = ['sentence', 'fragment']
list(map(lambda x: x.upper(), mywords))  # ['SENTENCE', 'FRAGMENT']


s1 = """Multi line strings can be put
        between triple quotes. It's not ideal
        when formatting your code though"""

print (s1)
# Multi line strings can be put
#         between triple quotes. It's not ideal
#         when formatting your code though
        
s2 = ("You can also concatenate multiple\n" +
        "strings this way, but you'll have to\n"
        "explicitly put in the newlines")

print(s2)
# You can also concatenate multiple
# strings this way, but you'll have to
# explicitly put in the newlines

💠 Fonksiyonları Efektif Kullan

  • 💁‍♂️ Fonksiyonlar birden fazla değişken döndürebilir (tuple) ve bunu efektif kullanmak yararınadır

  • 🏷️ Parametre ve dönüş bilgilerini typing modülü ile belirt

  • 🔚 Dönüş tipi -> <tip> şeklinde belirtilir

from typing import Tuple

def get_user(id: int) -> Tuple[str, str]:
    # fetch user from database
    # ....
    name = "YEmreAk"
    symbol = "🦅"
    return name, symbol # Tuple[str, str]

name, birthdate = get_user(7)

🍎 Class Yapıları İle OOP Kodlama Yap

  • 🤯 İç içe karmaşık fonksiyonlar yerine sınıf yapıları ile anlaşılabilir bir düzen kur

  • 🍏 dataclass ile veri sınıfları tanımla

  • 💠 __repr__, ve __eq__ metotları otmatik olarak tanımlanır

  • 💎type zorunluluğu olduğundan ileride veri atama sorunlarını engeller

📢Python içerisinde this yerine self ile sınıf varlıklarına erişilir

from dataclasses import dataclass

@dataclass
class Card:
    rank: str
    suit: str
    
card = Card("Q", "hearts")

card == card # True
card.rank    # 'Q'
card         # Card(rank='Q', suit='hearts')

💠 Özel Sınıf Metotlarını Kullanın

🆔 İsim
📃 Açıklama

__init__

Sınıf oluşturulduğunda çağırılır (constructor)

__str__

Sınıf str, f"{}" veya print ile yazdırılmak istendiğinde çağırılır

__repr__

Debug işlemleri sırasında sınıf hakkında bilgileri verir (VS Code Debug metinleri vs)

__eq__

Sınıf arasında eşitlik kıyaslaması yapıldığında çalışır (a == b)

__hash__

Dict gibi işlemlerde key olarak sınıfın kullanılması için hashable olması gerekir hash(str(self)) şeklinde kullanılabilir

🏷️ Decorator Yapısı ile Tekrarlı Kodlardan Sakın

  • ➕ Decorator yapısı fonksiyonların üstüne @ ile eklenen fonksiyonlardır

  • 🌊 Fonksiyon her çağırıldığında önce @ ile eklenen fonksiyon çalışır sonra istenen çağırılır

  • 👮‍♂️ API işlemlerinde yetki kontrolleri için kullanılması zaman kazandırır

  • 💁‍♂️ @functools.wraps(func) decorator yapısı ile asıl fonksiyonun __name__ gibi karakter özellikleri saklanır (aksi halde __name__ değeri @ olan fonksiyonun ismini verir)

from typing import Tuple

def authentication_required(func):
    @functools.wraps(func)
    def wrapper_decorator(*args, **kwargs):
        if not args[0].authenticated:
            raise UnauthorizedError(response=None)
        value = func(*args, **kwargs)
        return value

    return wrapper_decorator

class DataBase:
    
    def __init__(auth: str):
        self.authenticated = True if auth else False

    @authentication_required
    def get_user(id: int) -> Tuple[str, str]:
        # fetch user from database
        # ....
        name = "YEmreAk"
        symbol = "🦅"
        return name, symbol # Tuple[str, str]

name, birthdate = DataBase("👮‍♂️").get_user(7)

📜 print'ten Vazgeç logger ile Raporlama Yap

  • 🎨 Öncelikle colorlog ile renkli raporlama yapabilirsin

  • 📦 import logging ile log paketini indirin

Buraya detaylı bilgi sonradan eklenecek

📜Raporlama

🔗 Faydalı Bağlantılar

🚀 Bu alandaki bağlantılar YEmoji ~Bağlantılar yapısına uygundur

Last updated

© 2024 ~ Yunus Emre Ak ~ yEmreAk