Bikaranîna nîşana têgihîştina navnîşa Python

Dikan

Di Python de, dema afirandina navnîşek nû karanîna navnîşa têgihîştina navnîşê hêsan e.(List comprehensions)

Di vê gotarê de, em ê pêşî li ser jêrîn nîqaş bikin

  • Cûreya bingehîn a navnîşa têgihîştina navnîşê
  • Navnîşana têgihîştinê bi şaxkirina şertî ji hêla if ve navnîş bikin
  • Kombînasyona bi operatorên sêalî (eger pêvajoyek wekî din)
  • zip(),enumerate()Bi van re têkelbûn
  • nîşana tevlêbûna lîsteya hêlîn

Dûv re, em ê komek nîşana têgihîştina navnîşê bi koda nimûneyê rave bikin.

  • nîşana tevlêbûnê danîn(Set comprehensions)
  • nîşeya tevlêbûna ferhengê(Dict comprehensions)
  • cureyê jenerator(Generator expressions)

Cûreya bingehîn a navnîşa têgihîştina navnîşê

Nîşana têgihîştina navnîşê bi vî rengî tê nivîsandin.

[Expression for Any Variable Name in Iterable Object]

Ew her hêmanek tişta dubarekirî ya wekî navnîşek, pirtik, an rêzek bi navek guhêrbarek keyfî digire û bi vegotinekê dinirxîne. Lîsteyek nû ya bi encama nirxandinê wekî hêman tê vegerandin.

Mînakek digel hevwateyekê ji bo daxuyaniyê tê dayîn.

squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]
squares = []
for i in range(5):
    squares.append(i**2)

print(squares)
# [0, 1, 4, 9, 16]

Heman pêvajo dikare bi nexşe() re were kirin, lê navnîşa têgihîştina navnîşê ji ber sadebûn û zelaliya wê tê tercîh kirin.

Navnîşana têgihîştinê bi şaxkirina şertî ji hêla if ve navnîş bikin

Şaxkirina şertî bi heke gengaz e jî. Heke di paşpirtikê de wekî jêrîn binivîsin.

[Expression for Any Variable Name in Iterable Object if Conditional Expression]

Tenê hêmanên bireser ên ku bilêvkirina wan rast e ji hêla bilêvkirinê ve têne nirxandin, û navnîşek nû ya ku hêmanên wê encam in tê vegerandin.

Hûn dikarin her navekî guhêrbar di îfadeya şertî de bikar bînin.

Mînakek digel hevwateyekê ji bo daxuyaniyê tê dayîn.

odds = [i for i in range(10) if i % 2 == 1]
print(odds)
# [1, 3, 5, 7, 9]
odds = []
for i in range(10):
    if i % 2 == 1:
        odds.append(i)

print(odds)
# [1, 3, 5, 7, 9]

Heman pêvajo bi fîlter() re dikare were kirin, lê navnîşa têgihîştina navnîşê ji ber sadebûn û zelaliya wê tê tercîh kirin.

Kombînasyona bi operatorên sêalî (eger pêvajoyek wekî din)

Di mînaka jorîn de, tenê ew hêmanên ku pîvanan pêk tînin têne pêvajo kirin, û yên ku pîvanan nagirin ji navnîşa nû têne derxistin.

Heke hûn dixwazin pêvajoyê li gorî şertê biguherînin, an heke hûn dixwazin hêmanên ku şertê cûda nagirin pêvajoyê bikin, wekî wekî din, operatora sêalî bikar bînin.

Di Python de, operatora sêalî dikare wekî jêrîn were nivîsandin

Value When True if Conditional Expression else Value When False

Ev di beşa vegotinê ya navnîşa têgihîştina navnîşê de wekî ku li jêr tê destnîşan kirin tê bikar anîn.

[Value When True if Conditional Expression else Value When False for Any Variable Name in Iterable Object]

Mînakek digel hevwateyekê ji bo daxuyaniyê tê dayîn.

odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
odd_even = []
for i in range(10):
    if i % 2 == 1:
        odd_even.append('odd')
    else:
        odd_even.append('even')

print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

Di heman demê de gengaz e ku meriv bêjeyan bi karanîna navên guhêrbar ên kêfî ji bo nirxên rast û xelet binivîse.

Ger şert têr be, hin pêvajoyek tê kirin, wekî din nirxa tişta îterable ya orîjînal nayê guhertin.

odd10 = [i * 10 if i % 2 == 1 else i for i in range(10)]
print(odd10)
# [0, 10, 2, 30, 4, 50, 6, 70, 8, 90]

Kombînasyona bi zip() û enumerate()

Fonksiyonên bikêr ên ku bi gelemperî di daxuyaniya for-ê de têne bikar anîn zip(), ku gelek îterables bi hev re vedihewîne, û enumerate(), ku nirxek digel indexa xwe vedigerîne.

Bê guman, gengaz e ku meriv zip() û enumerate() bi nîşana têgihîştina navnîşê bikar bîne. Ew ne hevoksaziyek taybetî ye, û heke hûn pêwendiya bi daxuyaniya for re bifikirin ne dijwar e.

Mînaka zip().

l_str1 = ['a', 'b', 'c']
l_str2 = ['x', 'y', 'z']

l_zip = [(s1, s2) for s1, s2 in zip(l_str1, l_str2)]
print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]
l_zip = []
for s1, s2 in zip(l_str1, l_str2):
    l_zip.append((s1, s2))

print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]

Mînaka enumerate().

l_enu = [(i, s) for i, s in enumerate(l_str1)]
print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]
l_enu = []
for i, s in enumerate(l_str1):
    l_enu.append((i, s))

print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]

Dema ku heke bikar bînin fikir wekî berê ye.

l_zip_if = [(s1, s2) for s1, s2 in zip(l_str1, l_str2) if s1 != 'b']
print(l_zip_if)
# [('a', 'x'), ('c', 'z')]

Her hêman dikare ji bo hesabkirina hêmanek nû jî were bikar anîn.

l_int1 = [1, 2, 3]
l_int2 = [10, 20, 30]

l_sub = [i2 - i1 for i1, i2 in zip(l_int1, l_int2)]
print(l_sub)
# [9, 18, 27]

nîşana tevlêbûna lîsteya hêlîn

Mîna hêlînê ji bo loopan, nîşana têgihîştina navnîşê jî dikare were hêlîn kirin.

[Expression for Variable Name 1 in Iterable Object 1
    for Variable Name 2 in Iterable Object 2
        for Variable Name 3 in Iterable Object 3 ... ]

Ji bo rehetiyê, şikestin û xêzkirin hatine zêdekirin, lê ji bo rêzimanê ne hewce ne; ew dikarin li ser yek xetê berdewam bikin.

Mînakek digel hevwateyekê ji bo daxuyaniyê tê dayîn.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat = [x for row in matrix for x in row]
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
flat = []
for row in matrix:
    for x in row:
        flat.append(x)

print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

Her weha gengaz e ku meriv gelek guherbaran bikar bîne.

cells = [(row, col) for row in range(3) for col in range(2)]
print(cells)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

Hûn dikarin şaxkirina şertî jî bikin.

cells = [(row, col) for row in range(3)
         for col in range(2) if col == row]
print(cells)
# [(0, 0), (1, 1)]

Di heman demê de gengaz e ku ji bo her tiştê dubarekirî bi şertî şax were kirin.

cells = [(row, col) for row in range(3) if row % 2 == 0
         for col in range(2) if col % 2 == 0]
print(cells)
# [(0, 0), (2, 0)]

nîşana tevlêbûnê danîn(Set comprehensions)

Guhertina kevokên çargoşe [] di navnîşa têgihîştina navnîşê de ji bo kelekên çîpkirî {} setek (objekt-type set) diafirîne.

{Expression for Any Variable Name in Iterable Object}
s = {i**2 for i in range(5)}

print(s)
# {0, 1, 4, 9, 16}

nîşeya tevlêbûna ferhengê(Dict comprehensions)

Ferheng (tiştên tîpên dîktatorî) dikarin bi nîşana têgihîştinê jî bêne çêkirin.

{}, û kilît û nirxê di beşa îfadeyê de wek key: nirx diyar bike.

{Key: Value for Any Variable Name in Iterable Object}

Her biwêj dikare ji bo key û nirx were destnîşan kirin.

l = ['Alice', 'Bob', 'Charlie']

d = {s: len(s) for s in l}
print(d)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

Ji bo afirandina ferhengek nû ji navnîşek bişkok û nirxan, fonksiyona zip() bikar bînin.

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

cureyê jenerator(Generator expressions)

Heke di navnîşa têgihîştina navnîşan de kemberên çargoşe [] wekî kemberên dor bi kar bînin (), jeneratorek li şûna tîpek tê vegerandin. Ji vê re bêjeyên jenerator tê gotin.

Nimûneya navnîşa têgihîştina navnîşê.

l = [i**2 for i in range(5)]

print(l)
# [0, 1, 4, 9, 16]

print(type(l))
# <class 'list'>

Mînaka îfadeya jeneratorê. Ger hûn () jeneratorê wekî ku ew çap bikin, ew ê naveroka wê çap neke, lê heke hûn wê bi daxuyanek for-ê bimeşînin, hûn dikarin naverokê bistînin.

g = (i**2 for i in range(5))

print(g)
# <generator object <genexpr> at 0x10af944f8>

print(type(g))
# <class 'generator'>

for i in g:
    print(i)
# 0
# 1
# 4
# 9
# 16

Gotinên jenerator di heman demê de rê dide şaxkirina şert û hêlînê bi karanîna heke û her weha nîşana têgihîştina navnîşê.

g_cells = ((row, col) for row in range(0, 3)
           for col in range(0, 2) if col == row)

print(type(g_cells))
# <class 'generator'>

for i in g_cells:
    print(i)
# (0, 0)
# (1, 1)

Mînakî, heke navnîşek bi hejmareke mezin ji hêmanan bi karanîna nîşana têgihîştina navnîşê were çêkirin û dûv re bi daxuyaniyek for were veguheztin, navnîşa ku hemî hêmanan dihewîne dê di destpêkê de were çêkirin heke nîşana têgihîştina navnîşê were bikar anîn. Ji hêla din ve, heke hûn vegotinek jeneratorê bikar bînin, her carê ku lûpek dubare dibe, hêman yek bi yek têne çêkirin, bi vî rengî mêjera bîranîna ku tê bikar anîn kêm dibe.

Ger îfadeya jeneratorê tenê argumana fonksiyonê be, kemberên dor () dikarin bên avêtin.

print(sum([i**2 for i in range(5)]))
# 30

print(sum((i**2 for i in range(5))))
# 30

print(sum(i**2 for i in range(5)))
# 30

Di derbarê leza pêvajoyê de, dema ku hemî hêman têne hilberandin, navnîşa têgihîştina navnîşê bi gelemperî ji nîşana hilberîner zûtir zûtir e.

Lêbelê, gava ku bi hemî () an jî () re dadbar kirin, mînakî, encam dema ku xelet an rast hebe tê destnîşan kirin, ji ber vê yekê karanîna vegotinên jeneratorê ji karanîna navnîşa têgihîştina navnîşê zûtir be.

Nîşana têgihîştinê ya tupleyê tune, lê heke hûn bêjeyek jeneratorê wekî argumana tuple() bikar bînin, hûn dikarin di nîşana têgihîştinê de pirjimarek çêkin.

t = tuple(i**2 for i in range(5))

print(t)
# (0, 1, 4, 9, 16)

print(type(t))
# <class 'tuple'>