4714

Основи структурного програмування мовою Python

Лабораторная работа

Информатика, кибернетика и программирование

Мета робота Вивчити основи структурного програмування мовою Python, повторити та закріпити матеріал, пройдений у попередніх лабораторних роботах, покращити загальні навички програмування. Короткі теоретичні відомості Присвоювання...

Украинкский

2012-11-25

127.5 KB

16 чел.

Мета робота

Вивчити основи структурного програмування мовою Python, повторити та закріпити матеріал, пройдений у попередніх лабораторних роботах, покращити загальні навички програмування.

Короткі теоретичні відомості

Присвоювання

Присвоювання – найпростіше поняття програмування, але навіть і йому властиві певні тонкощі. Розглянемо приклад:

За допомогою операції присвоєння відбувається копіювання значення виразу іншій змінній, хоча насправді, значення структурованого об’єкту, наприклад такого, як список, це є посилання на цей об’єкт. В наступному прикладі показано, як присвоювання нового значення елементу списку не приводить до зміни його інших елементів:

Потрібно чітко розрізняти модифікацію об’єкту через посилання на об’єкт і перезаписування посилання на об’єкт.

Порівняння

Python підтримує два способи порівняння. Оператор is перевіряє об’єкти на ідентичність. Створивши список з декількох копій одного і того самого об’єкту не складно переконатися, що елементи цього списку не тільки ідентичні, згідно ==, але і є одним і тим самим об’єктом:

Використовуючи функцію id() можна легко зрозуміти відмінності між об’єктами і побачити що елементи списку не є ідентичними - списки мають різні ідентифікатори:

Умовні твердження (висловлювання)

В частині умов if твердження, не пусті стрічки вважаються «true», а пусті стрічки чи списки вважаються «false» і не обробляються.

Тому, не потрібно використовувати додаткову перевірку if len(element) > 0: в умові.

Для пояснення відмінностей між використанням  if...elif та використання декількох if тверджень розглянемо наступний приклад:

Якщо  if вираз твердження задовольняється то, Python ніколи не буде робити спроби перевірити чи справджується elif вираз. На екран «2» ніколи не буде виведено. Навпаки, якщо замінити  elif на if, на екран буде виведено і  « і «. elif вираз потенційно є більш інформативний ніж простий if вираз; коли він справджується то це означає не тільки те що умова задовольняється але і те, що умова if виразу не справджується.

Вбудовані функції all() та any() можуть бути застосовані до списку або іншої послідовності для перевірки, чи всі, або будь-який з елементів задовольняють умову:

Операції над послідовностями різних типів

Елементи послідовності s можна обробляти почергово (здійснювати над ними ітерації, ітерувати) різними способами, основні з яких, наведено у таблиці 1.

Способи ітерування елементів послідовностей    Таблиця 1:

Вираз Python

Пояснення

for item in s

Проітерувати елементи s

for item in sorted(s)

Проітерувати впорядковані елементи s 

for item in set(s)

Проітерувати унікальні елементи s

for item in reversed(s)

Проітерувати зворотньо впорядковані елементи s

for item in set(s).difference(t)

Проітерувати елементи s, які не входять в t

for item in random.shuffle(s)

Проітерувати випадково впорядковані елементи s

Послідовності різних типів можна перетворювати між собою. Наприклад, tuple(s) – перетворення послідовності будь-якого типу в кортеж, list(s) – перетворення послідовності будь-якого типу в список. Для перетворення списку стрічок в єдину стрічку потрібно використовувати функцію join(), наприклад, ':'.join(words).

Деякі інші об’єкти, такі як  FreqDist, також можуть бути перетворені в послідовність, використовуючи list(), а також їх можна й ітерувати.

Генерація виразів

Використання list comprehensions дозволяє отримувати компактний та зручний для читання текст програми. Наприклад, наступний фрагмент програми для токенізації та нормалізації тексту:

 

>>> text = '''"When I use a word," Humpty Dumpty said in rather a scornful tone,

... "it means just what I choose it to mean - neither more nor less."'''

>>> [w.lower() for w in nltk.word_tokenize(text)]

['"', 'when', 'i', 'use', 'a', 'word', ',', '"', 'humpty', 'dumpty', 'said', ...]

Функції, як основа структурного програмування

Функції забезпечують ефективний спосіб збереження та повторного використання частин програм. Наприклад, припустимо, що існує необхідність часто читати тексти з HTML файлу. Це потребує виконання певної послідовності кроків: відкриття файлу, читання, нормалізація, видалення HTML розмітки. Можна зібрати ці кроки у функцію get_text().

 

import re

def get_text(file):

   """Read text from a file, normalizing whitespace and stripping HTML markup."""

   text = open(file).read()

   text = re.sub('\s+', ' ', text)

   text = re.sub(r'<.*?>', ' ', text)

   return text

Тепер, в будь-який момент, можна отримати текст з HTML файлу викликавши функцію get_text() вказавши назву файлу, як її аргумент. Функція повертає стрічку, значення, якої можна присвоїти будь-якій змінній, наприклад: contents = get_text("test.html"). При створенні функції важливе значення має вибір назви функції, що дозволяє зробити програму більш читабельною. У випадку попереднього прикладу, кожен раз коли програма повинна читати текст, немає потреби засмічувати текст основної програми чотирма рядками , потрібно тільки викликати функцію get_text (). Назва цієї функції має певну «семантичну інтерпретацію» і допомагає відразу зрозуміти що програма робить.

Функції дозволяють не тільки повторно використовувати текст частини програми та підвищують читабельність програми але  також підвищують достовірність тексту програми. Коли використовується текст програми, який вже попередньо розроблений і перевірений, то можна сподіватися що він працює правильно. Зменшується імовірність помилки та пропуску важливого кроку роботи програми.

  (my_sort3()).

 

>>> def my_sort1(mylist):      # good: modifies its argument, no return value

...    mylist.sort()

>>> def my_sort2(mylist):      # good: doesn't touch its argument, returns value

...    return sorted(mylist)

>>> def my_sort3(mylist):      # bad: modifies its argument and also returns it

...    mylist.sort()

...    return mylist


Виконання індивідуального завдання

  1.  Знайти в Python's help додаткову інформацію про послідовності. В інтерпретаторі, набрати по черзі help(str), help(list), та help(tuple). На екрані буде відображено повний список функцій властивих кожному з типів. Деякі функції мають спеціальні імена з подвійними підкреслюваннями. Кожній такій функції відповідає і інший запис показаний  в документації. Наприклад x.__getitem__(y) відповідає x[y].

  1.  Знайти три операції, які можна здійснювати і зі списками та із кортежами. Знайти три операції, які не можна здійснювати над кортежами.

