Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Еще раз о функциональном программировании, , ну кто там что говорил? подсказывайте) 
V
    Опции темы
proDiva
Дата 4.10.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Значит задание такое: необходимо проставить номера рейсов, причем преобразовать из 36-ричной системы в 10-ричную. Прилагаю код, хочу упростить. Помогайте smile 
Код

def reis(self, a):
        #возвращает номер рейса
        r=""
        var = {
            "01": "01",
            "02": "02",
            "03": "03",
            "04": "04",
            "05": "05",
            "06": "06",
            "07": "07",
            "08": "08",
            "09": "09",
            "0a": "10",
            "0b": "11",
            "0c": "12",
            "0d": "13",
            "0e": "14",
            "0f": "15",
            "0g": "16",
            "0h": "17",
            "0i": "18",
            "0j": "19",
            "0k": "20",
            "0l": "21",
            "0m": "22",
            "0n": "23",
            "0o": "24",
            "0p": "25",
            "0q": "26",
            "0r": "27",
            "0s": "28",
            "0t": "29",
            "0u": "30",
            "0v": "31",
            "0w": "32",
            "0x": "33",
            "0y": "34",
            "0z": "35",
            "10": "36",
            "11": "37",
            "12": "38",
            "13": "39"
            }
        r = var.get(a, "40")
        return r

PM MAIL ICQ   Вверх
albertn
Дата 4.10.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Что-то вроде этого
Код

def reis(self, a):
    """ Возвращает номер рейса """
    alf = map(str,range(0,10))+map(chr,range(ord('a'),ord('z')+1))
    return reduce(lambda x,y:x*len(alf)+y,map(alf.index,s))

PM WWW ICQ   Вверх
proDiva
Дата 4.10.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



albertn, и Вы хотите сказать, что вот этот КУСОЧЕК делает то, что мне нужно? smile  smile 
а можно небольшую расшифровку?)))
PM MAIL ICQ   Вверх
J2A
Дата 4.10.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Сопровождаемость второго варианта -- никакая.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 4.10.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(J2A @  4.10.2006,  20:52 Найти цитируемый пост)
Сопровождаемость второго варианта -- никакая. 

в смысле читабельность?
PM WWW GTalk Jabber   Вверх
Artemios
Дата 4.10.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Красиво, только

Цитата(albertn @  4.10.2006,  11:35 Найти цитируемый пост)
map(alf.index,s)

дает 
Цитата

global name 's' is not defined

а так работает:
Код

map(alf.index,a)

Если кто-то ++albertn за меня, буду благодарен smile


proDiva, в первой строке внутри функции создает алфавит для 36-ричной системы счисления, во второй -- преобразование входной строки (36-чного числа) в 10-чное число.

Добавлено @ 16:09 
Цитата(pythonwin @  4.10.2006,  14:19 Найти цитируемый пост)
в смысле читабельность? 

нет, в смысле: дебаг и документация

Это сообщение отредактировал(а) Artemios - 4.10.2006, 16:08


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 4.10.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Artemios @  4.10.2006,  22:59 Найти цитируемый пост)

Если кто-то ++albertn за меня, буду благодарен smile

не вопрос! smile

Цитата(Artemios @  4.10.2006,  22:59 Найти цитируемый пост)

нет, в смысле: дебаг и документация

ясно!

Это сообщение отредактировал(а) pythonwin - 4.10.2006, 16:20
PM WWW GTalk Jabber   Вверх
proDiva
Дата 4.10.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Для моего "ума" это пока непостижимо smile 
PM MAIL ICQ   Вверх
J2A
Дата 4.10.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Код
import this


Третья строчка. Читать три раза.

Не сопровождаемый - значит, что другой человек (либо этот же, но через n недель/месяцев) не поймет что этот код делает и что/где/как исправить в случае ошибки/улучшения.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Cr@$h
Дата 4.10.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Плохо документированный, я бы сказал. Но на форуме и без этого код такой встречается, так что как есть. А раз код сразу не стал понятен, то объяснение запросить ничего не стоит.
PM MAIL ICQ   Вверх
Artemios
Дата 5.10.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Куда  albertn подевался? smile

Цитата(proDiva @  4.10.2006,  16:36 Найти цитируемый пост)
Для моего "ума" это пока непостижимо
Цитата(Cr@$h @  4.10.2006,  21:45 Найти цитируемый пост)
А раз код сразу не стал понятен, то объяснение запросить ничего не стоит.


proDiva, 
Попытаюсь выполнить чужую работу smile
На входе в a -- строка, представляющая 36-ричное число.
Здесь:
Код

alf = map(str,range(0,10))+map(chr,range(ord('a'),ord('z')+1))

строится список символов, из которых могут быть составлены 36-чные числа (т.н. алфавит), получаем:

alf == ['0','1','2',...,'8','9','a','b','c',...,'x','y','z']

