Модулі
Модуль можна «імпортувати» до іншої програми, щоб використовувати функції з нього. Точно так само ми використовуємо стандартну бібліотеку Python. Спершу подивимося, як використовувати модулі стандартної бібліотеки.
(Якщо ви хочете імпортувати змінну argv прямо у вашу програму (щоб не писати щоразу sys. при зверненні до неї), ви можете скористатися оператором from sys import argv. Якщо ви хочете імпортувати всі імена, що використовуються в модулі sys, ви можете виконати команду from sys import *. Це працює для будь-яких модулів.
У загальному випадку вам «слід уникати» використання цього оператора, і використовувати замість цього оператор import, оскільки це не допустить конфліктів імен, і програму буде легше читати).
#!/usr/bin/python
# Filename: using_sys.py
import sys
print('The command line arguments are:')
for i in sys.argv:
print(i)
print('\n\nThe PYTHONPATH is', sys.path, '\n')
$ python using_sys.py we are arguments
The command line arguments are:
using_sys.py
we
are
arguments
The PYTHONPATH is ['', 'C:\\Windows\\system32\\python30.zip',
'C:\\Python30\\DLLs', 'C:\\Python30\\lib',
'C:\\Python30\\lib\\plat-win', 'C:\\Python30',
'C:\\Python30\\lib\\site-packages']
Ім'я модуля — __name__
У кожного модуля є ім'я, і команди в модулі можуть дізнатися ім'я їх модуля. Це корисно, коли потрібно знати, чи запущений модуль сам по собі або імпортований. Як уже згадувалося вище, коли модуль імпортується вперше, код, який в ньому міститься, виконується. Ми можемо скористатися цим для того, щоб змусити модуль вести себе по-різному в залежності від того, чи використовується він сам по собі або імпортується в інший модуль. Цього можна досягти із застосуванням атрибуту модуля під назвою __name__.
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print('This program is being run by itself')
else:
print('I am being imported from another module')
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
Функція dir
Ви можете використовувати вбудовану функцію dir, щоб отримати список ідентифікаторів, які об'єкт визначає. Наприклад, до ідентифікатора модуля входять функції, класи і змінні, визначені в цьому модулі.
Коли ви передаєте функції dir() ім'я модуля, вона повертає список імен, визначених в цьому модулі. Якщо ніякого аргументу не передавати, вона поверне список імен, визначених в поточному модулі.
$ python
>>> import sys # отримаємо список атрибутів модуля «sys»
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__',
'__package__', '__s
tderr__', '__stdin__', '__stdout__', '_clear_type_cache',
'_compact_freelists',
'_current_frames', '_getframe', 'api_version', 'argv',
'builtin_module_names', '
byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook',
'dllhandle'
, 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable',
'exit', 'flags', 'float_info', 'getcheckinterval',
'getdefaultencoding', 'getfil
esystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount',
'getsizeof',
'gettrace', 'getwindowsversion', 'hexversion', 'intern', 'maxsize',
'maxunicode
', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
'platfor
m', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile',
'setrecursionlimit
', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version',
'version_in
fo', 'warnoptions', 'winver']
>>> dir() # отримаємо список атрибутів поточного модуля
['__builtins__', '__doc__', '__name__', '__package__', 'sys']
>>> a = 5 # створимо нову змінну «a»
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']
>>> del a # видалимо ім'я «a»
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']
>>>
Пакунки
Пакунки — це каталоги з модулями і спеціальним файлом __init__.py, який показує Python, що цей каталог особливий, бо містить модулі Python.
Уявімо, що ви хочете створити пакет під назвою «world» з субпакетами «asia», «africa» і т.д, а субпакети ці повинні містити модулі «india», «madagascar» і т.д.
Для цього вам слід було б створити таку структуру каталогів:
| - <деякий каталог із sys.path>/
| |---- world/
| |---- __init__.py
| |---- asia/
| | |---- __init__.py
| | |---- india/
| | |---- __init__.py
| | |---- foo.py
| |---- africa/
| |---- __init__.py
| |---- madagascar/
| |---- __init__.py
| |---- bar.py
Структури даних — Список
Список — це структура даних, яка містить упорядкований набір елементів, тобто ви можете зберігати в списку послідовність елементів.
Список елементів повинен бути укладений у квадратні дужки, щоб Python зрозумів, що ви вказуєте список. Як тільки ви створили список, ви можете додавати, видаляти або шукати елементи в цьому списку. Оскільки ми можемо додавати і видаляти елементи, ми говоримо, що список — це змінюваний тип даних, тобто його можна змінювати.
(Зверніть увагу на використання ключового аргументу end в функції print, який показує, що ми хочемо закінчити виведення пробілом замість звичайного переведення рядка).
#!/usr/bin/python
# Filename: using_list.py
# This is my shopping list
shoplist = ['apple', 'mango', 'carrot', 'banana']
print('I have', len(shoplist), 'items to purchase.')
print('These items are:', end=' ')
for item in shoplist:
print(item, end=' ')
print('\nI also have to buy rice.')
shoplist.append('rice')
print('My shopping list is now', shoplist)
print('I will sort my list now')
shoplist.sort()
print('Sorted shopping list is', shoplist)
print('The first item I will buy is', shoplist[0])
olditem = shoplist[0]
del shoplist[0]
print('I bought the', olditem)
print('My shopping list is now', shoplist)
$ python using_list.py
I have 4 items to purchase.
These items are: apple mango carrot banana
I also have to buy rice.
My shopping list is now ['apple', 'mango', 'carrot', 'banana',
'rice']
I will sort my list now
Sorted shopping list is ['apple', 'banana', 'carrot', 'mango',
'rice']
The first item I will buy is apple
I bought the apple
My shopping list is now ['banana', 'carrot', 'mango', 'rice']
Структури даних — Кортеж
Кортежі служать для зберігання кількох об'єктів разом. Одна з найважливіших особливостей кортежів, це те, що вони незмінні, так само, як і рядки.
Кортежі зазвичай використовуються в тих випадках, коли оператор або функція повинні напевно знати, що набір значень, тобто кортеж значень, не зміниться.
#!/usr/bin/python
# Filename: using_tuple.py
zoo = ('python', 'elephant', 'penguin') # remember the parentheses are
optional
print('Number of animals in the zoo is', len(zoo))
new_zoo = ('monkey', 'camel', zoo)
print('Number of cages in the new zoo is', len(new_zoo))
print('All animals in new zoo are', new_zoo)
print('Animals brought from old zoo are', new_zoo[2])
print('Last animal brought from old zoo is', new_zoo[2][2])
print('Number of animals in the new zoo is',
len(new_zoo)-1+len(new_zoo[2]))
$ python using_tuple.py
Number of animals in the zoo is 3
Number of cages in the new zoo is 3
All animals in new zoo are ('monkey', 'camel', ('python',
'elephant', 'penguin'))
Animals brought from old zoo are ('python', 'elephant', 'penguin')
Last animal brought from old zoo is penguin
Number of animals in the new zoo is 5
Структури даних — Словник
Словник — аналог адресної книги, де ви можете знайти адресу або контактну інформацію про людину, знаючи лише її ім'я, тобто ми пов'язуємо деякі ключі (імена) зі значеннями (інформацією). Зауважте, що ключ повинен бути унікальним.
В якості ключів ви можете використовувати тільки незмінні об'єкти, а в якості значень можна використовувати як незмінні, так і змінні об'єкти. Це, по суті, означає, що ви повинні використовувати тільки прості об'єкти в якості ключів.
Пари ключ-значення вказуються в словнику таким чином: d = {key1: value1, key2: value2}. Зверніть увагу, як ключ і значення розділяються двокрапкою, а пари один від одного відокремлюються комами, а потім все це укладається у фігурні дужки.
Пам'ятайте, що пари ключ-значення жодним чином не впорядковані в словнику. Якщо вам необхідний деякий порядок, вам доведеться окремо відсортувати словник перед зверненням до нього.
#!/usr/bin/python
# Filename: using_dict.py
# 'ab' - скорочення від 'a'ddress'b'ook
ab = { 'Swaroop' : 'swaroop@swaroopch.com',
'Larry' : 'larry@wall.org',
'Matsumoto' : 'matz@ruby-lang.org',
'Spammer' : 'spammer@hotmail.com'
}
print("Адреса Swaroop'а:", ab['Swaroop'])
# Видалення пари ключ-значення
del ab['Spammer']
print('\nВ адресній книзі {0} контактів\n'.format(len(ab)))
for name, address in ab.items():
print('Контакт {0} з адресою {1}'.format(name, address))
# Додавання пари ключ-значення
ab['Guido'] = 'guido@python.org'
if 'Guido' in ab:
print("\nАдреса Guido:", ab['Guido'])
$ python using_dict.py
Адреса Swaroop’а: swaroop@swaroopch.com
В адресній книзі 3 контактів
Контакт Swaroop з адресою swaroop@swaroopch.com
Контакт Matsumoto з адресою matz@ruby-lang.org
Контакт Larry з адресою larry@wall.org
Адреса Guido: guido@python.org
Структури даних — Множина
Множини — це невпорядковані набори простих об'єктів. Це необхідно тоді, коли присутність об'єкта в наборі важливіше порядку або того, скільки разів даний об'єкт там зустрічається.
Використовуючи множини, ви можете здійснювати перевірку належності, чи є дана множина підмножиною іншої множини, знаходити перетин множин і так далі.
>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}
Структури даних — Рядки
Всі рядки, що використовуються вами в програмах, є об'єктами класу str. Деякі корисні методи цього класу продемонстровані на прикладі нижче. Щоб подивитися весь список методів, виконайте help (str).
#!/usr/bin/python
# Filename: str_methods.py
name = 'Swaroop' # This is a string object
if name.startswith('Swa'):
print('Yes, the string starts with "Swa"')
if 'a' in name:
print('Yes, it contains the string "a"')
if name.find('war') != -1:
print('Yes, it contains the string "war"')
delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print(delimiter.join(mylist))
$ python str_methods.py
Yes, the string starts with "Swa"
Yes, it contains the string "a"
Yes, it contains the string "war"
Brazil_*_Russia_*_India_*_China