БАЗОВІ ПОНЯТТЯ ПО ПРОГРАМУВАННЮ МОВОЮ PYTHON

Лабораторна робота № 1

 

БАЗОВІ ПОНЯТТЯ ПО ПРОГРАМУВАННЮ МОВОЮ PYTHON

 

Перша програма

Існує два способи використання інтерпретатора:

· Командний режим

· Режим виконання програм з файлів.

Якщо в командному рядку інтерпретатора Python ви наберете команду, то інтерпретатор тут же виведе результат її виконання:

>>> print "Hello world!"

Hello world!

Ми набрали команду print "Hello world!", тобто дали вказівку вивести на екран рядок Hello world!, і в наступному рядку інтерпретатор вивів те, що ми просили.

Ми також можемо записати програму у файл і використовувати інтерпретатор для того щоб її виконати. Такий файл називають сценарієм або скриптом (від англ. script – сценарій). Наприклад, використовуючи текстовий редактор, створимо файл prog1.py з наступним змістом: print "Hello world!"

Назви файлів, що містять програми на Python, прийнято завершувати розширенням .py. Для того, щоб виконати програму, ми маємо передати інтерпретатору як параметр назву скрипта:

$ python prog1.py

Hello world!

Відлагодження

Існує три типи помилок, які можуть виникнути в програмах:

· синтаксичні помилки (syntax errors),

· помилки виконання (runtime errors),

· семантичні помилки (semantic errors).

Щоб знаходити і виправляти їх швидше, має сенс навчитися їх розрізняти.

Синтаксичні помилки (syntax errors)

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

Помилки виконання (runtime errors)

Другий тип помилок зазвичай виникає під час виконання програми (їх прийнято називати винятковими ситуаціями або, коротко – виключеннями, по-англійськи exceptions). Такі помилки мають іншу причину. Якщо в програмі виникає виключення, то це означає, що по ходу виконання відбулося щось непередбачене: наприклад програмі було передано некоректне значення, або програма спробувала розділити якесь значення на нуль, що неприпустимо з погляду дискретної математики. Якщо операційна система надсилає запит на негайне завершення програми, то також виникає виключення. Але в простих програмах це достатньо рідкісне явище, тому можливо, з ними ви зіткнетеся не відразу.

Семантичні помилки (semantic errors)

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

У таких випадках проблема полягає в тому, що семантика написаної програми відрізняється від того, що ви мали на увазі. Пошук таких помилок – завдання нетривіальне, оскільки доводиться переглядати результати роботу програми і розбиратися, що програма робить насправді.



Довідкова система

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

Для спрощення роботи програміста в Python передбачена вбудована змінна __doc__ (починається і закінчується парами символів підкреслення), у якій зазвичай зберігається мінімальна довідкова інформація:

>>> print str.__doc__

str(object)-> string

Return а nice string representation of the object.

If the argument is а string, the return value is the same object.

>>>

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

Починаючи з версії 2.2, в Python з'явилася довідкова система, реалізована у вигляді функції help(). Дана функція як параметр приймає ім'я будь-якого об'єкту (зокрема, модуля або функції) і виводить довідкову інформацію про нього.

>>> help(tuple)

Help on class tuple in module __builtin__:

Вихід з довідкової системи здійснюється клавішею [Q].

 

Коментарі в програмах

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

>>> а = “Це рядок” #Це коментар

>>> b = “#Це вже НЕ коментар”

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

def printTwice(value):

"""Описание функції printTwice()

Дана функція набуває значення і виводить його двічі, розділивши пропуском."""

print value, value

Як бачите, коментарі з описом функцій повинні знаходитися відразу після заголовка функції. Вони полягають з подвійні лапки три рази і можуть займати декілька рядків. Більш того, в Python передбачена можливість виведення цих коментарів. Для цього досить скористатися вбудованою змінною __doc__ (починається і закінчується парами символів підкреслення):

>>> print printTwice.__doc__

Опис функції printTwice()

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

Цей же коментар виведе команда довідкової системи Python help(printTwice).

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

Не дивлячись на зручність використання інтерактивного режиму роботи, часто потрібно зберегти початковий програмний код для подальшого використання. В такому разі готуються файли з програмним кодом, які передаються інтерпретатору на виконання. По відношенню до мов програмування, що інтерпретуються, часто початковий код називають скриптом. Файли з кодом на Python зазвичай мають розширення *.py.

