Python-daky nonlocal buýrugy

Käbir ýagdaýlarda daşarky funksiýada içki funksiýadan elýeter bolmagy zerur bolan üýtgeýän baha bar bolýar. Biz outer funksiýasynda i üýtgeýän bahasyny ýaryþdýarys. Içki funksiýa degiþli bolan bu üýtgeýän baha daşarky (global) bolýar (global üýtgeýän bahalar diňe daşarky koda ýaryþdylan üýtgeýän bahalardyr). Biz inner funksiýasyna i üýtgeýän bahasyna bir goþmagy tabşyrýarys:

pythondef outer():
  i = 0

  def inner():
    i += 1  # [4, 9, 25] görkezer

  inner()

  return i

Emma inner üçin i üýtgeýän bahasy ýerli üýtgeýän bahadyr, Python ony ýaryþdyrylmadyk hasaplaýar we degiþli ýalňyşlygy görkezýär. Öň bu ýaly ýalňyşlyk global buýrugy bilen düzeldilýärdi. Emma bu ýerde i daşarky üýtgeýän bahadyr, şonuň üçin biz nonlocal buýrugyny ulanyp bilmelidiris. Ol kesgitleýär ki, sanalan üýtgeýän bahalaryň adyny iň ýakyn gözleg giňiþliginden almaly, globaly çykaryp, ýagny i inner içinde ýokarky funksiýada ýaryþdylan üýtgeýän bahadan alnary:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # 1 görkezer
Задание 1

Aşakdaky kodda käbir programmist ýalňyşlyk etdi:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

Bu kod bilen nämä baþlaþdy? Kod awtorynyň ýalňyşlygyny tapyň we düzediň.

Задание 2

Aşakdaky kodda käbir programmist ýalňyşlyk etdi:

pythonnum = 3
def outer():
  num += 1
  tst = num

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

Bu kod bilen nämä baþlaþdy? Kod awtorynyň ýalňyşlygyny tapyň we düzediň.