Zimanî babet

Python û rêbazên pêşkeftî, fonksiyonên dunder ji bo bernameya çêtir

Python zimanek bernamesaziyek fantastîk e, û wekî ku ji hêla delîl ve hatî destnîşan kirin GitHub, di sala 2022-an de jî duyemîn zimanê herî populer e.

Awantajên herî balkêş ên Python civata mezin a bernamenûsan in.

Wusa dixuye ku Python ji bo her rewşek karanîna pakêtek heye.

Di cîhana berfireh a bernamesaziya Python de, komek taybetmendî hene ku bi gelemperî ji hêla destpêkeran ve nayên dîtin, lê di ekosîstema ziman de xwedî girîngiyek girîng in.

Rêbazên efsûnî komek rêbazên pêşîn indefidi Python-ê de hatî destnîşan kirin ku fonksiyonên syntaktîkî yên taybetî peyda dikin. Ew bi tîrêjên xwe yên ducar ên di destpêkê û dawiyê de bi hêsanî têne nas kirin, mîna __init__, __call__, __len__ … hwd.

Rêbazên Magic

Rêbazên sêrbaz dihêle ku tiştên xwerû mîna celebên Python-ê yên çêkirî tevbigerin.

Di vê gotarê de, em ê li ser fonksiyonên dunder ên hêzdar bisekinin. Em ê armanca wan lêkolîn bikin û karanîna wan nîqaş bikin.

Ma hûn nûjenek Python an bernamenûsek bi ezmûn in, ev gotar armanc dike ku têgihîştinek berfireh a fonksiyonên Dunder ji we re peyda bike, ku ezmûna kodkirina Python-a we bikêrtir û xweştir bike.

Bînin bîra xwe, sêrbaziya Python ne tenê di sadebûn û pirrengiya wê de, lê di heman demê de di taybetmendiyên wê yên hêzdar ên mîna fonksiyonên Dunder de jî heye.

__init__

Dibe ku fonksiyona dunder ya herî bingehîn ji hemîyan. Ev rêbaza efsûnî ye ku Python bixweber gazî dike gava ku em tiştek nû diafirînin (an wekî nav diyar dike, dest pê dike).__init__

class Pîzza:
def __destpêk__(xwe, mezinahî, pêlav):
xwe.mezin = mezinahî
xwe.toppings = toppings

# Naha em pîzayek çêbikin
my_pizza = Pizza('mezin', ['pepperoni', 'kivark'])

çap bike(my_pizza.size) # Ev ê çap bike: mezin
print(my_pizza.toppings) # Ev ê çap bike: ['pepperoni', 'mishrooms']

Di vê nimûneyê de, çînek bi navê Pizza tê afirandin. Me fonksiyona __init__-ya xwe saz kir da ku pîvanên ku di dema destpêkirinê de bêne diyar kirin vehewîne, û wan wekî taybetmendiyên ji bo tiştê xweya xwerû destnîşan bike.

Li vir, ew ji bo temsîlkirina mînaka polê tê bikar anîn. Ji ber vê yekê gava ku em self.size = mezinahî dinivîsin, em dibêjin, "Hey, ev tişta pîzza xwedan pîvanek taybetmendiyek e size, û ez dixwazim ku ew bi çi mezinahî be ku min dema ku min ew tişt afirand.

__str__ û __repr__

__Str__

Ev rêbaza efsûnî ya Python e ku destûrê dide me definite şiroveyek ji bo tiştê meya xwerû.

Dema ku hûn tiştek çap bikin an bi karanîna wê veguherînin rêzek str(), Python kontrol bikin ka we heye defirêbazek destnîşan kir __str__ ji bo çîna wê object.

Ger wusa be, wê rêbazê bikar bînin da ku hêmanê veguherînin rêzek.

Em dikarin mînaka xweya Pizzayê dirêj bikin ku fonksiyonek tê de hebe __str__ wiha:

class Pizza: def __init__(xwe, mezinahî, çîp): xwe.size = size self.toppings = toppings def __str__(self): vegere f"A {self.size} pizza bi {', '.join(self.toppings )}" my_pizza = Pizza('mezin', ['pepperoni', 'kivark']) çap bike(my_pizza) # Ev ê çap bike: Pizzayeke mezin bi pepperoni, kivark.
__repr__

