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


 

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

8365. Удивительный Китай 172.08 KB
  Удивительный Китай Китай - это не только другая страна, это другая планета, на которой обитают существа совершенно другой расы, мотивы слов и поступков которых подчиняются железно многотысячелетней логике, для обычного человека не имеющей разумного ...
8366. Демографический кризис в Китае и проблемы связанные с ним 32.41 KB
  Введение. Весь мир взволнован проблемами постоянно растущей численности населения Китая. Приводятся все новые факты, подтверждающие реальность китайской демографической угрозы. Огромное население придает всем проблемам в Китае масштабность, глубину...
8367. Заметки о китайском социализме 88 KB
  Заметки о китайском социализме. Опыт Китая позволяет понять, что необходимо сделать для строительства эффективного социалистического общества XXI века. Понятно, что это будет общество, отличающееся от социализма, обоснованного в других условиях К. М...
8368. Основы разговорного китайского языка 103.5 KB
  Основы разговорного китайского языка В пособии приводиться базовые фразы в форме диалогов, упражнения для повторения пройденной лексики, упражнения для перевода с русского языка на китайский для закрепления грамматических форм. Тексты, приведенные...
8369. Все о китайском чае 103 KB
  Во все времена Китай считался одним из главных производителей чая. За долгую историю производства чая в это стране были открыты и внедрены в практику различные способы выращивания чайного листа, продуманы и апробированы принципы его предварительной ...
8370. Китайский и японский новый год 41.5 KB
  Китайский новый год. Существует древнее суеверие, которое не позволяет в первый день Нового года есть мясо. Считается, что такая пища способна отвратить от человека счастье на целый год. Также не полагается мыть волосы в этот день, поскольку можно с...
8371. Китайское изобразительное искусство 53 KB
  Китайское изобразительное искусство Китайская национальная живопись гохуа появилась в глубокой древности. Она отличается большим своеобразием и совершенно отлична по материалу, технике и художественным средствам от европейской живописи. Китайские ка...
8372. Великая китайская стена 32 KB
  Великая китайская стена (кит.трад., упр, пинь инь: буквально: Длинная стена или кит. трад., упр., пиньинь, буквально: Длинная стена в 10 000 ли)...
8373. Великая китайская стена. Архитектурное сооружение 27.5 KB
  Великая китайская стена Эта очень однородная традиционная архитектура повторяется на протяжении веков установлением типов простых прямоугольных зданий невысокого силуэта, построенных в соответствии с канонами пропорций и методов строительства, котор...