Строится он таким образом: range(0,10) дает список чисел от 0 до 9, map(str,range(0,10)) строит новый список, полученный применением функции, стоящей в map первым аргументом, к каждому элементу второго аргумента (который является списком). str -- функция, дающая строковое представление своего аргумента, здесь для нее аргументами являются числа, в итоге получаем список ['0','1',...,'9'].
Далее,
Код

map(chr,range(ord('a'),ord('z')+1))

это выражение строит список ['a','b',...,'y','z'] так: 
берем порядковый номер первого англицкого символа ord('a'), и бежим от него до порядкового номера последнего символа ord('z'), а так как range верхнюю границу не включает в перечисление, а 'z' мы тоже хотим использовать, то делаем +1, и в итоге 
range(ord('a'),ord('z')+1) дает список, в котором перечисляются порядковые номера всего буржуйского алфавита от a до z. (Тут, конечно, можно было поговорить про кодовые таблицы, но нам это не важно, важно только, что символы от a до z идут по порядку друг за другом). Далее, к полученному списку порядковых номеров применяем обратную для ord операцию chr -- функция по порядковому номеру возвращает сам символ, то есть после map(chr,...) -- имеем список всех сиволов ['a',...,'z'], который и сшиваем с уже имевшимся ['0',...,'9'] и получаем уже описанный alf.
Отметим такое свойство построенного alf, что индекс каждого элемента этого списка есть значение числа, представляемого данным символом в 36-чной системе счисления, т.е.
alf[0] == '0'
...
alf[9] == '9'
alf[10] == 'a'
alf[11] == 'b'
...
alf[36] == 'z'

или, та же запись в обратную сторону:
alf.index('0') == 0 (***)
...
alf.index('9') == 9
alf.index('a') == 10
alf.index('b') == 11
...
alf.index('z') == 36 (***)


А теперь вспомним школьную математику: запись числа в позиционной системе счисления.
Пусть для записи числа используется P символов некоторого алфавита, соответственно имеется P-ичная позиционная система счисления.
Если число записано в виде A0 A1 A2 ... An, где значение каждого символа Ai удовлетворяет условию
0<=Ai<P , то значением самого числа будет 
A0*P^n + A1*P^(n-1) + A2*P^(n-2) + ... + An*P^0 (знаком ^ я обозначаю возведение в степень).
Это выражение можно переписать в реккурентной форме:
(...(((A0*P + A1)*P + A2)*P + A3)...)*P + An ,
то есть вводим некоторую переменную-накопитель B,
присваиваем B = A0,
а за тем для i от 1 до n повторяем:
B = B*P + Ai (+++)

Теперь разберем вторую строчку с учетом математики smile :
Код

return reduce(lambda x,y:x*len(alf)+y,map(alf.index,a))

В переменной a у нас строка символов, представляющая нужное 36-чное число (в позиционной системе счисления). map(alf.index,a) создает список значений этих символов (смотри выделенный мной вот так (***) столбик). Далее, к полученному списку позиционных значений применяем формулу (+++), реккурентность обеспечивает функция reduce, а длина алфавита len(alf) и есть разрядность нашей системы счисления (в данном случае 36). На выходе имеем искомое значение числа.

albertn, с тебя пиво smile smile

Добавлено @ 02:04 
Цитата(J2A @  4.10.2006,  18:35 Найти цитируемый пост)
Не сопровождаемый - значит, что другой человек (либо этот же, но через n недель/месяцев) не поймет что этот код делает и что/где/как исправить в случае ошибки/улучшения. 


В данном конкретном случае не согласен: здесь как в математике -- нет смысла помнить конкретное доказательство простой теоремы, если знаешь сам принцип доказательства. Здесь - позиционная система счисления, а конкретный алгоритм на конкретном языке - дело в пять минут восстановимое. 
В общем сплошные "конкретны" smile


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
proDiva
Дата 5.10.2006, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(Artemios @  5.10.2006,  01:59 Найти цитируемый пост)
albertn, с тебя пиво smile smile

С меня ящик пива))) Расписал лучше препода на занятии))))
PM MAIL ICQ   Вверх
pythonwin
Дата 5.10.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(proDiva @  5.10.2006,  15:12 Найти цитируемый пост)

С меня ящик пива))) Расписал лучше препода на занятии))))



Artemios, и есть преподователь. smile


Artemios, +1

Для модераторов - хорошоий пример для wiki по питону. smile
PM WWW GTalk Jabber   Вверх
proDiva
Дата 5.10.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(pythonwin @  5.10.2006,  08:16 Найти цитируемый пост)
Artemios, и есть преподователь. smile

 smile Не зря у меня возникла такая ассоциация)) Почему у меня в свое время не было таких преподавателей? smile  Кстати, не в тему, но интересно, в каких-нибудь ВУЗах преподают Python?
PM MAIL ICQ   Вверх
pythonwin
Дата 5.10.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



PM WWW GTalk Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.