Friday, June 12, 2015

თავი 4 (4,6 - 4,7)



4.6 ახალი ფუნქციების დამატება


ამდენი ხნის განმავლობაში ვიყენებდით ფუნქციებს რომელიც ჩაშენებულია პითონში, თუმცა შესაძლებელია ახალი ფუნქციების დამატებაც. ფუნქციის განსაზღვრება (function definition) მოითხოვს სპეციალურ სახელს ახალი ფუნქციისთვის და ბრძანებათა რიგს, რომელიც გამოძახებისას განახორციელებს ამ ფუნქციას. რაკი ერთხელ გავაკეთებთ ფუნქციას, შეგვეძლება გამოვიყენოთ მთელ ჩვენ პროგრამაში.
აქ არის მაგალითი :

def print_lyrics():
            print "I'm a lumberjack, and I'm okay."
            print 'I sleep all night and I work all day.'

def არის განსაზღვრული სიტყვა რომელიც მიანიშნებს რომ ესაა ფუნქციის განსაზღვრება (function definition). ფუნქციის სახელია print_lyrics. წესები ფუნქციის სახელისთვის არის იგივე, რაც ცვლადების სახელისთვის: ასოები, ციფრები და ზოგიერთი სასვენი ნიშანი დაშვებულია, მაგრამ სახელის პირველი სიმბოლო არ შეიძლება იყოს ციფრი. არ შეგიძლია გამოიყენო განსაზღვრული სიტყვა როგორც ფუნქციის სახელი. არ უნდა გქონდეს ცვლადი და ფუნქცია ერთი და იგივე სახელით.
სახელის შემდეგ ცარიელი ფრჩხილები მიანიშნებს, რომ ფუნქცია არ იღებს არგუმენტებს. მოგვიანებით გავაკეთებთ ფუნქციას, რომელიც იღებს არგუმენტს, როგორც input - ს.
ფუნქციის განსაზღვრების პირველ ხაზს ეწოდება სათაური (header); დანარჩენს - სხეული (body). სათაური უნდა დამთავრდეს ორწერტილით და სხეული უნდა იყოს დაკბილული. დაკბილვა ხდება 4 ჰარით (space). სხეული შეიძლება შეიცავდეს განუსაზღვრელი რაოდენობის ბრძანებებს.
ამობეჭდვის ბრძანებაში (print) სტრინგი ჩასმულია ბრჭყალებში. ერთმაგი და ორმაგი ბრჭყალები ერთი და იგივე დანიშნულებისაა. უმეტესობა იყენებს ერთმაგ ბრჭყალებს, გარდა  შემთხვევებისა, სადაც ერთმაგი ბრჭყალი გამოიყენება სტრინგში შიგნით. ფუნქციის განსაზღვრებას დიალოგურ რეჟიმში თუ დაწერ,  მთარგმნელი დაბეჭდავს ელიფსებს (...) რათა გაგაგებინოს რომ განსაზღვრება არაა დასრულებული.

>>> def print_lyrics():
...   print "I'm a lumberjack, and I'm okay."
...   print 'I sleep all night and I work all day.'
...
ფუნქციის დასამთავრებლად უნდა დაბეჭდო ერთი ცარიელი ხაზი. (სკრიპტში ამის გაკეთება არაა აუცილებელი).
ფუნქციის გაკეთება ასევე აკეთებს ცვლადს იგივე სახელით.

>>> print print_lyrics
<function print_lyrics at 0xb7e99e9c>
>>> print type(print_lyrics)
<type 'function'>

print_lyrics - ის მნიშვნელობა არის ფუნქციის ობიექტი რასაც აქვს ტიპი 'function'.
ფუნქციის გამოძახების სინტაქსი არის იგივე რაც ჩაშენებული ფუნქციის :

>>> print_lyrics()
            I'm a lumberjack, and I'm okay.
            I sleep all night and I work all day.

როცა გააკეთებ ფუნქციას, შეგიძლია გამოიყენო სხვა ფუნქციებში. მაგალითად, წინა ფუნქცია რომ გამოვიყენოთ, უნდა დავწეროთ ახალი ფუნქცია სახელად repeat_lyrics:

def repeat_lyrics():
      print_lyrics()
      print_lyrics()

და შემდეგ გამოვიძახოთ repeat_lyrics:

>>> repeat_lyrics()
I'm a lumberjack, and I'm okay.
I sleep all night and I work all day.
I'm a lumberjack, and I'm okay.
I sleep all night and I work all day.
 

4.7 განსაზღვრა და გამოყენება

წინა ორივე კოდის ფრაგმენტების გაერთიანებით მთლიანი პროგრამა გამოიყურება ასე :

def print_lyrics():
            print "I'm a lumberjack, and I'm okay."
            print 'I sleep all night and I work all day.'

def repeat_lyrics():
            print_lyrics()
            print_lyrics()

repeat_lyrics()



პროგრამა შეიცავს ორ ფუნქციას: print_lyrics და repeat_lyrics. ფუნქციები ხორციელდება ისე, როგორც სხვა ბრძანებები, მაგრამ  ეფექტი არის რომ შექმნას ფუნქციური ობიექტები.  ფუნქციის შიგნით ბრძანებები არ ხორციელდება, სანამ ფუნქცია არის გამოძახებული და ფუნქციის განსაზღვრებას არ აქვს output.
როგორც ელოდებოდი, ჯერ უნდა გააკეთო ფუნქცია სანამ შეგეძლება მისი განხორციელება. სხვა სიტყვებით: function definition has to be executed before the first time it is called.


სავარჯიშო 4.2 პროგრამის ბოლო ხაზი აიტანე სულ ზემოთ,  ასე რომ ფუნქციას გამოიძახებ განსაზღვრებამდე. გაუშვი პროგრამა და ნახე რა შეცდომა მოხდება.

სავარჯიშო 4.3 ფუნქციის გამოძახება დააბრუნე თავის ადგილზე და print_lyrics განსაზღვრება გადაიტანე  repeat_lyrics - ის შემდეგ. რა მოხდება როცა პროგრამას გაუშვებ?