Зертханалық жұмыс 15. Дәріс 15



Дата06.02.2023
өлшемі40,08 Kb.
#167614
Байланысты:
15 зертханалық жұмыс


Зертханалық жұмыс 15.
Дәріс 15. Python-дағы генераторлар. Yield операторы. Генераторлық өрнектер. Модульдер мен пакеттер. Кодты құжаттау. Python-да объектіге бағытталған бағдарламаның мысалдар. (қайталау)
Орындалатын жұмыстар:
1-тапсырма. Өзіңіздің итераторларыңызды жасаңыз. Егер сіз өзіңіздің класс объектісіндегі элементтерді айналып өтуіңіз керек, мұндай жағдайда итераторды құруыңыз керек. Объект объектіні құру кезінде пайдаланушы орнататын бірліктердің белгілі бір санын беретін Итератор болатын класс құрыңыз.
Жауабы:
class SimpleIterator:
def __init__(self, limit):
self.limit = limit
self.counter = 0


def __next__(self):
if self.counter < self.limit:
self.counter += 1
return 1
else:
raise StopIteration

s_iter1 = SimpleIterator(3)


print(next(s_iter1))
print(next(s_iter1))
print(next(s_iter1))
print(next(s_iter1))

2-тапсырма. Yield нұсқаулығы генераторларды жасауға мүмкіндік береді.
Бір объект қайтарылатын функциядағы return декларациясынан айырмашылығы, yield әр функция шақырылған сайын жаңа объект жасайды.
Шын мәнінде, бұл генераторларды циклдарда пайдалануға мүмкіндік береді.
Мұндай нұсқаулықты қолданудың ең маңызды себебі-барлық реттілікті сақтау қажет болмаған кезде жадты үнемдеу, бірақ сіз оның элементтерін бір-бірден ала аласыз.
Студент show_letters(some_str) генераторын жазды, ол барлық жол таңбаларын басып шығаруға шығарады, бірақ олар әріптер болған жағдайда ғана (қалғандары еленбейді).
Функция кодын қысқартыңыз.
Код-IDE
---
def show_letters(some_str):
clean_str = ''.join([letter for letter in some_str if letter.isalpha()])
for symbol in clean_str:
yield symbol
Yield from дизайны циклды функциядан толығымен алып тастауға мүмкіндік береді. Ол бір генераторды екіншісінің ішіне "салады", бұл бірнеше генераторларды басқаруға мүмкіндік береді.
Жауабы-IDE:_def_show_letters'>Жауабы-IDE:
def show_letters(some_str):
yield from ''.join([letter for letter in some_str if letter.isalpha()])




random_str = show_letters('A!sdf 09 _ w')
print(next(random_str))
print(next(random_str))

3-тапсырма. Фибоначчи сандары алдыңғы екі элементтің қосылуынан алынған тізбекті білдіреді.
Жинақ 1 және 1 сандарынан басталады.
Ол тез өседі, сондықтан үлкен мәндерді есептеу көп уақытты алады.
Фибоначчи сандарының n-ін құрайтын Fib(n) функциясын ең аз ресурстармен жасаңыз.
Бұл мүмкіндікті іске асыру үшін yield нұсқауларына жүгіну керек.
Ол жедел жадта үлкен дәйектілікті сақтамайды, бірақ аралық нәтижелерді бір-бірден "алуға" мүмкіндік береді.
Есептеулер бірден емес, қажет болған жағдайда жүзеге асырылуы үшін функцияны yield нұсқаулығының көмегімен генераторға айналдыру қажет.
Жауабы-IDE:
def fib(n):
fib0 = 1
yield fib0
fib1 = 1
yield fib1
for i in range(n - 2):
fib0, fib1 = fib1, fib0 + fib1
yield fib1




# Тест
for num in fib(112121):
pass
print(num)

4-тапсырма. Python функциялары үшін құжаттама жолдарын жазыңыз.
Функцияның не істейтіні, оның алатын параметрлері және оның қайтаратын мәні туралы қысқаша сипаттама қосыңыз. Жолдың литералы add_binary функциясына __doc__атрибуты ретінде қосыңыз.
Жауабы:
def add_binary(a, b):
'''
Екі ондық санның қосындысын екілік форматта қайтарады.
Параметрлер:
a (int): бірінші ондық бүтін сан
b (int): екінші ондық бүтін сан

Қайтару мәні:


binary_sum (str): a және b қосындысының екілік жолы
'''
binary_sum = bin(a+b)[2:]
return binary_sum


print(add_binary.__doc__)

Достарыңызбен бөлісу:




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет