4716

Ознайомлення з основними типами даних в Python

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

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

Мета роботи Ознайомлення з основними типами даних в Python. Вивчення основ програмування на мові Python. Короткі теоретичні відомості Python - це проста і потужна об’єктно-орієнтована мова програмування високого рівня з чудовими мож...

Украинкский

2012-11-25

310.5 KB

15 чел.

Мета роботи

  •  Ознайомлення з основними типами даних в Python.
  •  Вивчення основ програмування на мові Python.

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

Python - це проста і потужна об’єктно-орієнтована мова програмування високого рівня з чудовими можливостями для обробки лінгвістичних даних.

Natural Language Toolk (NLTK) – набір Python бібліотек, які призначені для аналізу текстів природною мовою. NLTK дозволяє здійснювати символьний та статистичний аналіз текстів, створювати графічні звіти та містить детальну документацію і використовується в проектах з лінгвістики, штучного інтелекту, машинного навчання, автоматизації документообігу. Його можна застосовувати як начальний комплекс, готовий аналітичний інструмент або платформу для створення прикладних систем опрацювання текстів. NLTK вільно розповсюджується (http://www.nltk.org ) і всі бажаючі можуть його встановити згідно інструкції розробників.

Python – інтерпретаційна мова, яка дозволяє зекономити час, що витрачається на компіляцію. Інтерпретатор можна використовувати інтерактивне, що дозволяє експериментувати з можливостями мови і створювати фрагменти програм або тестувати окремі функції.

Інтерпретатор – це програма яка виконує Python програми.

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32

Type "copyright", "credits" or "license()" for more information.

При запуску інтерпретатора ми бачимо інформацію про його  версію, додаткову інформацію і запрошення >>> вводити оператори Python. У випадку використання Interactive DeveLopment Environment (IDLE) нам доступні додаткові зручності, зокрема у відображенні тексту програми на екрані.

1. Змінні, операції і вирази

1.1 Використання інтерпретатора Python, як калькулятора

Спробуємо використати Python, як калькулятор.

>>> 2+5

7

>>> 3*6

18

>>>

Після натиснення Enter виконуються дії, інтерпретатор видає результат і чекає на введення наступного оператора. Операція множення виконана вірно з додержанням пріоритету виконання арифметичних дій.

Можемо спробувати виконати інші операції множення і ділення.

>>> 3/3

1

>>> 1/3

0

>>>

В другому випадку отримали нуль, бо ділення в цьому випадку є цілочисленним. Математичні операції будуть використовуватись при роботі з лінгвістичними даними в Python. Якщо ввести вираз без змісту то інтерпретатор видає повідомлення про помилку з вказуванням місця помилки і її типу.

>>> 1+

SyntaxError: invalid syntax

>>>  

1.2. Представлення тексту

Спробуємо працювати з текстом, його можна безпосередньо вводити в інтерпретатор.

>>> Hello World

SyntaxError: invalid syntax

>>>

Отримали помилку. Текст або частини тексту в програмах на Python представляються за допомогою стрічок (string) і повинен відділятися від решти програми лапками (одинарними(1), подвійними(2) або потрійними).

>>> 'Monty Python'                (1)

'Monty Python'

>>> "Monty Python's Flying Circus"    (2)

"Monty Python's Flying Circus"

>>> 'Monty Python\'s Flying Circus'  (3)

"Monty Python's Flying Circus"

>>> 'Monty Python's Flying Circus' (4)

 File "<stdin>", line 1

   'Monty Python's Flying Circus'

                 ^

SyntaxError: invalid syntax

Якщо стрічка містить одинарні лапки необхідно використовувати лівий слеш перед апострофом (3) для того, щоб символ апострофа не розглядався як символ завершення стрічки або використовувати подвійні лапки (2).  Якщо цього не зробити, то отримаємо помилку (4).

>>> "Hello World"

'Hello World'

>>> 'Hello World'

'Hello World'

>>>

Деколи стрічки можуть складатися з кількох рядків. Python забезпечує декілька способів роботи з ними. В наступному прикладі послідовність з двох стрічок об’єднується в одну. Потрібно використовувати лівий слеш (1) або круглі дужки (2) для того щоб інтерпретатор знав що ввід стрічки ще не завершився після введення першого рядка.

>>> "Shall I compare thee to a Summer's day?"\

    "Thou are more lovely and more temperate:"

Shall I compare thee to a Summer's day?Thou are more lovely and more temperate:

>>>

>>> ("Rough winds do shake the darling buds of May,"

         "And Summer's lease hath all too short a date:")

Rough winds do shake the darling buds of May,And Summer's lease hath all too short a date:

>>>

Застосування потрійних лапок дозволяє представляти стрічку так як вона введена з розділенням окремих рядків:

>>> """Shall I compare thee to a Summer's day?

Thou are more lovely and more temperate:"""

Shall I compare thee to a Summer's day?

Thou are more lovely and more temperate:

>>> '''Rough winds do shake the darling buds of May,

And Summer's lease hath all too short a date:'''

Rough winds do shake the darling buds of May,

And Summer's lease hath all too short a date:

>>>

Стрічку також можна вивести за допомогою команди print. Зверніть увагу, що застосовано потрійні лапки і текст виводиться в тому ж самому форматуванні.

>>> print """

Usage: thingy [OPTIONS]

    -h                        Display this usage message

    -H hostname               Hostname to connect to

"""

Usage: thingy [OPTIONS]

    -h                        Display this usage message

    -H hostname               Hostname to connect to

>>>

Спробуємо використати оператори додавання і множення для роботи з стрічкою.

>>> 'Hello'+ 'World'

'HelloWorld'

Оператор додавання виконує операцію поєднання. Він дозволяє створити нову стрічку на основі двох існуючих, але він не додає пробіл між словами. Спробуємо поєднати три однакові стрічки за допомогою операторів множення та додавання.

>>> 'Hi'+'Hi'+'Hi'

'HiHiHi'

>>> 'Hi'*3

'HiHiHi'

>>>

1.3. Значення і типи

Всі програми працюють із значеннями. Значенням може бути число або стрічка.

Наприклад, в першій програмі ми вже друкували на екрані стрічкове значення "Hello world!". Аналогічним чином можна вивести і число:

>>> print 12

12

"Hello world!" і 12 належать до різних типів: str (від англ. string – стрічка) і int (від англ. integer – ціле число). В деяких версіях Python ці типи носять нескорочені назви: string і integer. Інтерпретатор відрізняє стрічку від числа по лапках, в які вона поміщена.

Якщо ви не впевнені в тому, до якого типу належить значення, це можна перевірити так:

>>> type("Hello world!")

<type 'str'>

>>> type(12)

<type 'int'>

>>> type(2.4)

<type 'float'>

Стрічковий тип називається в Python str, цілочисельний носить назву int, а дріб – float (від англ. floating-point number – число з плаваючою точкою).

  •  Вправа. Проведіть самостійно наступний експеримент: перевірте типи значень "12" і "2.4"? Якого вони типу і чому?
  •  Вправа. Що відбудеться, якщо стрічку "8.53" спробувати перетворити в ціле число за допомогою функції int()? Як вирішити цю проблему?

1.4. Перетворення типів

Функція int() перетворює значення в цілочисельний тип. Якщо перетворення провести неможливо, то буде виведено повідомлення про помилку:

>>> int("32")

32

>>> int("Hello")

Traceback (most recent call last):

File "", line 1, in ?

ValueError: invalid literal for int(): Hello

Функція int() може приводити до цілого типу і дробові числа, але не забувайте, що при перетворенні вона просто відкидає дробову частину:

>>> int(3.99999)

3

>>> int(-2.3)

-2

Функція float() перетворює цілі числа і стрічки в дробовий тип:

>>> float(32)

32.0

>>> float("3.14159")

3.14159

І, нарешті, функція str() відповідає за перетворення до стрічкового типу. Саме її заздалегідь запускає команда print:

>>> str(32)

'32'

>>> str(3.14149)

'3.14149'

Python  розрізняє ціле число 1 від дробового 1.0: це одне і те ж число, але воно належить до різних типів. Від типу значення залежить спосіб його зберігання в пам'яті.

1.5. Змінні

Як будь-яка інша мова програмування Python  підтримує концепцію змінних, але з невеликою відмінністю. Якщо в мовах C++ або Pascal змінна – це ім'я елементу пам'яті, в якій зберігається значення, то в Python змінна – це посилання на комірку пам'яті. Відмінність, на перший погляд, неістотна, але насправді це трохи іншої підхід до організації зберігання об'єктів в пам'яті.

Для того, щоб «запам'ятати» значення достатньо привласнити його змінній. Це робиться за допомогою спеціального оператора привласнення, який позначається знаком рівності (=).

>>> message = "Hello world!"

>>> n = 12

>>> pi = 3.14159

У даному прикладі змінній message привласнюється (або зіставляється) значення "Hello world!", змінній n привласнюється значення 12, а змінній pi – 3.14159.

Команда print працює і зі змінними:

>>> print message

Hello world!

>>> print n

12

>>> print pi

3.14159

Як бачите, команда print виводить не імена змінних, а їх значення. Змінні так само як і значення, мають тип. Давайте це перевіримо за допомогою функції type():

>>> type(message)

<type 'str'>

>>> type(n)

<type 'int'>

Тип змінної співпадає з типом привласненого нею значення. Розглянемо ще один приклад:

>>> message = "Hello world!"

>>> n = 12

>>> type(message)

<type 'str'>

>>> message = n

>>> print message

12

>>> type(message)

<type 'int'>

Цей приклад є цікавим з двох причин. По-перше, в ньому використана можливість привласнювати значення однієї змінної іншій. Конструкція message=n працює аналогічно привласненню змінній значення: змінній message привласнюється значення змінної n. При цьому значення 12 зберігається в пам'яті тільки один раз – Python  досить економно витрачає пам'ять.

По-друге, як видно з прикладу, змінна message після привласнення їй значення n поміняла свій тип. Далеко не кожна мова програмування «вміє» це робити так просто.

1.6. Імена змінних і ключові слова

Для перетворення абстрактної, не проявленої в матеріальному світі ідеї в код програми необхідно виділити сутність і дії, придумати їм назви, щоб ними управляти, прослідкувати зв'язки між ними та їх властивостями. Ви, напевно, здогадалися, що іменами сутностей, з якими працює програміст, служать змінні. Тому варто вибирати осмислені назви змінних.

Імена змінних можуть бути довільної довжини, але прагніть вибирати не дуже короткі і не дуже довгі імена – від цього залежить читабельність програми.

При визначенні імен змінних в Python можна використовувати будь-які латинські букви, цифри і знак _ (знак підкреслення). Знак підкреслення може використовуватися для розділення слів складових ім'я змінної: наприклад, user_name або full_price. Але назви змінних не можуть починатися з цифри.

>>> 1message = "Hello world!"

File "<stdin>", line 1

1message = "Hello world!"

^

SyntaxError: invalid syntax

>>> price_in_$ = 300

File "<stdin>", line 1

price_in_$ = 300

^

SyntaxError: invalid syntax

>>> class = "Computer Science 101"

File "<stdin>", line 1

class = "Computer Science 101"

^

SyntaxError: invalid syntax

Розберемо ці три приклади. Перший вираз інтерпретатору не сподобався, і він відзначив знаком ^, де саме у нього виникли претензії: він вказав на найменування змінної 1message. Дійсно, ім'я 1message є некоректним, адже воно починається з цифри. Аналогічна ситуація з іменем price_in_$: воно містить неприпустимий символ $. Але що інтерпретатору не подобається в третьому виразі? Давайте спробуємо змінити ім'я змінної class на що-небудь схоже, наприклад, class_:

>>> class_ = "Computer Science 101"

>>> print class_

Computer Science 101

Тепер все гаразд. У чому ж справа? Чому ім'я class викликало помилку, а ім'я class_ – ні? Які є припущення? Поставимо ще один експеримент:

>>> print = "Some message"

File "<stdin>", line 1

print = "Some message"

^

SyntaxError: invalid syntax

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

Дійсно, слова class і print є так званими ключовими словами.

Всього в Python  зарезервовано 29 ключових слів:

and

del

for

is

raise

assert

elif

from

lambda

return

break

else

global

not

try

class

except

if

or

while

continue

exec

import

pass

yield

def

finally

in

print

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

Слід пам’ятати, що інтерпретатор розрізняє великі і маленькі букви, тобто message і Message будуть різними змінними.

  •  Вправа. Напишіть програму, яка підтверджує, що інтерпретатор Python  розрізняє рядкові і заголовні букви в іменах змінних.

1.7. Вирази

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

Наприклад, print "Hello world!" і message = n є виразами.

Коли ви набираєте вираз в командному рядку, інтерпретатор виконує його і виводить результат, якщо він існує. Результатом виразу print "Hello world!" є рядок: Hello world!. Вираз привласнення нічого не виводить.

1.8. Виконання виразів

По суті, вираз – це послідовність значень, змінних і операторів.

Якщо ви напишете вираз, то інтерпретатор, після виконання, виведе його на екран:

>>> 1 + 1

2

Значення само по собі розглядається як вираз, так само як і змінна:

>>> 17

17

>>> x = 2

>>> x

2

Але виконання і виведення результату виконання виразу не зовсім те ж саме:

>>> message = "Hello world!"

>>> message

"Hello world!"

>>> print message

Hello world!

Коли Python  виводить значення виразу в командному режимі, він використовує той же формат, що використовується при введенні цього значення. Наприклад, при виведенні рядків він бере їх в лапки. Команда print також виводить значення виразу, але у випадку з рядками, вона виводить вміст рядка без лапок.

У командному режимі інтерпретатор Python зберігає результат останнього виразу в спеціальній змінній _ (знак підкреслення). Ви можете переглянути результат виконання останнього виразу і використовувати його в своїх виразах:

>>> 1.25 + 1

2.25

>>> print _

2.25

>>> 5 + _

7.25

1.9. Оператори і операнди

Операторами називають спеціальні символи (або послідовності символів) що позначають певні операції. Наприклад, знаком «+» позначають операцію додавання, а знаком «*» – множення. Значення, над якими виконується операція, називають операндами.

Всі нижченаведені вирази, з погляду Python  є коректними:

20+32 hour-1 hour*60+minute minute/60 5**2 (5+9)*(15-7)

Значення більшості з них неважко зрозуміти. Значення символів +, - * і / у Python  такі ж, як в математиці. Дужки використовуються для групування операцій, а двома зірочками (**) позначається операція піднесення до ступеня.

Якщо операндом є змінна, то перед обчисленням виразу проводиться підстановка на її місце значення, на яке вказує ця змінна.

Додавання, віднімання, множення і піднесення до ступеня працюють в звичний для нас способом, але дія операції ділення дещо відрізняється. Це ілюструє наступний приклад:

>>> minute = 59

>>> minute/60

0

Значення змінної minute рівне 59; результат ділення 59 на 60 повинен бути 0.98333, а не 0. Причиною цієї невідповідності є те, що Python  виконує цілочисельне ділення.

Коли обидва операнди – цілі числа, і Python  вважає, що результат теж повинен бути цілим. Тому цілочисельне ділення завжди відкидає дробову частину.

Як отримати дробовий результат? Достатньо примусово перетворити один з операндів в дробове число:

>>> minute = 59

>>> float(minute)/ 60

0.983333333333

Інший варіант:

>>> minute = 59

>>> minute / 60.0

0.983333333333

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

1.10. Порядок операцій

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

>>> print 100 * 20 / 80, "%"

25 %

В даному прикладі обчислюється процентне співвідношення двох чисел: 20 і 80. Після результату виразу виводиться символ % – інтерпретатор обчислює арифметичне вираз і виводить результат, а потім дописує рядок, що стоїть після коми.

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

Найвищий пріоритет у дужок, які дозволяють змінювати послідовність виконання операцій. Таким чином, операції в дужках виконуються в першу чергу.

Наприклад, 2*(3-1) рівне 4 (1+1)**(5-2) – 8. Дужки зручно використовувати і для того, щоб вирази було легко читати, навіть якщо їх наявність у виразі ніяк не відбивається на результаті: (100*20)/80.

Наступний пріоритет у операції піднесення до ступеня, тому 2**1+1 рівне 3, а не 4, і вираз 3*1**3 дасть результат 3, а не 27.

Множення і ділення мають однаковий пріоритет, вищий, ніж в операцій додавання і віднімання. 2*3-1 дорівнює 5, а не 4; 2/3-1 дорівнює -1, а не 1 (результат цілочисельного ділення 2/3=0).

Оператори з однаковим пріоритетом виконуються зліва направо. Отже в виразі 100*20/80 множення виконується першим (виразу набуває вигляд 2000/80); потім виконується ділення, значення, що видає в результаті, 25. Якби операції виконувалися справа наліво, то результат вийшов би іншим.

  •  Вправа. Змініть вираз 100*20/80 так, щоб послідовність виконання операцій була зворотною. Який результат ви отримали після його виконання і чому?

2. Стрічки

Перейдемо до докладнішого вивчення типів даних, адже для ефективнішого управління даними корисно розуміти, як вони влаштовані. Почнемо з одного з вже знайомих нам типів – стрічка (str).

2.1. Прості операції над стрічками

Взагалі кажучи, над стрічками не можна проводити ті ж операції, що і над числами, тому наступні приклади працювати не будуть:

message-1 "Hello"/123 "Hello"*"world!" "15"+2

Але оператор «+» працює з стрічками, хоча позначає іншу операцію: конкатенацію або зчеплення рядків.

>>> str1 = "Hello"

>>> str2 = " world"

>>> print str1 + str2 + "!"

Hello world!

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

Оператор * теж можна використовувати по відношенню до стрічок, але за умови, що одним з операндів буде ціле число. В цьому випадку оператор * символізує операцію повторення стрічки (або ітерацію). Наприклад, 'Fun'*3 видасть результат 'FunFunFun'. Можна прослідкувати аналогію між операціями над числами і операціями над стрічками: так само, як 4*3 еквівалентно 4+4+4, 'Fun'*3 еквівалентно 'Fun'+'Fun'+'Fun'.

Але з іншого боку, конкатенація і повторення мають кілька істотних відмінностей від складання і множення.

  •  Вправа. Який результат буде отримано після виконання виразу "hello"+" world"*3? Які висновки можна зробити на основі цього результату?

2.2. Оператор індексування

Ми вже навчилися виконувати деякі операції над стрічками, але до цього моменту ми працювали зі стрічкою як з єдиним цілим. Відомі нам операції над стрічками (конкатенація і ітерація) є, по суті аналогами складання і множення чисел, але цей набір неповний – не вистачає аналогів операцій віднімання і ділення.

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

Простий з них – оператор індексування. Даний оператор дозволяє отримати будь-який одиночний символ зі стрічки. У нього досить простій синтаксис:

РЯДОК[ІНДЕКС]

Індекс, що указується в квадратних дужках, є порядковим номером символу в стрічці:

>>> 'Hello!'[1]

'e'

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

>>> 'Hello!'[0]

'H'

2.3. Довжина стрічки і від’ємні індекси

Для зручної роботи з оператором індексування добре б було знати довжину стрічки. Втім, з'ясувати це можна за допомогою вбудованої функції  len().

>>> len('Hello world!')

12

>>>

Зверніть увагу, що пропуск теж враховується як символ. Визначати можна також і довжину змінної:

>>> a='Hello!'

>>> len(a)

6

>>>

Тепер давайте спробуємо вивести останній символ стрічки:

>>> а = 'Hello!'

>>> а[len(a)]

Traceback (most recent call last):

File "<pyshell#16>", line 1, in -toplevela[

len(a)]

IndexError: string index out of range

>>>

Оскільки нумерація символів в стрічках починається з нуля, ми використали неприпустиме значення індексу – символу з таким індексом в цій стрічці немає, тому інтерпретатор згенерував виключення IndexError: string index out of range. Виправимо помилку скориставшись композицією: як індекс можна використати будь-який вираз, що повертає ціле число.

>>> а = 'Hello!'

>>> а[len(a)-1]

'!'

Використання функції len() в операторі індексування виглядає громіздко, тому передбачено коротший варіант запису:

>>> а[-1]

'!'

Ще один маленький експеримент. Спробуємо підставити як індекс інше від’ємне число:

>>> а[-5]

'e'

Таким чином, ми можемо індексувати стрічку з обох її кінців – це дуже зручно. До речі, така можливість є в дуже небагатьох мовах програмування. А зараз невелика вправа для закріплення матеріалу.

  •  Вправа. Напишіть програму, яка виводить довжину введеної користувачем стрічки, а також перший, п'ятий і останній символ. Не забудьте передбачити випадок, коли довжина стрічки складає менше за п'ять символів.

2.4. Доступ до підстрічок

У випадку коли потрібно отримати доступ до більш ніж одного символу, ми повинні в квадратних дужках вказати індекс першого символу і останнього розділивши їх двокрапкою. Цей процес називається slicing (зріз).(Рис 1.)

Рис.1. Формування зрізів при доступі до під стрічок.

>>> msg='Monty Python'

>>> msg[6:10]

'Pyth'

>>> msg[-12:-7]

'Monty'

>>>

Звертаємо увагу, що ми отримали три символи але не отримали четвертий. Якщо ввести діапазон [0:11] отримаємо всю стрічку.

>>> msg='Monty Python'

>>> msg[6:10]

'Pyth'

>>> msg[-12:-7]

'Monty'

>>> len(msg)

12

>>> msg[0:12]

'Monty Python'

>>>

Також можна використовувати від’ємні індекси, та опускати перший чи останні індекс.

>>> msg[0:5]

'Monty'

>>> msg[:5]

'Monty'

>>> msg[:-1]

'Monty Pytho'

>>> msg[:]

'Monty Python'

>>>  

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

>>> msg[0:12:2]

'MnyPto'

>>> msg[12:0:-2]

'nhy to'

>>>  

2.5. Зміни у стрічках

Стрічка – це послідовність символів з довільним доступом. Стрічку в мові Python неможливо змінити – в цьому випадку говорять, що це immutable тип. Спроба змінити символ в певній позиції або підстрічці викличе помилку:

>>> msg='Monty Python'

>>> msg[2]

'n'

>>> msg[2]='k'

Traceback (most recent call last):

 File "<pyshell#19>", line 1, in <module>

   msg[2]='k'

TypeError: 'str' object does not support item assignment

>>>

Але, змінити символ можна за допомогою зрізів в такий спосіб:

>>> msg=msg[:2]

>>> msg='Monty Python'

>>> msg[:2]

'Mo'

>>> msg[3:]

'ty Python'

>>> msg=msg[:2]+'k'+msg[3:]

>>> msg

'Mokty Python'

>>>

2.4. Речення

Речення також можна представити як стрічку і працювати з нею, як було показано вище.

>>> sent='colorless green ideas sleep furiously'

>>> sent[16:21]

'ideas'

>>> len(sent)

37

>>>

Але нам потрібно працювати з реченням, яка є послідовністю слів, а не символів. Тому, варто познайомитися з наступним типом послідовностей – списками.

3. Списки

Список – це впорядкована множина значень, що ідентифікуються індексом. Багато в чому  списки є схожими на стрічки, які, по суті, теж є впорядкованими множинами символів. Відмінність списків і стрічок полягає в тому, що елементи списку можуть бути любого типу. Впорядковані множини називають послідовностями.

3.1. Створення списків

Існує наскільки способів створення списків. Найпростіший з них: перерахувати елементи списку через кому в квадратних дужках:

>>> [10, 20, 30, 40]

[10, 20, 30, 40]

>>> ["one", "two", "three"]

['one', 'two', 'three']

Перший приклад – список чотирьох цілих чисел, а другий – список трьох стрічок. Елементи списків зовсім не обов'язково повинні бути одного типу. Наступний список містить стрічку, ціле і дробове числа і інший список:

>>> ["hello", 5, 2.0 [10, 20]]

['hello', 5, 2.0 [10, 20]]

Список, що є елементом іншого списку, називають вкладеним.

Список, який не містить жодного елементу, називають порожнім. Він позначається порожніми квадратними дужками ([]).

Ну, і нарешті, як і будь-які інші значення, списки можуть зберігатися в змінних:

numbers = [17, 123, 537]

empty = []

print numbers, empty

[17, 123, 537] []

3.2. Функція  range

Для завдання послідовності чисел у формі арифметичної прогресії (1 2 3 4 5 6...) зручно користуватися вбудованою функцією range(). Вона має три форми, розглянемо на прикладах всі:

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Ця форма повертає всі цілі числа в діапазоні від 0 до числа 10, не включаючи само число 10.

>>> range(5, 10)

[5, 6, 7, 8, 9]

Ця форма повертає всі цілі числа в діапазоні від 5 до числа 10, не включаючи само число 10, але включаючи початкове число 5.

>>> range(0, 10, 3)

[0, 3, 6, 9]

>>> range(-10, -100, -30)

[-10, -40, -70]

Ця форма повертає всі цілі значення в діапазоні від початкового до кінцевого з кроком, заданим третім параметром. Причому, якщо, наприклад, ви спробуєте ввести range(1, 100 -1), то очевидно, що чисел в цьому діапазоні немає, тобто результатом буде порожня множина([]).

Якщо ви хочете задати діапазон через кількість елементів в списку, то слід скористатися функцією range у поєднанні з функцією len:

>>> а = [`Linux', 'is', 'the', 'best', 'system']

>>> for i in range(len(a)):

... print i, а[i] #Звертання до елементу списку по його індексу

...

0 Linux

1 is

2 the

3 best

4 system

Крім того, Python надає можливість швидкого створення списків цілих значень, без необхідності їх перераховувати:

>>> range(1,5)

[1, 2, 3, 4]

У даному прикладі функція range() приймає два цілих аргументи і повертає список, який містить всі цілі числа в проміжку між заданими значеннями, включаючи перше і виключаючи друге.

Існує ще два способи виклику функції range(). Якщо їй передано тільки одне значення, то в результаті вона поверне список з цілими значеннями від 0 до N, де N – значення параметра:

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Якщо ж range() викликана з трьома аргументами, то останній з них інтерпретується як розмір кроку. Тобто в результуючому списку значення йтимуть не підряд, а через проміжки, що дорівнюють заданому кроку:

>>> range(1, 10, 2)

[1, 3, 5, 7, 9]

3.3. Списки і індекси

Синтаксис звернення до елементів списку такий самий, як і при зверненні до символів стрічок – використовуємо оператор індексування ([]).

>>> numbers[0]

17

>>> numbers[-1]

537

Стосовно списків оператор індексування працює точно так, як і у випадку стрічок. Індексом може бути будь-який вираз, що повертає ціле число, в тому числі від’ємне. Якщо індекс менше нуля, то відлік індексу буде розпочато з кінця списку.

Оператор побудови зрізу списку працює подібно, як і зі стрічками:

>>> list = ['a', 'b', 'c', 'd', 'e', 'f']

>>> list[1:3]

['b', 'c']

>>> list[:4]

['a', 'b', 'c', 'd']

>>> list[3:]

['d', 'e', 'f']

>>> list[:]

['a', 'b', 'c', 'd', 'e', 'f']

Єдина відмінність полягає в тому, що елементи списків (на відміну від символів стрічок) можна змінювати:

>>> numbers[1]= 5

>>> numbers

[17, 5, 537]

>>> numbers[1:]= [6, 7]

>>> numbers

[17, 6, 7]

>>> numbers[0], numbers[2]= 1, 2

>>> numbers

[1, 6, 2]

3.4. Довжина списку

Неважко здогадатися, що для обчислення довжини списку можна використати функцію len(). Зверніть увагу, що якщо список містить як елемент інший список, то цей вкладений список вважатиметься як один елемент. Це видно з наступного прикладу:

>>> mylist = [[1, 'one'], [2, 'two'], [3, 'three'], 'four', 5]

>>> len(mylist)

5

3.5. Додатково про списки

Метод — це функція, що "належить" об'єкту, викликається як obj.methodname, де obj — об'єкт (або вираз, що його визначає) і methodname — ім'я методу, визначеного для даного типу об'єктів. Різні типи мають різні набори методів. Методи різних типів можуть мати однакові імена, не приводячи до невизначеності.

Списковий тип даних має декілька методів. Всі вони приведені нижче:

insert (i, x)

Вставляє елемент в задану позицію. Перший аргумент - індекс елементу, перед яким проводиться вставка.

Наприклад, а.insert(0,x) вставить в початок списку, а а.insert(len(a),x) додасть елемент до кінця списку.

append (x)

Додає елемент до кінця списку.

index (x)

Повертає індекс першого елементу списку, значення якого рівне x . Якщо такого елементу немає, то виникне помилка.

remove (x)

Видаляє із списку перший елемент, рівний x . У разі його відсутності також виникне помилка.

sort ()

Сортує елементи списку.

reverse ()

Записує елементи списку в зворотному порядку.

count (x)

Повертає кількість елементів списку, рівних x

extend(L)

Додає до кінця списку всі елементи списку L.

pop(i)

Повертає елемент з індексом i і вилучає його зі списку. Якщо функція  pop() задається без параметрів, то буде повернено і вилучено останній елемент списку.

Ось приклади, що використовують методи списків:

>>> phrase=['red', 'green', 'blue', 'yellow']

>>> phrase.insert(1,'black')

>>> phrase

['red', 'black', 'green', 'blue', 'yellow']

>>> phrase.append('black')

>>> phrase

['red', 'black', 'green', 'blue', 'yellow', 'black']

>>> phrase.count('black')

2

>>> phrase.index('black')

1

>>> phrase.remove('black')

>>> phrase

['red', 'green', 'blue', 'yellow', 'black']

>>> phrase.sort()

>>> phrase

['black', 'blue', 'green', 'red', 'yellow']

>>> phrase.reverse()

>>> phrase

['yellow', 'red', 'green', 'blue', 'black']

>>>

>>> phrase1=[10,20,30,40]

>>> phrase.extend(phrase1)

>>> phrase

['yellow', 'red', 'green', 'blue', 'black', 10, 20, 30, 40]

>>> phrase.pop(0)

'yellow'

>>> phrase

['red', 'green', 'blue', 'black', 10, 20, 30, 40]

>>>

3.6. Оператор del

Існує спосіб видалення елементу із списку шляхом завдання індексу елементу, а не його значення: оператор del. Він також дозволяє видаляти цілі шматки із списку (що ми і раніше робили, привласнюючи шматку порожній список). Наприклад:

>>> phrase=['yellow', 'red', 'green', 'blue', 'black']

>>> phrase

['yellow', 'red', 'green', 'blue', 'black']

>>> del phrase[2]

>>> phrase

['yellow', 'red', 'blue', 'black']

>>> del phrase[:2]

>>> phrase

['blue', 'black']

>>>

del можна ще використовувати для видалення цілої змінної:

>>> del phrase

>>> phrase

Traceback (most recent call last):

 File "<pyshell#80>", line 1, in <module>

   phrase

NameError: name 'phrase' is not defined

>>>

Тепер посилання на ім'я а приведе до помилки (принаймні, поки йому не привласнимо нового значення).

4. Кортежі

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

Кортеж складається з множини значень, що розділені комами, наприклад:

>>> t = 12345, 54321, 'Привіт!'

>>> t[0]

12345

>>> t

(12345, 54321, 'hello!')

>>> # Кортежі так само можуть бути вкладеними:

... u = t (1, 2, 3, 4, 5)

>>> u

((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

Вміст кортежів завжди поміщається в круглі дужки, для того, щоб вкладені кортежі інтерпретувалися правильно; вони можуть бути введені як з, так і без навколишніх круглих дужок, хоча часто круглі дужки необхідні так чи інакше (особливо, якщо кортеж - частина більшого виразу).

Кортежі використовуються дуже часто. Наприклад: (x, у) - координати в парі, запис в базі даних тощо. Кортежі, подібно до рядків, є незмінними: неможливо змінити окремі елементи кортежу. Можна створювати кортежі, які містять змінні об'єкти, на подобі списків.

Порожні кортежі створюються парою круглих дужок без всяких елементів; кортеж з одним елементом створюється одним значенням з комою після нього (недостатньо включити одне значення в круглі дужки). Наприклад:

>>> kortez_0=()

>>> type(kortez_0)

<type 'tuple'>

>>> len(kortez_0)

0

>>> kortez_1='hello',

>>> type(kortez_1)

<type 'tuple'>

>>> len(kortez_1)

1

>>> kortez_2='by',0

>>> type(kortez_2)

<type 'tuple'>

>>> len(kortez_2)

2

>>>

Інструкція kortez_2='by',0 є типовим прикладом упаковки кортежу: значення 'by' і 0 упаковані в одному кортежі. Також можлива операція розпаковування кортежу:

>>> x,y=kortez_2

>>> x

'by'

>>> y

0

>>>

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

Тут також слід зазначити маленьку асиметрію упаковки і розпаковування кортежів: упаковка кількох значень завжди створює кортеж, в результаті роботи розпаковування може бути будь-яка послідовність.

5. Набори

Python використовує такий тип даних як набори.

Набір - це неврегульована колекція значень без дублікатів елементів.

Основне використання полягає у тестуванні вмісту і усунення подвійних значень. Набори також підтримують математичні операції такі як, об'єднання, перетинання, порівняння, і симетричне порівняння.

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']

>>> fruit = set(basket)              # створення набору без дублікатів

>>> fruit

set(['orange', 'pear', 'apple', 'banana'])

>>> 'orange' in fruit # швидке тестування вмісту

True

>>> 'crabgrass' in fruit

False

>>> # Демонструє операції над набором  і наявність символів у вмісті набору

...

>>> а = set('abracadabra')

>>> b = set('alacazam')

>>> а   # які унікальні символи є в а

set(['a', 'r', 'b', 'c', 'd'])

>>> а – b  # символи в а, але що не входять в b

set(['r', 'd', 'b'])

>>> а | b  # символи, що містяться в а або b

set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])

>>> а & b  # символи містяться і в а, і в b

set(['a', 'c'])

>>> а ^ b  # символи містяться в а або в b, але не в обох словах

set(['r', 'd', 'b', 'm', 'z', 'l'])

Додаток А

Сьогодні ми вивчили:

  •  Типи даних: стрічка, список, кортеж.
  •  Методи роботи зі стрічкою та списком.

Методи роботи зі стрічками

Метод

Пояснення

s.find(t)

Індекс першого знайденого елемента t стрічки s (-1 якщо не знайдено)

s.rfind(t)

Індекс останнього знайденого елемента t стрічки s (-1 якщо не знайдено)

s.index(t)

Аналогічно до s.find(t)але повертає ValueError якщо не знайдено

s.rindex(t)

Аналогічно до s.rfind(t) але повертає ValueError якщо не знайдено

s.join(text)

Об’єднання стрічок в одну стрічку використовуючи  s як символ поєднання

s.split(t)

Перетворення s на список де t – розділювач стрічок (пробіл по замовчуванню)

s.splitlines()

split s into a list of strings, one per line

s.lower()

Перетворення всіх літер в s на малі літери

s.upper()

Перетворення всіх літер в s на великі літери

s.title()

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

s.strip()

Створення копії s без пробідів на початку і в кінці стрічки

s.replace(t, u)

Заміна елемента  t на u в стічці s

Методи роботи зі списками

Метод

Пояснення

s.insert (i,t)

Вставляє елемент в задану позицію. Перший аргумент - індекс елементу, перед яким проводиться вставка.

Наприклад, s.insert(0,t) вставить на  початок списку, а s.insert(len(s),t) додасть елемент до кінця списку.

s.append (t)

Додавання елемента  t до списку s

s.index (t)

Визначення індексу елемента t списку s

s.remove (t)

Вилучає із списку перший елемент, що збігається з t . У разі його відсутності виникає помилка.

s.sort ()

Сортування елементів списку s за абеткою

s.reverse ()

Записує елементи списку в зворотному порядку.

s.count (t)

Повертає кількість елементів списку, що збігаються з фрагментом t

s.extend(L)

Додає до кінця списку s всі елементи списку L.

s.pop(i)

Повертає елемент з індексом i і вилучає його зі списку. Якщо функція  pop() задається без параметрів, то буде повернено і вилучено останній елемент списку.

Порядок виконання роботи

1. Ознайомитися з теоретичними відомостями.

2. Виконати приклади, які використовуються в теоретичних відомостях.

3. Виконати наступні вправи згідно варіанта індивідуального завдання (Таблиця1.).

  1.  Створити змінну msg присвоїти їй значення стрічки, яка відповідає імені та прізвищу студента.
  2.  Роздрукувати вміст змінної msg двома шляхами, перший набравши назву змінної в інтерпретаторі, другий - використавши команду print.
  3.  Здійснити арифметичні операції зі стрічкою msg.
  4.  Визначити нову стрічку hello. Здійснити операцію hello+ msg. Змінити стрічку hello додавши в її кінці символ пробілу і знову виконати операцію hello+ msg.
  5.  Використовуючи зрізи та операцію поєднання змінити стрічку msg до вигляду ім’я , по батькові, прізвище студента.
  6.  Визначити стрічку s=’colorless’. Використовуючи зрізи та операцію поєднання змінити стрічку до вигляду ‘colourless’.
  7.  Використовуючи зрізи видаліть афікси у наступних словоформах: dish-es, run-ning, nation-ality, un-do, pre-heat.
  8.  Спробуйте згенерувати IndexError доступаючись до символів стрічки з індексами менше 0.
  9.  Організуйте доступ до елементів стрічки з визначеним кроком. Результати поясніть.
  10.  Поясніть результат виконання msg[::-1].
  11.  Представити прізвище, ім’я та по батькові як список стрічок. Здійснити різноманітні операції індексування, сортування та зрізів. Реалізуйте операцію доступу до окремих елементів списку та операцій з ними.
  12.  Представити прізвище, ім’я та по батькові як список стрічок. Розділити речення на окремі елементи, межа розділу голосна буква.
  13.  Представити прізвище, ім’я та по батькові як список стрічок. Використовуючи метод .reverse() та зріз [::-1] змінити стрічку. Результати пояснити.
  14.  Напишіть for цикл, який виведе на екран символи стрічки msg по одному на рядок.
  15.  Створити список phrase1, який складається із значень ім’я , по батькові, прізвище студента. Що відбудеться при спробі ввести в інтерпретатор наступний оператор phrase1[2][2]. Поясніть результат.
  16.  Створити змінну words яка містить список слів. Дослідіть операції words.sort() і sorted(words).
  17.  Створіть файл  test.py, який містить стрічку msg . Використайте наступні оператори і поясніть отримані результати.
    >>> from test import msg
    >>> msg
  18.  Напишіть for цикл, який обробить phrase1 визначивши довжину кожного елементу і результати збереже в новому списку lengths. (Створіть пустий список lengths = []. Далі використовуйте метод append() в тілі циклу для додавання довжин до списку).
  19.  Перетворіть стрічку msg на список стрічок, кожна з яких відповідає одному слову використовуючи split() оператор без символа розділення та наступними символами розділення: подвійні лапки, табуляція, послідовність пробілів, послідовність табуляцій та пробілів.
  20.  Визначіть змінну silly, яка буде містити стрічку ’newly formed bland ideas are inexpressible in an infuriating way’ і напишіть програму перетворення стрічки на список стрічок (кожне слово окрема стрічка). Результати збережіть в змінній bland.
  21.  Напишіть програму, яка створить стрічку в якій будуть записані другі символи всіх слів з стрічки silly.
  22.  Напишіть програму перетворення списку стрічок в одну стрічку.
  23.  Напишіть програму, яка надрукує слова із стрічки silly за абеткою.
  24.  Використайте функцію index() наступним чином ’inexpressible’.index(’e’). Що станеться якщо виконати ’inexpressible’.index(’re’)
  25.  Визначіть позиції всіх слів в списку phrase1 використовуючи метод index().
  26.  Визначіть змінну silly, яка буде містити стрічку ’newly formed bland ideas are inexpressible in an infuriating way’ і напишіть програму її перетворення в список phrase, який буде містити всі слова silly крім ‘in’.

4. Підготувати і оформити звіт.

Варіанти завдань

Варіант

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Номери завдань

1

2

3

4

1

2

3

4

1

2

3

4

1

2

3

5

6

7

8

9

10

5

6

7

8

9

10

5

6

7

8

9

10

5

6

5

6

7

8

9

10

7

8

9

10

11

12

13

14

15

16

17

18

11

12

13

14

15

16

17

14

15

16

17

18

11

12

13

15

16

17

18

11

12

13

19

20

21

22

23

24

25

26

21

22

23

24

25

26

22

22

23

24

25

26

19

20

21

22

23

24

25

26

22

23

Варіант

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Номери завдань

4

1

2

3

4

1

2

3

4

1

2

3

4

1

2

8

9

10

5

6

7

8

9

10

5

6

7

8

9

10

9

10

5

6

7

5

6

7

8

9

10

5

6

7

8

18

11

12

13

14

15

16

17

18

11

12

13

14

15

16

14

15

16

17

18

16

17

18

11

12

13

14

15

16

17

23

24

25

26

19

20

21

22

23

24

25

26

23

24

25

24

25

26

19

20

21

25

26

19

20

21

22

23

24

19

Зміст звіту

  1.  Титульний аркуш.
  2.  Мета роботи.
  3.  Короткі теоретичні відомості.
  4.  Тексти програм на мові Python.
  5.  Висновок.

Література

  1.  Steven Bird, Ewan Klein, Edward Loper Introduction to Natural Language Processing. 2001-2008 University of Pennsylvania.
  2.  Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач, М. Задка, М. Левис, С.Монтаро, Э.С.Реймонд, А.М.Кучлинг, М.-А.Лембург, К.-П.Йи, Д.Ксиллаг, Х.Г.Петрилли, Б.А.Варсав, Дж.К.Ахлстром, Дж.Рокинд, Н.Шеменон, С.Мулендер. Язык программирования Python./ 2001 – 452c.
  3.  Сузи Р. А. Язык программирования Python.- 206с.
  4.  David Mertz Text Processing in Python Addison WesleyBiber, 2003 - 544.


 

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

72652. Константы. Типы констант 13.61 KB
  Константа — это величина, которая не изменяется в программе в процессе программирования, то есть её значение не изменяется. Типы констант Существуют константы следующих типов: Целые — это простые целые числа любого знака. Например: 3; 157.
72653. Алфавит и имена переменных 13.42 KB
  Все другие ASCII символы могут применяться только в символьных константах. Пробелы используются для удобочитаемости программ. Они игнорируются компилятором, если не находятся внутри символьной константы.
72654. Алгоритм 16.96 KB
  Часто в качестве исполнителя выступает некоторый механизм компьютер токарный станок швейная машина но понятие алгоритма необязательно относится к компьютерным программам так например чётко описанный рецепт приготовления блюда также является алгоритмом в таком случае исполнителем является человек.
72655. Операционная система 22.05 KB
  Программы составляющие ПО можно разделить на три группы: системное ПО системы программирования прикладное ПО. Структуру ОС составляют следующие модули: базовый модуль ядро ОС управляет работой программы и файловой системой обеспечивает доступ к ней и обмен файлами между периферийными устройствами...
72656. Способы описания алгоритмов 14.12 KB
  Алгоритм может быть следующим: задать два числа; если числа равны то взять любое из них в качестве ответа и остановиться в противном случае продолжить выполнение алгоритма; определить большее из чисел; заменить большее из чисел разностью большего и меньшего из чисел...
72659. Разработка путей снижения затрат на производство и реализацию продукции предприятия РУП «Негорельский КХП» 2.06 MB
  Себестоимость широко применяется для экономического обоснования решений о производстве новой или прекращении выпуска устаревшей продукции, для определения эффективности мероприятий научно – технического прогресса, продажных цен, рентабельности изделий, резервов экономии затрат.
72660. Анализ финансового состояния предприятия ООО «Лента» и пути его улучшения 1.35 MB
  Финансовый анализ предприятия является научной базой принятия управленческих решений в бизнесе. Для их обоснования необходимо выявлять и прогнозировать существующие и потенциальные проблемы, производственные и финансовые риски, определять воздействие принимаемых решений на уровень рисков...