Comment on page
🌟
Python'da Önemli Hususlar
Python için bilmeniz ve öğrenmeniz gereken, faydalı olacak konular ve derlediğim bilgiler
- 🤿 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
- 🏗️ Alttaki tüm dosya & dizinler
root
yani proje dizininde olmalıdır - 📈 Projende verimlilik için
venv
komutu ile sanal bir python ortamı oluşturman tavsiye edilir- 👷♂️
python3 -m venv venv
komutu ilevenv
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 |
- 🤯 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
- 💁♂️
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 veipython
komutu ile kullan

- 🙄 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çerisindenDict
,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 = "🦅"
- 👮♂️ 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)
- 🤯 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 etcache.counter = 5
olarak 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)()
- 💡 Ö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
- 🚄 Uzun yapı 1 gibi tekrarlı kontrolleri liste içerisine alın
- 🧐 Oluşturduğunuz liste için
and
içinall
veyaor
içinany
metotlarını da kullanabilirsiniz - 👮♂️ Switch - Case yapıları için,
dict
objesi tanımlayın- 💾 Yapılacak fonksiyonları
dict
içerisine kaydedin - 🐣
dict
üzerindenget
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)()
list
vedict
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ı ilelist
oluşturabilirsin{ expression for item in dict if conditional }
yapısı iledict
oluşturabilirsin[on_true] if [expression] else [on_false]
yapısı ile koşullu atama yapabilirsina < 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}
set
küme yapısı ile sadece eşsiz verileri tutarsınmax
yapısı ile verilenkey
'e göre en yüksek değerleri bulmap
yapısı ile üzerinde gezinebilir (ilst, set vs) verilerde her veri için fonksiyon çalıştırcollections.Counter
yapısı ile veri listesi içerisindeki elemanları saydateutil.parser.parse
ile loglardan zaman bilgilerini rastgele konumlarda da olsa çekchardet
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
- 🌟 En çok kullanılan değişken türlerindendir ve hayatında çoooook sık karşılaşacaksın
- 💁♂️ String bir
char
dizisi olduğundanlist
özelliklerini de taşırstring[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 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)
- 🤯 İç 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çerisindethis
yerineself
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')
🆔 İ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ı 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)
- 🎨 Öncelikle
colorlog
ile renkli raporlama yapabilirsin - 📦 import logging ile log paketini indirin
Buraya detaylı bilgi sonradan eklenecek
Last modified 1mo ago