Monday, July 13, 2015

თავი 8 (8,8 - 8,10)



8.8 სიები და ფუნქციები

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

>>> nums = [3, 41, 12, 9, 74, 15]
>>> print len(nums)
6
>>> print max(nums)
74
>>> print min(nums)
3
>>> print sum(nums)
154
>>> print sum(nums)/len(nums)
25

sum() ფუნქცია მხოლოდ მაშინ მუშაობს, როცა სიის ელემენტები ციფრებია. სხვა ფუნქციები (max(), len(), და.ა.შ.) მუშაობს სიებთან, სტრინგებთან და სხვა ტიპებთან, რომელთა შედარებაც შეიძლება.
შეგვიძლია გადავწეროთ ძველი პროგრამა, რომელიც ითვლიდა მომხმარებლის მიერ სიაში შეყვანილი ციფრების საშუალო არითმეტიკულს:

total = 0
count = 0
while (True) :
      inp = raw_input('Enter a number: ')
      if inp == 'done' : break
      value = float(inp)
      total = total + value
      count = count + 1

average = total / count
print 'Average:', average

ამ პროგრამაში გვაქვს count და  sum(?) ცვლადები, რომ შეინახოს მომხმარებლის მიერ შეყვანილი ციფრები, რადგან მომხმარებელს გამუდმებით ვეკითხებით ციფრებს.
შეგვეძლო მარტივად დაგვემახსოვრებინა ყველა შეტანილი ციფრი და გამოგვეყენებინა ჩაშენებული ფუნქციები ჯამის გამოსათვლელად.

numlist = list()
while (True) :
      inp = raw_input('Enter a number: ')
      if inp == 'done' : break
      value = float(inp)
      numlist.append(value)

average = sum(numlist) / len(numlist)
print 'Average:', average

მარყუჟის დასაწყისში გავაკეთეთ ცარიელი სია და ყოველ ახალ ნომერს ვამატებდით ამ სიაში. პროგრამის დასასრულს მარტივად გამოვთვალეთ საშუალო არითმეტიკული: ციფრების ჯამი გაყავით ციფრების რაოდენობაზე.

8.9 სიები და სტრინგები

სტრინგი სიმბოლოების თანრიგია და სია არის მნიშვნელობათა თანრიგი, მაგრამ სიმბოლოების სია იგივე არ არის რაც სტრინგი. სტრინგიდან სიაში კონვერტიზაციისთვის შეგიძლია გამოიყენო list :

>>> s = 'spam'
>>> t = list(s)
>>> print t
['s', 'p', 'a', 'm']

list არის ჩაშენებული ფუნქციის სახელი, ამიტომ შეეცადე არ გამოიყენო ცვლადის სახელად. ასევე ვცდილობ არ გამოვიყენო l იმიტომ, რომ ძალიან ჰგავს 1 - ს. ამიტომ ვიყენებ t - ს.
list ფუნქცია ყოფს სტრინგს ცალკე ასოებად. სტრინგის სიტყვებად გაყოფა თუ გინდა , გამოიყენე split მეთოდი.

>>> s = 'pining for the fjords'
>>> t = s.split()
>>> print t
['pining', 'for', 'the', 'fjords']
>>> print t[2]
the

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

>>> s = 'spam-spam-spam'
>>> delimiter = '-'
>>> s.split(delimiter)
['spam', 'spam', 'spam']

join არის split - ის საპირისპირო მეთოდი. იღებს სტრინგების სიას და ელემენტებს აერთიანებს. join არის სტრინგის მეთოდი, ამიტომ უნდა გამოიძახო delimiter - ზე და მიუთითო სია, როგორც პარამეტრი:

>>> t = ['pining', 'for', 'the', 'fjords']
>>> delimiter = ' '
>>> delimiter.join(t)
'pining for the fjords'

ამ შემთხვევაში განმსაზღვრელია ჰარის სიმბოლო. სიტყვებს შორის  join სვამს ჰარის. სიტყვების ჰარების გარეშე შესაერთებლად უნდა გამოიყენო ცარიელი სტრინგი  '', როგორც განმსაზღვრელი.

8.10 ხაზების გარჩევა

ჩვეულებრივ, როცა ფაილს ვკითხულობთ გვინდა, რომ უბრალოდ ამობეჭდვის გარდა ხაზებს სხვა რამეც გავუკეთოთ. ხშირად გვინდა ვიპოვნოთ "საინტერესო ხაზი"  და შემდეგ გავარჩიოთ ეს ხაზი, რომ ამ ხაზში ვიპოვნოთ საინტერესო ნაწილი. როგორ ამოვბეჭდოთ კვირის დღე იმ ხაზებიდან, რომელიც იწყება From - ით?

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

split მეთოდი ძალიან ეფექტურია ასეთი ტიპის პრობლემების შემთხვევაში. შეგვიძლია დავწეროთ პატარა პროგრამა, რომელიც მოძებნის ხაზებს რომელიც იწყება From - ით და შემდეგ გაყოფს ამ ხაზებს და ამობეჭდავს ხაზში მესამე სიტყვას:

fhand = open('mbox-short.txt')
for line in fhand:
            line = line.rstrip()
            if not line.startswith('From '): continue
            words = line.split()
            print words[2]

გამოვიყენეთ if ბრძანების ფორმა, სადაც ჩავსვით continue - იმავე ხაზში(სადაცაა if).  if ბრძანების ესე დაწერა იგივე შედეგს, რასაც იძლევა continue - ს ცალკე ხაზზე დაწერა და დაკბილვა.
ზემო პროგრამას აქვს შემდეგი ამონაბეჭდი:

Sat
Fri
Fri
Fri
...

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