Fonksiyona __str__ bêtir rêyek nefermî ye ji bo danasîna taybetmendiyên tiştekê. Ji hêla din ve, __repr__ tê bikar anîn da ku ravekirinek fermî, hûrgulî û nezelal a tiştê xwerû peyda bike.

Ger hûn bang bikin repr() li ser tiştekî an hûn tenê navê objektê li konsolê binivîsin, Python dê li rêbazek bigere __repr__.

Se __str__ ne ew e definite, Python dê bikar bîne __repr__ dema ku hewl didin ku tiştê çap bikin an veguhezînin stringê wekî paşvekişandinê. Ji ber vê yekê ew pir caran ramanek baş e defiherî kêm bi dawî bibe __repr__, heta ku hûn nekin defidiqede __str__.

Li vir e ku em çawa dikarin defiqedandin __repr__ ji bo nimûneya meya pizza:

class Pîzza:
def __destpêk__(xwe, mezinahî, pêlav):
xwe.mezin = mezinahî
xwe.toppings = toppings

def __repr__(xwe):
vegere f"Pîzza('{self.size}', {self.toppings})"

my_pizza = Pizza('mezin', ['pepperoni', 'kivark'])
çap bike(repr(my_pizza)) # Ev ê çap bike: Pizza('mezin', ['pepperoni', 'kivark'])

__repr__ Rêzek dide we ku hûn dikarin wekî fermanek Python bimeşînin da ku tiştê pizza ji nû ve biafirînin, lê __str__ ravekirineke mirovî zêdetir dide we. Ez hêvî dikim ku ew ji we re dibe alîkar ku hûn van rêbazên dunder hinekî çêtir bixapînin!

__lêzêdekirin__

Di Python de, em hemî dizanin ku meriv bi karanîna operatorê ve jimareyan zêde dike +, were 3 + 5.

Lê heke em bixwazin mînakên hin tiştên xwerû lê zêde bikin?

Fonksiyona dunder __add__ ew destûrê dide me ku em tenê wiya bikin. Ew şansê me dide defitevgera operator safî bike + li ser tiştên me yên kesane.

Di berjewendiya hevgirtinê de, em bifikirin ku em dixwazin definite reftarên + li ser nimûne pizza me. Em bibêjin ku gava ku em du an jî zêdetir pîzayan li hev zêde bikin, ew ê bixweber hemî pêlavên wan bi hev re bicivîne. Li vir e ku ew dikare mîna xuya bike:

class Pîzza:
def __destpêk__(xwe, mezinahî, pêlav):
xwe.mezin = mezinahî
xwe.toppings = toppings

def __zêde__(xwe, din):
heke ne nimûne (yên din, Pizza):
TypeError zêde bike ("Hûn tenê dikarin Pîzzayek din lê zêde bikin!")
new_toppings = xwe.toppings + other.toppings
Vegere Pîzza (mezinahiya xwe, nû_toppings)

# Ka em du pîza biafirînin
pizza1 = Pizza('mezin', ['biberon', 'kivark'])
pizza2 = Pizza('mezin', ['zeytûn', 'ananas'])

# Û naha em wan "lê zêde bikin".
pîzza_hevgirtî = pizza1 + pizza2

print(combined_pizza.toppings) # Ev ê çap bike: ['pepperoni', 'mishroom', 'zeytûn', 'ananas']

Bi heman awayî dunder __add__, em jî dikarin definite fonksiyonên din ên arîtmetîk ên wekî __sub__ (bi jêbirinê bi karanîna operatorê -) e __mul__ (ji bo pirbûnê bi karanîna operatorê *).

__len__

Ev rêbaza dunder destûrê dide me definiş çi fonksiyona len() divê ji bo tiştên me yên xwerû vegere.

Python bikar tîne len() ji bo bidestxistina dirêjahî an mezinahiya avahiyek daneyê wekî navnîşek an rêzek.

Di çarçoveya mînaka me de, em dikarin bibêjin ku "dirêj"a pîzzayê hejmara pêlên wê ye. Li vir e ku em çawa dikarin wê bicîh bikin:

class Pîzza:
def __destpêk__(xwe, mezinahî, pêlav):
xwe.mezin = mezinahî
xwe.toppings = toppings

def __len__(xwe):
lens vegerandin (xwe. serpêhatî)

# Werin em pîzza çêkin
my_pizza = Pizza('mezin', ['pepperoni', 'mishroom', 'zeytûn'])

çap bike(len(min_pizza)) # Ev ê çap bike: 3

Di rêbaza __len__ de, em tenê dirêjahiya navnîşê vedigerînin toppings. Niha, len(my_pizza) ew ê ji me re vebêje ka çend topan li ser wê hene my_pizza.

__ pêvajo __

Ev rêbaza dunder dihêle ku tişt bêne dubare kirin, ango ew dikare di pêlekek for de were bikar anîn.

Ji bo vê jî divê em defifonksiyonê biqedîne __next__, Ev ji bo tê bikaranîn defireftara ku divê di dubarekirinê de nirxa din vegerîne bi dawî bike. Wekî din, di heman demê de divê ew li ser bûyera ku di rêzê de hêmanek din tune be jî nîşan bide. Em bi gelemperî vê yekê bi bilindkirina îstîsnayekê bi dest dixin StopIteration.

Ji bo nimûneya meya pîzza, em bibêjin ku em dixwazin topan dubare bikin. Em dikarin pola xweya Pîzzayê dubare bikin defidayîna rêbazekê __iter__:

class Pîzza:
def __destpêk__(xwe, mezinahî, pêlav):
xwe.mezin = mezinahî
xwe.toppings = toppings

def __iter__(xwe):
xwe.n = 0
xwe vegerîne

def __next__(xwe):
eger xwe.n < len(self.toppings):
encam = self.toppings[self.n]
xwe.n += 1
encama vegere
wekîdi:
Rakirina StopIteration

# Werin em pîzza çêkin
my_pizza = Pizza('mezin', ['pepperoni', 'mishroom', 'zeytûn'])

# Û naha em li ser wê dubare bikin
ji bo serpêhatina my_pizza:
çapkirin (teqandin)

Di vê rewşê de, loop for bang dike __iter__, ku jimarek dest pê dike (self.n) û pîzayê bi xwe vedigerîne (self).

Dûv re, loop for bang dike __next__ da ku her topek li dora xwe bigire.

Dema ku __next__ hemû demsalan vegerandin, StopIteration ew îstîsnayekê derdixe û lêkera for naha dizane ku êdî tixûb nemane û ji ber vê yekê dê pêvajoya dubarekirinê betal bike.

Ercole Palmeri

nûçenameya Innovation
Nûçeyên herî girîng ên li ser nûjeniyê ji bîr nekin. Sign up ji bo wergirtina wan bi e-nameyê.
Tags: python

Gotarên dawî

Destwerdana nûjen di Rastiya Zêdekirî de, bi temaşevanek Apple re li Polyclinic Catania

Operasyonek ophthalmoplasty bi karanîna temaşekera bazirganî ya Apple Vision Pro li Polyclinic Catania hate kirin…

3 May 2024

Feydeyên Rûpelên Rengdêr ji bo Zarokan - cîhanek sêrbaz ji bo her temenî

Pêşxistina jêhatîbûnên motorê yên xweş bi rêya rengînkirinê zarokan ji hunerên tevlihevtir ên mîna nivîsandinê re amade dike. Reng kirin…

2 May 2024

Pêşeroj li vir e: Pîşesaziya Keştiyê Çawa Şoreşa Aboriya Gerdûnî diafirîne

Sektora deryayî hêzek aborî ya cîhanî ya rastîn e, ku ber bi bazarek 150 mîlyar ve çûye…

1 May 2024

Weşanxane û OpenAI peymanan îmze dikin da ku herikîna agahdariya ku ji hêla îstîxbarata hunerî ve hatî hilberandin birêkûpêk bikin.

Duşemiya borî, Financial Times peymanek bi OpenAI re ragihand. FT destûr dide rojnamegeriya xwe ya cîhanî…

30 Nîsana 2024