Підготувати скрипти можна в середовищі IDLE. Для цього, після запуску середовища в меню потрібно вибрати команду File à New Window (Crtl + N), відкриється нове вікно.

Потім бажано відразу зберегти файл з розширенням *.py. командою FileàSave As. За замовченням, файл буде збережено в корні C:\Python26. Після того, як код буде написано, слід знов зберегти файл.

Увага: якщо набирати код, не зберігши файл на початку, то не буде здійснюватися підсвічування синтаксису.

Для запуску скрипту потрібно виконати команду меню Run à Run Module (F5). Після цього в першому вікні (де "працює" інтерпретатор) з'явиться результат виконання коду.

Насправді скрипти можна писати в будь-якому текстовому редакторі (бажано, щоб він підтримував підсвічування синтаксису мови Python). Також існують спеціальні програми для розробки, що надають додаткові можливості і зручності.

Запускати підготовлені файли можна не тільки в IDLE, але і в консолі за допомогою команди python адрес/имя_файла.

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

 

Поняття модуля

Працюючи в інтерактивному режимі інтерпретатора Python неможливо писати великі програми, оскільки після виходу з інтерпретатора визначення функцій “зникають” безслідно. А хотілося б мати можливість написати кілька функцій в одному файлі і потім мати можливість звертатися до них з інших програм (принцип повторного використання коду). Така можливість в Python існує. Це технологія модулів, тобто текстових файлів, що містять в собі який-небудь набір функцій(бажано об'єднаних за якою-небудь ознакою). Більшість функцій стандартної бібліотеки Python реалізована саме в модулях.

Модулі можуть містити в собі окрім визначень функцій і деякий виконуваний код. Цей код не входить в жодну функцію і виконується інтерпретатором, коли даний модуль підключається ключовим словом import.

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

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

Модулі підключаються до програми (або іншого модуля) з допомогою оператора import, після якого імена з простору імен модуля стають доступними.

Які саме імена стають доступні, визначає оператор import: варіант import module робить доступним рівне одне ім'я - ім'я модуля module, та зате через це ім'я можна використовувати всі глобальні імена модуля у вигляді module.name.

У варіанті from module import name з модуля імпортується вказане ім'я або список імен. У варіанті from module import * з модуля імпортуються всі імена. Хоча автор модуля може обмежити цей список, а у відсутності такого обмеження не імпортуються імена, що починаються з підкреслення, - вважається, що це внутрішні імена модуля, що не входять до його публічного інтерфейсу.

Імпортування модулів

import <модуль1> [, <модуль2> ]* Під’єднує зовнішні модулі.
from <модуль> import <имя1> [, <имя2> ]* Імпортування імен (функцій, класів, змінних тощо) з <модуля>.
from <модуль> import * Імпортує всі імена з <модуля>, за виключенням імен, що починаються з символу "_".

 

Модулі

Перший важливий модуль - sys, модуль доступу до Системи. Не операційній системі, а Системі. Тобто до інтерпретатора. Найпопулярніша функція з цього модуля - exit, тобто завершення роботи інтерпретатора. Втім, вона в модулі не єдина. Ще є функції отримання інформації про останнє виключення, хуки для відлагоджувачів та профілірувальників, і тому подібні "потрухи" інтерпретатора. Декілька цікавих змінних - стандартні потоки введення/виводу - stdin, stdout і stderr.

Мережні протоколи

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

Ця частина бібліотеки влаштована ієрархічно, модулі тут залежать один від одного і один одного інтенсивно використовують. У самому низу знаходяться модулі socket і select. Модуль socket надає об'єктно-орієнтований інтерфейс до функцій мережевих бібліотек ОС. Підтримуються всі види сокетів і всі мережеві протоколи - TCP/IP (включаючи IPv6), UNIX domain, IPX/SPX, і т.д. Модуль select дає доступ до системних викликів select і poll.

Модуль cgi - модуль номер один для написання CGI-скриптів. Модуль дає доступ до переданої від браузера форми, дозволяє перевірити наявність даних, витягнути і обробити ці дані і т.п.

Модулі httplib, ftplib, gopherlib, poplib, imaplib, nntplib, smptlib, telnetlib дають доступ до клієнтських частин відповідних протоколів.

Бібліотека urllib дозволяє мати доступ до мережевих ресурсів, за заданим URL; вона, звичайно, використовує бібліотеки httplib, ftplib і nntplib.

Бібліотека urllib2 - складніша версія urllib; вона містить код для доступу до мережевих ресурсів через прокси з авторизацією.

Модуль Cookie дозволяє створювати і обробляти "куки" - блоки інформації, що пересилаються між браузером і HTTP-сервером в цілях створення сесій.

Інші модулі

Крім перерахованих модулів стандартної бібліотеки, що входять в дистрибутив інтерпретатора, для Python існує маса додаткових модулів, які можна узяти в Інтернеті. Існує навіть каталог таких модулів, що називається Парнас. Є навіть комерційні фірми, що випускають модулі для Python, - і багато хто з цих модулів доступний вільно! На перше місце я поставлю фірму Zope Corporationщо вільно віддає сервер web-застосувань Zope. Окрім них відомі PythonWare / Secret Labs з своїми модулями PIL (Python Imaging Library), xmlrpclib, soaplib, нова версія Tkinter, Pythonware Sound Toolkit; ReportLab з своєю бібліотекою генерації PDF; Numerical Python - розширення Python для ефективної обробки матриць; Scientific Python - для наукових розрахунків (використовує NumPy); eGenix з своїми модулями mxDateTime (маніпуляції з датами і часом), mxtextTools (ефективна обробка текстів), mxODBC (комерційний модуль для доступу до реляційних БД, в т.ч. і з юнікса).

Існують модулі, що дозволяють вбудовувати інтерпретатор Python в Apache. Найпростіший з них PyApache. Mod_Python складніший, він інтенсивніше кешує байт-код, має об'єктно-орієнтований API, дозволяє писати хендлери для Апача. Mod_Snake дозволяє писати хендлери для Апача 2.0.

Велика кількість модулів для доступу до баз даних, і не тільки реляційним, наприклад PyBSDDB для доступу до BerkeleyDB3. Модулі для доступу до реляційних БД задовольняють специфікації Python DB API 2.0: PyGreSQL для доступу до PostgreSQL (модуль входить в дистрибутив POSTGRESQL); MySQLdb для доступу до MYSQL.

Крім Tk, програми з графічним інтерфейсом на Python можна писати з використанням багатьох інших бібліотек: WxPython для WxWidgets; PyGTK для GTK; а бібліотека Python XLib є повністю переписаною бібліотекою xlib! PLWM - це Window Mnager написаний на Python.

 

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

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

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

>>> 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'

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

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

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

>>> print 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()? Як вирішити цю проблему?

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

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

>>> int("32")

>>> int("Hello")

Traceback (most recent call last):

File "", line 1, in ?

ValueError: invalid literal for int(): Hello

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

>>> int(3.99999)

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

Змінні

Як будь-яка інша мова програмування 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

>>> 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

>>> type(message)

<type 'int'>

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

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

Вирази

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

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

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

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

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

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

>>> 1 + 1

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

>>> 17

>>> x = 2

>>> x

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

>>> message = "Hello world!"

>>> message

"Hello world!"

>>> print message

Hello world!

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

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

>>> 1.25 + 1

2.25

>>> print _

2.25

>>> 5 + _

7.25

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

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

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

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

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

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

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

>>> minute = 59

>>> minute/60

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

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

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

>>> minute = 59

>>> float(minute)/ 60

0.983333333333

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

>>> minute = 59

>>> minute / 60.0

0.983333333333

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

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

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

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

 

Рядки

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

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

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

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? Які висновки можна зробити на основі цього результату?

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

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

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

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

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

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

>>> 'Hello!'[1]

'e'

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

>>> 'Hello!'[0]

'H'

Доступ до підрядків

У випадку коли потрібно отримати доступ до більш ніж одного символу, ми повинні в квадратних дужках вказати індекс першого символу і останнього розділивши їх двокрапкою. Цей процес називається 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)

>>> 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'

Зміни у рядках

Рядок – це послідовність символів з довільним доступом. Рядок в мові 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'

Речення

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

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

>>> sent[16:21]

'ideas'

>>> len(sent)

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

 

Списки

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

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

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

>>> [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] []

Функція 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]

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

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

>>> numbers[0]

>>> numbers[-1]

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

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

>>> 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]

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

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

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

>>> len(mylist)

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

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

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')

>>> phrase.index('black')

>>> 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]

Оператор del









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь