Python примеры программ
Материал из Википедии — свободной энциклопедии
Содержание |
[править] Примеры программ на языке программирования Python.
В этой стать собраны примеры небольших программ на языке программирования Python, демонстрирующих его синтаксис и некоторые из возможностей.
[править] Нахождение 10 наиболее частых слов на web странице
Данный пример чисто демонстрационный, так как его можно значительно улучшить.
import string # импортируем модуль для работы со строками from urllib2 import urlopen # из модуля urllib2 импортируем функцию urlopen u = urlopen("http://python.org") # открываем URL на чтение words = {} # связываем имя words с пустым словарём # (словарь — неупорядоченный ассоциативный массив) for line in u.readlines(): # читаем u по строкам line = string.strip(line, " \n") # отбрасываем начальные и конечные пробелы for word in line.split(" "): # режем каждую строку на слова, ограниченные пробелами try: # блок обработки исключений words[word] += 1 # пытаемся увеличить words[word] на единицу except KeyError: # если не получилось (раньше words[word] не было) words[word] = 1 # присваиваем единицу # теперь словарь words содержит частоту встречаемости каждого слова. # Например, words может содержать {"яблоко":5, "апельсин": 12, "груша": 8} pairs = words.items() # делаем из словаря список пар # pairs == [("яблоко",5), ("апельсин",12), ("груша",8)] pairs.sort(lambda a, b: b[1]-a[1]) # сортируем по убыванию второго элемента пары for p in pairs[:10]: # печатаем первые 10 элементов списка print p[0], p[1]
[править] Примеры работы с последовательностями
Иллюстрируют особенности индексации элементов и срезов: при взятии среза нумеруются не сами элементы, а промежутки между ними.
>>> l = ['A', 'B', 'C', 'D', 'E'] # исходный список >>> # 0 1 2 3 4 5 # пронумерованные промежутки между элементами >>> # -5 -4 -3 -2 -1 # нумерация с конца >>> l[0:2] # срез от нулевого до второго промежутка ['A', 'B'] >>> l[1:-2] # срез от второго до второго с конца элемента ['B','C'] >>> l[1::2] # каждый второй элемент начиная с первого ['B', 'D'] >>> l[::-1] # все элементы в обратном порядке ['E', 'D', 'C', 'B', 'A']
Функции вроде range()
поддерживают то же правило:
>>> range(2, 5) [2, 3, 4] >>> range(5) [0, 1, 2, 3, 4]
[править] Реализация перегрузки функций
Это пример простой реализации поддержки перегрузки функций на Python. Она демонстрирует как используя уже имеющиеся в Python средства можно обойти одно из ограничений базовой реализации. Поддерживается минимум возможностей (только фиксированное количество позиционных аргументов, нет именованных аргументов, нет приведения типов (например int -> float) и т. п.), но работает достаточно быстро.
import sys # для получения объектов из вышележащих фрэймов стека class CannotResolve(Exception):pass # класс исключения для случая не нахождения функции class Resolver(object): # класс реализующий разрешение на этапе исполнения emess = "Can't found appropriate signature of func %s() for call with" + \ " params %r" # сообщение о ошибке def __init__(self,name): # конструктор self.function_map = {} # словарь, отображающий типы параметров на функции self.default = None # функция по умолчанию self.name = name # имя функции для вывода сообщений о ошибках def __call__(self,*dt): # имитируем функцию, принимающую любое количество # позиционных параметров cls = tuple(map(type,dt)) # создаем tuple из типов переданных аргументов # функция type возвращает тип своего параметра # map вызовет type для каждого элемента из dt try: x = self.function_map[cls] # пытаемся получить функцию из словаря except KeyError: # если подходящей нет if self.default is not None: # используем функцию по умолчанию x = self.default else: # если ее нет - возбуждаем искючение raise CannotResolve(self.emess % (self.name,cls)) return x(*dt) # вызываем функцию и возвращаем результат def overload(*dt): # декоратор для перегрузки в качестве параметров # принимает типы параметров def closure(func): name = func.__name__ # получаем имя функции fr = sys._getframe(1).f_locals.get(name,Resolver(name)) # опускаемся на один шаг вниз по стеку и находим # локальную переменную с именем функции # если же ее нет то используем новый # Resolver объект fr.function_map[dt] = func # добавляем новую функцию к словарю # разрешения вызовов return fr return closure def overdef(func): # для создания функции по умолчанию name = func.__name__ # аналогично как и в функции overload fr = sys._getframe(1).f_locals.get(name,Resolver(name)) fr.default = func return fr
# теперь воспользуемся полученными декораторами @overdef # это будет функция по умолчанию def f(*dt,**mp): print "Default call" # если нет явного return то вернется None @overload(int) # единственный параметр - целое def f(x): return x + 1 @overload(str) # единственный параметр - строка def f(x): return x + "1" @overload(str,int) # строка и целое def f(x,y): return x + str(y) print f(1) # напечатает : 2 print f("1") # напечатает : 11 f(2,2) # напечатает : Default call
[править] Управление контекстом выполнения
Следующий пример из PEP343 иллюстрирует применение оператора with
для защиты блока кода от одновременного выполнения двуми потоками:
from __future__ import with_statement # задействует оператор with в коде from contextlib import contextmanager from threading import Lock # Описание менеджера контекста @contextmanager def locked(lock): lock.acquire() try: yield finally: lock.release() # Определение замка myLock = Lock() # Применение оператора with locked(myLock): # print "Охраняемый блок кода. Замок будет освобожден при любом выходе из этого блока." #
[править] Генератор чисел Фибоначчи
Пример генератора чисел Фибоначчи и его использования:
def gen_fibonacci(n=100): a, b = 0, 1 while a < n: yield a a, b = b, a+b # напечатать все числа Фибоначчи < 1000 for i in gen_fibonacci(1000): print i