4714

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

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

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

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

Украинкский

2012-11-25

127.5 KB

17 чел.

Мета робота

Вивчити основи структурного програмування мовою 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, повторила та закріпила знання, отримані в попередніх лабораторних роботах.


 

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

5312. Мультиплетность спектров и спин электрона 159.5 KB
  Мультиплетность спектров и спин электрона Исследование спектров щелочных металлов при помощи приборов с большой разрешающей силой показало, что каждая линия этих спектров является двойной (дублет). Так, например, характерная для натрия желтая линия...
5313. Атом водорода 198.5 KB
  Атом водорода В атоме водорода или водородоподобном ионе потенциальная энергия электрона равна где Ze заряд ядра, r расстояние между ядром и электроном. Уравнение Шредингера имеет в этом случае вид Поскольку п...
5314. Изучение рынка земельных участков и выявления его роли в формировании экономической системы 294 KB
  Актуальность изучения земельного рынка обусловлена тем фактором, что Россия располагает огромными земельными ресурсами, но это национальное богатство страны используется крайне неэффективно. Начатая в 1991 году земельная реформа не доведена...
5315. Корпускулярно волновой дуализм 82 KB
  Корпускулярно волновой дуализм Экспериментальные факты свидетельствуют, что в ряде явлений свет проявляет сугубо волновые свойства (дифракция, интерференция, поляризация, дисперсия), а в ряде – чисто корпускулярные (фотоэффект, эффект Комптона)...
5316. Политический режим в современной России (2000-2008) 34 KB
  Новый политический режим (2000-2008), связанный с именем нового президента, стал формироваться после президентских выборов 2000 г. Но еще до выборов стал проявляться политический стиль нового лидер...
5317. Проектирование трёхфазного асинхронного двигателя с короткозамкнутым ротором серии 4А 1.3 MB
  Электрические машины имеют чрезвычайно широкое распространение. Они применяются в различных отраслях промышленности, сельского хозяйства, в энергетике, на транспорте, в авиации, в морском и речном флоте, медицине, быту и т.д. Нет ни одной о...
5318. Международное инвестирование. Понятие международных корпораций 71 KB
  На рубеже XX-XXI веков развитие национальных экономик и их взаимоотношения (политические, экономические и др.) приобретают совершенно другое качество. Это обусловлено тем, что современное развитие мировой экономики проходит под воздействие...
5319. Фотоны и фотоэффект. Эффект Комптона 100 KB
  Фотоны. В теории равновесного излучения абсолютно черного тела Планка вводится понятие фотона - кванта света или порции излучения, которая может поглощаться или излучаться только целиком. С другой стороны, по средствам фотонов осуществляется...
5320. Проектирование мехатронных систем 1.98 MB
  Анализ и синтез кинематических параметров мехатронных систем При управлении мехатронным модулем с вращательной кинематической парой часто используется привод поступательного действия, в частности, электрогидравлический с гидроцилиндрами. Целесообраз...