Thursday, June 25, 2015

თავი 5 (5,7 - 5,72)

5.7 მარყუჟის ნიმუშები

როცა გვინდა სიაში ვიპოვნოთ უმცირესი ან უდიდესი ელემენტი, ხშირად ვიყენებთ  for ან while მარყუჟს

ეს მარყუჟები ჩვეულებრივ აგებულია:
·         ერთი ან ორი ცვლადის ინიციალიზება სანამ მარყუჟი დაიწყება.
·         მარყუჟის კოდში გამოთვლების შესრულება თითოეული ელემენტისთვის, ცვლადების სავარაუდო შეცვლა მარყუჟის კოდში.
·         Looking at the resulting variables when the loop completes.

გამოვიყენებთ ციფრების სიას მარყუჟის ნიმუშის კონსტრუქციის და კონცეფციის სადემონსტრაციოდ.


5.7.1 თვლელი და შემაჯამებელი მარყუჟები

მაგალითად,  სიაში ელემენტების რაოდენობის დასათვლელად, შეგვეძლო დაგვეწერა მსგავსი for მარყუჟი.

count = 0
for itervar in [3, 41, 12, 9, 74,15]:
        count = count + 1
print "count: ", count

სანამ მარყუჟი დაიწყებოდა, ცვლად count - ს მივანიჭეთ მნიშვნელობა 0, შემდეგ დავწერეთ for მარყუჟი, რომ ემოძრავა ციფრების სიაში. განმეორებად ცვლადს დავარქვით itervar და სანამ მარყუჟში არ ვიყენებთ itervar - ს, არ აკონტროლებს მარყუჟს და ამიტომ მარყუჟის კოდი სიაში ყოველი მნიშვნელობისთვის ხორციელდება ერთხელ. მარყუჟის სხეულში count - ის მნიშვნელობას ვუმატებთ ერთს სიაში თითო მნიშვნელობისთვის. სანამ მარყუჟი ხორციელდება, count - ის მნიშვნელობა არის ციფრი, რომელიც უკვე ვნახეთ. როცა მარყუჟი მორჩება count - ის მნიშვნელობა იქნება ელემენტების რაოდენობის ტოლი. ჩვენ გავაკეთეთ მარყუჟი და როცა მარყუჟში შესრულდება გვქნება ის, რაც გვინდოდა რომ გვქონიყო.

სხვა მსგავსი მარყუჟი, რომელიც ითვლის სიაში არსებული ციფრების ჯამს:

total = 0
for itervar in [3, 41, 12, 9, 74, 15]:
            total = total + itervar
print 'Total: ', total

ამ მარყუჟში გამოვიყენეთ განმეორებადი ცვლადი. ნაცვლად იმისა რომ ერთი დაგვემატებინა count - ისთვის - როგორც წინა მარყუჟში. ჩვენ დავუმატეთ არსებული ციფრები (3, 41, 12, და.ა.შ. ) მთელი მარყუჟის განმავლობაში. თუ ფიქრობ ცვლადზე total, ის შეიცავს “running total of the values so far”.ასე რომ სანამ მარყუჟი დაიწყება total  უდრის  ნულს, იმიტომ რომ ჯერ არცერთი მნიშვნელობა არ გვინახავს. მარყუჟის განმავლობაში total არის მიმდინარე მარყუჟის ჯამი და მარყუჟის ბოლოს total  არის საერთო ჯამი სიაში ყველა მნიშვნელობისა.
როცა კი მარყუჟი განხორციელდება, total  აჯამებს ელემენტებს; ასე გამოყენებულ ცვლადს ხანდახან ეძახიან შემგროვებელს.
არც დამთვლელი და არც შემაჯამებელი მარყუჟები არა არის განსაკუთრებით სასარგებლო პრაქტიკაში, იმიტომ რომ არის ჩაშენებული ფუნქციები len() და sum(), რომელიც ითვლის ელემენტების რაოდენობას სიაში და ელემენტების ჯამს სიაში.

5.7.2 მაქსიმუმი და მინიმუმი მარყუჟები

სიაში ან რიგში უდიდესი მნიშვნელობის საპოვნელად ავაგეთ შემდეგი მარყუჟი:

largest = None
print 'Before:', largest
for itervar in [3, 41, 12, 9, 74, 15]:
            if largest is None or itervar > largest :
                        largest = itervar
            print 'Loop:', itervar, largest
print 'Largest:', largest

პროგრამა როცა განხორციელდება ამონაბეჭდი იქნება შემდეგი:

Before: None
Loop: 3 3
Loop: 41 41
Loop: 12 41
Loop: 9 41
Loop: 74 74
Loop: 15 74
Largest: 74

ცვლადი largest  არის საუკეთესო გამოხატულება "უდიდესი მნიშვნელობა რაც აქამდე გვინახავს- ის". მარყუჟამდე largest  მივანიჭეთ მნიშვნელობა None. None არის სპეციალური, მუდმივი მნიშვნელობა, რომელიც შეგვიძლია მივანიჭოთ ცვლადს, ამ ცვლადის - როგორც ცარიელი ცვლადის შესანახად.
სანამ მარყუჟი დაიწყებოდა უდიდესი მნიშვნელობა იყო None. სანამ მარყუჟი ხორციელდება, largest  თუ არის None , მაშინ ვიღებთ პირველ მნიშვნელობას რომელსაც ვხედავთ როგორც უდიდესს . პირველ გამეორებაში როცა itervar  არის 3,  მაშ შემდეგ largest არის  None , მყისიერად ვანიჭებთ largest - ს მნიშვნელობას 3.
პირველი გამეორების შემდეგ largest აღარ არის  None,  ლოგიკური გამოსახულების მეორე ნაწილი ამოწმებს itervar > largest და მოქმედებს მაშინ, როცა მნიშვნელობა უფრო დიდია ვიდრე აქამდე გვენახა. როცა ვხედავთ უფრო დიდ მნიშვნელობას, ვიღებთ ახალ მნიშვნელობას ცვლადისთვის largest. პროგრამის ამონაბეჭდში შეგიძლია ნახო largest არის 3 - დან 41 და 74 - მდე.
მარყუჟის ბოლოში შევამოწმეთ ყველა მნიშვნელობა და ცვლადი largest - ს ენიჭება სიაში უდიდესის მნიშვნელობებად.
უმცირესი ციფრის გამოსათვლელად კოდი არის თითქმის იგივე:

smallest = None
print 'Before:', smallest
for itervar in [3, 41, 12, 9, 74, 15]:
      if smallest is None or itervar < smallest:
            smallest = itervar
      print 'Loop:', itervar, smallest
print 'Smallest:', smallest

Again, smallest is the “smallest so far” before, during, and after the loop executes.

როცა მარყუჟი სრულდება, smallest -ს  ენიჭება სიაში უმცირესის მნიშვნელობა.
როგორც დათვლის და შეჯამების ფუნქციები, ჩაშენებული ფუნქციები max() და min() ამ მარყუჟების დაწერას ხდის ზედმეტს.

შემდეგი კოდი min() ფუნქციის მარტივი ვერსიაა:

def min(values):
      smallest = None
      for value in values:
            if smallest is None or value < smallest:
                  smallest = value
      return smallest

ფუნქციურ ვერსიაში print ბრძანებები მოვაშორეთ.