Collections.Defaultdict
collections.defaultdict ничем не отличается от обычного словаря за исключением того, что по умолчанию всегда вызывается функция, возвращающая значение:
>>> import collections>>> defdict = collections.defaultdict(list)>>> defdictdefaultdict(<class 'list'>, {})>>> for i in range(5): defdict[i].append(i) >>> defdictdefaultdict(<class 'list'>, {0: [0], 1: [1], 2: [2], 3: [3], 4: [4]})Collections.OrderedDict
collections.OrderedDict - ещё один похожий на словарь объект, но он помнит порядок, в котором ему были даны ключи. Методы:
popitem(last=True) - удаляет последний элемент если last=True, и первый, если last=False.
move_to_end(key, last=True) - добавляет ключ в конец если last=True, и в начало, если last=False.
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} >>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) >>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])Collections.namedtuple()
Класс collections.namedtuple позволяет создать тип данных, ведущий себя как кортеж, с тем дополнением, что каждому элементу присваивается имя, по которому можно в дальнейшем получать доступ:
>>> Point = namedtuple('Point', ['x', 'y'])>>> p = point(x=1, y=2)>>> pPoint(x=1, y=2)>>> p.x1>>> p[0]1Модуль array. Массивы в python
Модуль array определяет массивы в python. Массивы очень похожи на списки, но с ограничением на тип данных и размер каждого элемента.
Размер и тип элемента в массиве определяется при его создании и может принимать следующие значения:
Код типа | Тип в C | Тип в python | Минимальный размер в байтах |
'b' | signed char | int | |
'B' | unsigned char | int | |
'h' | signed short | int | |
'H' | unsigned short | int | |
'i' | signed int | int | |
'I' | unsigned int | int | |
'l' | signed long | int | |
'L' | unsigned long | int | |
'q' | signed long long | int | |
'Q' | unsigned long long | int | |
'f' | float | float | |
'd' | double | float |
Класс array.array(TypeCode [, инициализатор]) - новый массив, элементы которого ограничены TypeCode, и инициализатор, который должен быть списком, объектом, поддерживающий интерфейс буфера, или итерируемый объект.
array.typecodes - строка, содержащая все возможные типы в массиве.
Массивы изменяемы. Массивы поддерживают все списковые методы (индексация, срезы, умножения, итерации), и другие методы.
Методы массивов (array) в python
array.typecode - TypeCode символ, использованный при создании массива.
array.itemsize - размер в байтах одного элемента в массиве.
array.append(х) - добавление элемента в конец массива.
array.buffer_info() - кортеж (ячейка памяти, длина). Полезно для низкоуровневых операций.
array.byteswap() - изменить порядок следования байтов в каждом элементе массива. Полезно при чтении данных из файла, написанного на машине с другим порядком байтов.
array.count(х) - возвращает количество вхождений х в массив.
array.extend(iter) - добавление элементов из объекта в массив.
array.frombytes(b) - делает массив array из массива байт. Количество байт должно быть кратно размеру одного элемента в массиве.
array.fromfile(F, N) - читает N элементов из файла и добавляет их в конец массива. Файл должен быть открыт на бинарное чтение. Если доступно меньше N элементов, генерируется исключение EOFError , но элементы, которые были доступны, добавляются в массив.
array.fromlist(список) - добавление элементов из списка.
array.index(х) - номер первого вхождения x в массив.
array.insert(n, х) - включить новый пункт со значением х в массиве перед номером n. Отрицательные значения рассматриваются относительно конца массива.
array.pop(i) - удаляет i-ый элемент из массива и возвращает его. По умолчанию удаляется последний элемент.
array.remove(х) - удалить первое вхождение х из массива.
array.reverse() - обратный порядок элементов в массиве.
array.tobytes() - преобразование к байтам.
array.tofile(f) - запись массива в открытый файл.
array.tolist() - преобразование массива в список.
Вот и всё, что можно было рассказать про массивы. Они используются редко, когда нужно достичь высокой скорости работы. В остальных случаях массивы можно заменить другими типами данных:списками, кортежами, строками.
Модуль itertools
Модуль itertools - сборник полезных итераторов.
itertools.count(start=0, step=1) - бесконечная арифметическая прогрессия с первым членом start и шагом step.
itertools.cycle(iterable) - возвращает по одному значению из последовательности, повторенной бесконечное число раз.
itertools.repeat(elem, n=Inf) - повторяет elem n раз.
itertools.accumulate(iterable) - аккумулирует суммы.
accumulate([1,2,3,4,5]) --> 1 3 6 10 15itertools.chain(*iterables) - возвращает по одному элементу из первого итератора, потом из второго, до тех пор, пока итераторы не кончатся.
itertools.combinations(iterable, [r]) - комбинации длиной r из iterable без повторяющихся элементов.
combinations('ABCD', 2) --> AB AC AD BC BD CDitertools.combinations_with_replacement(iterable, r) - комбинации длиной r из iterable с повторяющимися элементами.
combinations_with_replacement('ABCD', 2) --> AA AB AC AD BB BC BD CC CD DDitertools.compress(data, selectors) - (d[0] if s[0]), (d[1] if s[1]), ...
compress('ABCDEF', [1,0,1,0,1,1]) --> A C E Fitertools.dropwhile(func, iterable) - элементы iterable, начиная с первого, для которого func вернула ложь.
dropwhile(lambda x: x < 5, [1,4,6,4,1]) --> 6 4 1itertools.filterfalse(func, iterable) - все элементы, для которых func возвращает ложь.
itertools.groupby(iterable, key=None) - группирует элементы по значению. Значение получается применением функции key к элементу (если аргумент key не указан, то значением является сам элемент).
from itertools import groupbythings = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]for key, group in groupby(things, lambda x: x[0]): for thing in group: print("A %s is a %s." % (thing[1], key)) print() # A bear is a animal.# A duck is a animal.## A cactus is a plant.## A speed boat is a vehicle.# A school bus is a vehicle.itertools.islice(iterable[, start], stop[, step]) - итератор, состоящий из среза.
itertools.permutations(iterable, r=None) - перестановки длиной r из iterable.
itertools.product(*iterables, repeat=1) - аналог вложенных циклов.
product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dyitertools.starmap(function, iterable) - применяет функцию к каждому элементу последовательности (каждый элемент распаковывается).
starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000itertools.takewhile(func, iterable) - элементы до тех пор, пока func возвращает истину.
takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4itertools.tee(iterable, n=2) - кортеж из n итераторов.
itertools.zip_longest(*iterables, fillvalue=None) - как встроенная функция zip, но берет самый длинный итератор, а более короткие дополняет fillvalue.
zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-Модуль time
Time - модуль для работы со временем в Python.
time.altzone - смещение DST часового пояса в секундах к западу от нулевого меридиана. Если часовой пояс находится восточнее, смещение отрицательно.
time.asctime([t]) - преобразовывает кортеж или struct_time в строку вида "Thu Sep 27 16:42:37 2012". Если аргумент не указан, используется текущее время.
time.clock() - в Unix, возвращает текущее время. В Windows, возвращает время, прошедшее с момента первого вызова данной функции.
time.ctime([сек]) - преобразует время, выраженное в секундах с начала эпохи в строку вида "Thu Sep 27 16:42:37 2012".
time.daylight - не 0, если определено, зимнее время или летнее (DST).
time.gmtime([сек]) - преобразует время, выраженное в секундах с начала эпохи в struct_time, где DST флаг всегда равен нулю.
time.localtime([сек]) - как gmtime, но с DST флагом.
time.mktime([t]) - преобразует кортеж или struct_time в число секунд с начала эпохи. Обратна функции time.localtime.
time.sleep(сек) - приостановить выполнение программы на заданное количество секунд.
time.strftime(формат, [t]) - преобразует кортеж или struct_time в строку по формату:
Формат | Значение |
%a | Сокращенное название дня недели |
%A | Полное название дня недели |
%b | Сокращенное название месяца |
%B | Полное название месяца |
%c | Дата и время |
%d | День месяца [01,31] |
%H | Час (24-часовой формат) [00,23] |
%I | Час (12-часовой формат) [01,12] |
%j | День года [001,366] |
%m | Номер месяца [01,12] |
%M | Число минут [00,59] |
%p | До полудня или после (при 12-часовом формате) |
%S | Число секунд [00,61] (2) |
%U | Номер недели в году (нулевая неделя начинается с воскресенья) [00,53] |
%w | Номер дня недели [0(Sunday),6] |
%W | Номер недели в году (нулевая неделя начинается с понедельника) [00,53] |
%x | Дата |
%X | Время |
%y | Год без века [00,99] |
%Y | Год с веком |
%Z | Временная зона |
%% | Знак '%' |
time.strptime(строка [, формат]) - разбор строки, представляющей время в соответствии с форматом. Возвращаемое значение struct_time. Формат по умолчанию: "%a %b %d %H:%M:%S %Y".
Класс time.struct_time - тип последовательности значения времени. Имеет интерфейс кортежа. Можно обращаться по индексу или по имени.
1. tm_year
2. tm_mon
3. tm_mday
4. tm_hour
5. tm_min
6. tm_sec
7. tm_wday
8. tm_yday
9. tm_isdst
time.time() - время, выраженное в секундах с начала эпохи.
time.timezone - смещение местного часового пояса в секундах к западу от нулевого меридиана. Если часовой пояс находится восточнее, смещение отрицательно.
time.tzname - кортеж из двух строк: первая - имя DST часового пояса, второй - имя местного часового пояса.
Модуль sys
Модуль sys обеспечивает доступ к некоторым переменным и функциям, взаимодействующим с интерпретатором python.
sys.argv - список аргументов командной строки, передаваемых сценарию Python. sys.argv[0] является именем скрипта (пустой строкой в интерактивной оболочке).
sys.byteorder - порядок байтов. Будет иметь значение 'big' при порядке следования битов от старшего к младшему, и 'little', если наоборот (младший байт первый).
sys.builtin_module_names - кортеж строк, содержащий имена всех доступных модулей.
sys.call_tracing(функция, аргументы) - вызывает функцию с аргументами и включенной трассировкой, в то время как трассировка включена.
sys.copyright - строка, содержащая авторские права, относящиеся к интерпретатору Python.
sys._clear_type_cache() - очищает внутренний кэш типа.
sys._current_frames() - возвращает словарь-отображение идентификатора для каждого потока в верхнем кадре стека в настоящее время в этом потоке в момент вызова функции.
sys.dllhandle - целое число, определяющее дескриптор DLL Python (Windows).
sys.exc_info() - возвращает кортеж из трех значений, которые дают информацию об исключенях, обрабатывающихся в данный момент.
sys.exec_prefix - каталог установки Python.
sys.executable - путь к интерпретатору Python.
sys.exit([arg]) - выход из Python. Возбуждает исключение SystemExit, которое может быть перехвачено.
sys.flags - флаги командной строки. Атрибуты только для чтения.
sys.float_info - информация о типе данных float.
sys.float_repr_style - информация о применении встроенной функции repr() для типа float.
sys.getdefaultencoding() - возвращает используемую кодировку.
sys.getdlopenflags() - значения флагов для вызовов dlopen().
sys.getfilesystemencoding() - возвращает кодировку файловой системы.
sys.getrefcount(object) - возвращает количество ссылок на объект. Аргумент функции getrefcount - еще одна ссылка на объект.
sys.getrecursionlimit() - возвращает лимит рекурсии.
sys.getsizeof(object[, default]) - возвращает размер объекта (в байтах).
sys.getswitchinterval() - интервал переключения потоков.
sys.getwindowsversion() - возвращает кортеж, описывающий версию Windows.
sys.hash_info - информация о параметрах хэширования.
sys.hexversion - версия python как шестнадцатеричное число (для 3.2.2 final это будет 30202f0).
sys.implementation - объект, содержащий информацию о запущенном интерпретаторе python.
sys.int_info - информация о типе int.
sys.intern(строка) - возвращает интернированную строку.
sys.last_type, sys.last_value, sys.last_traceback - информация об обрабатываемых исключениях. По смыслу похоже на sys.exc_info().
sys.maxsize - максимальное значение числа типа Py_ssize_t (2:sup:31 на 32-битных и 263 на 64-битных платформах).
sys.maxunicode - максимальное число бит для хранения символа Unicode.
sys.modules - словарь имен загруженных модулей. Изменяем, поэтому можно позабавиться :)
sys.path - список путей поиска модулей.
sys.path_importer_cache - словарь-кэш для поиска объектов.
sys.platform - информация об операционной системе.
Linux (2.x and 3.x) | 'linux' |
Windows | 'win32' |
Windows/Cygwin | 'cygwin' |
Mac OS X | 'darwin' |
OS/2 | 'os2' |
OS/2 EMX | 'os2emx' |
sys.prefix - папка установки интерпретатора python.
sys.ps1, sys.ps2 - первичное и вторичное приглашение интерпретатора (определены только если интерпретатор находится в интерактивном режиме). По умолчанию sys.ps1 == ">>> ", а sys.ps2 == "... ".
sys.dont_write_bytecode - если true, python не будет писать .pyc файлы.
sys.setdlopenflags(flags) - установить значения флагов для вызовов dlopen().
sys.setrecursionlimit(предел) - установить максимальную глубину рекурсии.
sys.setswitchinterval(интервал) - установить интервал переключения потоков.
sys.settrace(tracefunc) - установить "след" функции.
sys.stdin - стандартный ввод.
sys.stdout - стандартный вывод.
sys.stderr - стандартный поток ошибок.
sys.__stdin__, sys.__stdout__, sys.__stderr__ - исходные значения потоков ввода, вывода и ошибок.
sys.tracebacklimit - максимальное число уровней отслеживания.
sys.version - версия python.
sys.api_version - версия C API.
sys.version_info - Кортеж, содержащий пять компонентов номера версии.
sys.warnoptions - реализация предупреждений.
sys.winver - номер версии python, использующийся для формирования реестра Windows.
Модуль random
Модуль random предоставляет функции для генерации случайных чисел, букв, случайного выбора элементов последовательности.
random.seed([X], version=2) - инициализация генератора случайных чисел. Если X не указан, используется системное время.
random.getstate() - внутреннее состояние генератора.
random.setstate(state) - восстанавливает внутреннее состояние генератора. Параметр state должен быть получен функцией getstate().
random.getrandbits(N) - возвращает N случайных бит.
random.randrange(start, stop, step) - возвращает случайно выбранное число из последовательности.
random.randint(A, B) - случайное целое число N, A ≤ N ≤ B.
random.choice(sequence) - случайный элемент непустой последовательности.
random.shuffle(sequence, [rand]) - перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.
random.sample(population, k) - список длиной k из последовательности population.
random.random() - случайное число от 0 до 1.
random.uniform(A, B) - случайное число с плавающей точкой, A ≤ N ≤ B (или B ≤ N ≤ A).
random.triangular(low, high, mode) - случайное число с плавающей точкой, low ≤ N ≤ high. Mode - распределение.
random.betavariate(alpha, beta) - бета-распределение. alpha>0, beta>0. Возвращает от 0 до 1.
random.expovariate(lambd) - экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.
random.gammavariate(alpha, beta) - гамма-распределение. Условия на параметры alpha>0 и beta>0.
random.gauss(значение, стандартное отклонение) - распределение Гаусса.
random.lognormvariate(mu, sigma) - логарифм нормального распределения. Если взять натуральный логарифм этого распределения, то вы получите нормальное распределение со средним mu и стандартным отклонением sigma. mu может иметь любое значение, и sigma должна быть больше нуля.
random.normalvariate(mu, sigma) - нормальное распределение. mu - среднее значение, sigma - стандартное отклонение.
random.vonmisesvariate(mu, kappa) - mu - средний угол, выраженный в радианах от 0 до 2π, и kappa - параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.
random.paretovariate(alpha) - распределение Парето.
random.weibullvariate(alpha, beta) - распределение Вейбулла.
Модуль math
Модуль math – один из наиважнейших в Python. Этот модуль предоставляет обширный функционал для работы с числами.
math.ceil(X) – округление до ближайшего большего числа.
math.copysign(X, Y) - возвращает число, имеющее модуль такой же, как и у числа X, а знак - как у числа Y.
math.fabs(X) - модуль X.
math.factorial(X) - факториал числа X.
math.floor(X) - округление вниз.
math.fmod(X, Y) - остаток от деления X на Y.
math.frexp(X) - возвращает мантиссу и экспоненту числа.
math.ldexp(X, I) - X * 2i. Функция, обратная функции math.frexp().
math.fsum(последовательность) - сумма всех членов последовательности. Эквивалент встроенной функции sum(), но math.fsum() более точна для чисел с плавающей точкой.
math.isfinite(X) - является ли X числом.
math.isinf(X) - является ли X бесконечностью.
math.isnan(X) - является ли X NaN (Not a Number - не число).
math.modf(X) - возвращает дробную и целую часть числа X. Оба числа имеют тот же знак, что и X.
math.trunc(X) - усекает значение X до целого.
math.exp(X) - eX.
math.expm1(X) - eX - 1. При X → 0 точнее, чем math.exp(X)-1.
math.log(X, [base]) - логарифм X по основанию base. Если base не указан, вычисляется натуральный логарифм.
math.log1p(X) - натуральный логарифм (1 + X). При X → 0 точнее, чем math.log(1+X).
math.log10(X) - логарифм X по основанию 10.
math.log2(X) - логарифм X по основанию 2. Новое в Python 3.3.
math.pow(X, Y) - XY.
math.sqrt(X) - квадратный корень из X.
math.acos(X) - арккосинус X. В радианах.
math.asin(X) - арксинус X. В радианах.
math.atan(X) - арктангенс X. В радианах.
math.atan2(Y, X) - арктангенс Y/X. В радианах. С учетом четверти, в которой находится точка (X, Y).
math.cos(X) - косинус X (X указывается в радианах).
math.sin(X) - синус X (X указывается в радианах).
math.tan(X) - тангенс X (X указывается в радианах).
math.hypot(X, Y) - вычисляет гипотенузу треугольника с катетами X и Y (math.sqrt(x * x + y * y)).
math.degrees(X) - конвертирует радианы в градусы.
math.radians(X) - конвертирует градусы в радианы.
math.cosh(X) - вычисляет гиперболический косинус.
math.sinh(X) - вычисляет гиперболический синус.
math.tanh(X) - вычисляет гиперболический тангенс.
math.acosh(X) - вычисляет обратный гиперболический косинус.
math.asinh(X) - вычисляет обратный гиперболический синус.
math.atanh(X) - вычисляет обратный гиперболический тангенс.
math.erf(X) - функция ошибок.
math.erfc(X) - дополнительная функция ошибок (1 - math.erf(X)).
math.gamma(X) - гамма-функция X.
math.lgamma(X) - натуральный логарифм гамма-функции X.
math.pi - pi = 3,1415926...
math.e - e = 2,718281...
Интерпретатор hq9+
Это всего лишь 4 команды:
· H - выводит "Hello, world!".
· Q - выводит текст исполняемой программы.
· 9 - выводит текст песни "99 Bottles of Beer".
· + - увеличивает никому не нужный счётчик.
Зная это, мы можем написать свой интерпретатор hq9+.
Ввод мы будем осуществлять из файла, вывод на консоль. Для простоты, любые другие символы мы будем просто игнорировать.
f = open(input('Enter file name: '))s = f.read()f.close()И, собственно, сам интерпретатор:
template = '''{} bottles of beer on the wall.Take one down and pass it around, {} bottles of beer on the wall.'''count = 0 # Никому не нужный счётчик for i in s.upper(): # Игнорируем регистр if i == 'H': print('Hello, world!') # Выводим 'Hello, world!' elif i == 'Q': print(s) # Выводим саму программу elif i == '9': for i in range(99, 1, -1): print(template.format(i, i-1)) # Выводим текст песни print('1 bottle of beer on the wall.\nTake one down and pass it around, no more bottles of beer on the wall.') print('No more bottles of beer on the wall.\nGo to the store and buy some more, 99 bottles of beer on the wall.') elif i == '+': count += 1Самое "сложное" здесь - вывод текста песни "99 Bottles of Beer". Можно было запихнуть весь текст, но тогда файл получился бы довольно объёмный. Поэтому вместо этого я использую форматирование строк, и вывожу песню с помощью цикла.
У меня на этом всё, и в конце - онлайн-интерпретатор hq9+.
Введите программу на hq9+
Задача про словарь
Сегодня я разберу одну из олимпиадных задач, довольно простую.
Суть задачи в том, чтобы из англо-латинского словаря сделать латино-английский.
Примеры тестов
Входные данные 3apple - malum, pomum, populafruit - baca, bacca, popumpunishment - malum, multaВыходные данные 7baca - fruitbacca - fruitmalum - apple, punishmentmulta - punishmentpomum - applepopula - applepopum - fruitВходные данные черпаются из input.txt, вывод сбрасывается в output.txt. Довольно стандартное требование, про работу с файлами в python я недавно писал. Входные данные лексикографически отсортированы, и выходные данные тоже требуются отсортированными.
Вначале я покажу своё решение, потом начну объяснять. Итак, моё решение:
f = open('input.txt')N = f.readline()d = {}for line in f: words = line.strip().split(' - ') en = words[0] lat = words[1].split(', ') for key in lat: if key in d: d[key].append(en) else: d[key] = [en]f.close() for key in d: d[key].sort() g = open('output.txt', 'w')g.write(str(len(d)) + '\n')for lat in sorted(d): g.write(lat + ' - ' + ', '.join(d[lat]) + '\n') g.close()Открываем файл, читаем число N (оно нам не понадобится); создаём пустой словарь.
Отделяем слово от его переводов; из строки с переводами получаем список латинских слов.
Далее смотрим, есть ли латинское слово в нашем словаре. Если есть - дописываем ещё один английский перевод. Если нет - пишем его. После махинаций закрываем файл. Далее нужно все списки переводов отсортировать (требования задачи).
Открываем файл на запись. Первой строкой записываем число получившихся слов. Далее в отсортированном порядке записываем латинские слова, затем их переводы. Закрываем файл.
Задача решена, все тесты пройдены. Несомненно, возможны и другие решения, но это мне показалось наиболее красивым.
Пишем блэкджек
Для реализации нам понадобится колода карт, из которой каждый раз мы будем вынимать по карте и прибавлять к результату.
Далее, сами "карты": шестерка, семерка, восьмерка, девятка, десятка, валет (достоинством 2), дама (3), король (4), и туз (11).
koloda = [6,7,8,9,10,2,3,4,11] * 4Случайным образом перемешаем карты, используя функцию shuffle из модуля random.
import randomrandom.shuffle(koloda)И, собственно, начинаем играть:
print('Поиграем в очко?')count = 0 while True: choice = input('Будете брать карту? y/n\n') if choice == 'y': current = koloda.pop() print('Вам попалась карта достоинством %d' %current) count += current if count > 21: print('Извините, но вы проиграли') break elif count == 21: print('Поздравляю, вы набрали 21!') break else: print('У вас %d очков.' %count) elif choice == 'n': print('У вас %d очков и вы закончили игру.' %count) break print('До новых встреч!')Изначально у пользователя 0 очков. Мы его спрашиваем, будет ли он брать карту, на что он должен ответить y или n. Если пользователь ответил n, то мы говорим ему, сколько очков он набрал, и завершаем программу. Если он изъявил желание взять карту (ух, какой нехороший пользователь :)), то мы снимаем ему карту из списка (с помощью метода pop). Мы снимаем последнюю карту, хотя вообще без разницы, какую снимать, ведь они перемешаны.
Прибавляем к числу очков достоинство снятой карты, а дальше смотрим, сколько всего очков у пользователя. Если количество очков больше 21, то извиняйте, пользователь проиграл. Если число очков равно 21, то пользователь выиграл. Если меньше - еще раз спросим пользователя, будет ли он брать карту.
В конце игры прощаемся с пользователем.
P.S. Кто-нибудь знает, как у этой хреновины 21 набрать? А то уже двадцать раз играю, все время перебор :)