Аналогічно до списків та стрічок, елементи кортежів можуть бути проіндексовані (#2), до них можна доступитися за допомогою зрізів (#3) та визначити кількість елементів (#4).

 

>>> t = 'walk', 'fem', 3 #1

>>> t

('walk', 'fem', 3)

>>> t[0] #2

'walk'

>>> t[1:] #3

('fem', 3)

>>> len(t) #4

Операції, які не можна здійснювати над кортежами:

t[0]=’run’

t.split()

t.append(‘new’)

  1.  Яким чином можна створити кортеж з одного елемента. Продемонструвати два різні способи.

>>> word='house',

>>> word

('house',)

>>>

Пустий кортеж створюється за допомогою пустих дужок (t=()). 

>>> t=()

>>> type(t)

<type 'tuple'>

>>>

Функція tuple(s) – перетворення послідовності будь-якого типу в кортеж

4.  Створити список words = ['is', 'NLP', 'fun', '?']. Використовуючи операції присвоювання подібні до words[1] = words[2] та тимчасову змінну  tmp перетворити цей список в список ['NLP', 'is', 'fun', '!']. Здійснити аналогічні перетворення використовуючи присвоювання в кортежах.

>>> word = ['is', 'NLP', 'fun', '?']

>>> bar='!'

>>> foo=bar

>>> bar

'!'

>>> (word[0], word[1], word[3])=(word[1],word[0],bar)

>>> word

['NLP', 'is', 'fun', '!']

>>>

>>> word = ['is', 'NLP', 'fun', '?']

>>> bar='!'

>>> foo=bar

>>> bar

'!'

>>> tmp=word[1]

>>> word[1]=word[0]

>>> word[0]=tmp

>>> word[3]=bar

>>> word

['NLP', 'is', 'fun', '!']

  1.  Прочитати про вбудовану функцію здійснення порівнянь cmp, набравши help(cmp). Продемонструвати чим поведінка цієї функції відрізняється від поведінки операторів порівняння.

>>> help(cmp)

Help on built-in function cmp in module __builtin__:

cmp(...)

   cmp(x, y) -> integer

   

   Return negative if x<y, zero if x==y, positive if x>y.

>>>

>>> 'x'<'y'

True

>>> 'x'=='y'

False

>>> 'x'>'y'

False

>>>

  1.  Написати програму для коректного виділення в тексті n-грамів з врахуванням граничних випадків: n = 1, та n = len(sent)?

>>> sentence=['The', 'snow', 'is', 'falling', 'slowly']

>>> n=1

>>> [sentence[i:i+n] for i in range(len(sentence)-n+1)]

[['The'], ['snow'], ['is'], ['falling'], ['slowly']]

>>> n=len(sentence)

>>> [sentence[i:i+n] for i in range(len(sentence)-n+1)]

[['The', 'snow', 'is', 'falling', 'slowly']]

>>>

7. Використати оператори нерівності для порівняння стрічок, наприклад. 'Monty' < 'Python'. Що станеться, якщо виконати  'Z' < 'a'? Порівняти стрічки,як мають однаковий префікс, наприклад 'Monty' < 'Montague'. Спробувати порівняти структуровані об’єкти ,наприклад. ('Monty', 1) < ('Monty', 2). Чи отримали очікувані результати?

>>> 'Monty'<'Python'

True

>>> 'Z'<'a'

True

>>> 'Monty' < 'Montague'

False

>>> ('Monty', 1) < ('Monty', 2)

True

  1.  Написати програму видалення пробілів на початку і в кінці стрічки та для видалення зайвих пробілів між словами. Використовувати split() та join(). Оформити у вигляді функції. Функція повинна містити повну стрічку документування.

>>> sent='  Who is on duty today?'

>>> a=sent.split()

>>> a

['Who', 'is', 'on', 'duty', 'today?']

>>> def delete_space(x):

b=' '.join(x)

return b

>>> delete_space(a)

'Who is on duty today?'

>>>

  1.  Написати програму видалення пробілів на початку і в кінці стрічки та для видалення зайвих пробілів між словами. Використовувати re.sub() . Оформити у вигляді функції. Функція повинна містити повну стрічку документування.

>>> import re, nltk

>>> sent='  Who is on duty today?   '

>>> def delete_extraspaces(str):

x= re.sub('\s+',' ',str)

 y= re.sub('^\s+','',x)

z= re.sub('\s+$','',y)

 return z

>>> delete_extraspaces(sent)

'Who is on duty today?'

  1.  Написати програму сортування слів за їх довжиною. Визначити допоміжну функцію cmp_len, яка буде використовувати функцію cmp для порівняння довжин слів. Функція повинна містити повну стрічку документування.

>>> sent='The sun is shining brightly'

>>> a=sent.split()

>>> a

['The', 'sun', 'is', 'shining', 'brightly']

>>> def sort(w):

c = sorted(w, lambda x, y: cmp(len(x), len(y)))

return c

>>> sort(a)

['is', 'The', 'sun', 'shining', 'brightly']

ВИСНОВКИ

Під час виконання даної лабораторної роботи я вивчила та засвоїла на практиці основи структурного програмування на мові Python, повторила та закріпила знання, отримані в попередніх лабораторних роботах.


 

А также другие работы, которые могут Вас заинтересовать

76059. Прогнозирование оценки за экзамен 3.5 MB
  Целью моей работы: показать можно ли использовать нейронные сети и эффективно ли их применение в данной области. Полносвязанной нейронной сетью называется многослойная структура в которой каждый нейрон произвольного слоя связан со всеми нейронами предыдущего слоя а в случае первого слоя со всеми входами нейронной сети.
76060. Право: понятие, характеристика, признаки, принципы 58.5 KB
  Разграничение права и закона имеет большой гуманистический смысл ибо тогда право рассматривается как критерий качества закона установления того насколько последний признаёт права человека его интересы и потребности.
76061. Антропогенный морфогенез в границах ландшафтов Рязанской области 7.5 MB
  Максимальный показатель антропогенной нагрузки характерен для ландшафтов с чехлом покровных суглинков залегающих на неогеновых песках см. Показатель антропогенной нагрузки изза гражданского строительства здесь ниже но все же достаточно высок и составляет 5 359 295 м3.
76062. Бизнес-план фирмы «ДомМаркет» 70.92 KB
  Предприятия малого бизнеса являются гибкой и динамичной формой реализации предпринимательской деятельности позволяющей свободно выразить деловой и творческий потенциал иметь определенные заработки для достойного образа жизни.
76065. Проектирование структурированной кабельной системы ООО «Прокуратов» 1.21 MB
  Вышеперечисленные стандарты описывают почти одинаковые кабельные системы; но несколько различаются в терминологии и определениях норм для родственных параметров. Кроме терминологии, в этих стандартах имеются различия в списке применимых кабелей: в 1568-А определен коаксиальный кабель 50 Ом...
76066. Внедрение многофункциональной системы «R-keeper» в Группу компаний «ПИР» в частности в ресторан «Корчма. Веселая Кума» 2.84 MB
  Задачи проекта: Автоматизация ресторанов позволяет повысить контроль над всеми процессами протекающим в ресторане, начиная от закупок, заканчивая очерёдностью подачи блюд. Система r keep позволяет ускорить подачу блюд, автоматизировав этапы прохождения заказа от клиента до кухни.