
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.26.253] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет. Написал первую программу на питоне. Поругайте, ЧЯДНТ, что можно сделать лучше
![]() Задача классическая - температурный конвертер в обе стороны ![]() ![]() #!/usr/bin/python # -*- coding: utf-8 -*- import sys mode = 'NULL' mlist = ('c2f', 'f2c') print 'Temperature converter' while mode != 'exit': # Вводим режим перевода mode = raw_input('Enter mode [exit, c2f, f2c]:\t') if mode == 'exit': break # Проверяем режим if not mlist.count(mode): print >> sys.stderr, 'You\'d entered wrong conv. mode' continue # Вводится температура rtr = 5 while rtr: try: temp = int(raw_input('Enter temperature in %s: \t' % {'c2f': 'C', 'f2c' : 'F'}[mode] )) rtr = 0 except ValueError: rtr -= 1; if not rtr: print >> sys.stderr, 'Failed five times, exiting'; sys.exit() print >> sys.stderr, 'Wrong integer. %d retries left' % rtr; #Переводим фарингейты if mode == 'c2f': print 'Temperature %d C or %d F' % (temp, temp * 9 / 5 + 32) else: print 'Temperature %d F or %d C' % (temp, (temp - 32) * 5 / 9) print '\n--------------------\n' |
![]() |
Сообщ.
#2
,
|
|
Цитата Мяут-Настоящий @ Всем привет. Написал первую программу на питоне. Поругайте, ЧЯДНТ, что можно сделать лучше ![]() Задача классическая - температурный конвертер в обе стороны ![]() ![]() #!/usr/bin/python # -*- coding: utf-8 -*- import sys mode = 'NULL' mlist = ('c2f', 'f2c') print 'Temperature converter' while mode != 'exit': # Вводим режим перевода mode = raw_input('Enter mode [exit, c2f, f2c]:\t') if mode == 'exit': break # Проверяем режим if not mlist.count(mode): print >> sys.stderr, 'You\'d entered wrong conv. mode' continue # Вводится температура rtr = 5 while rtr: try: temp = int(raw_input('Enter temperature in %s: \t' % {'c2f': 'C', 'f2c' : 'F'}[mode] )) rtr = 0 except ValueError: rtr -= 1; if not rtr: print >> sys.stderr, 'Failed five times, exiting'; sys.exit() print >> sys.stderr, 'Wrong integer. %d retries left' % rtr; #Переводим фарингейты if mode == 'c2f': print 'Temperature %d C or %d F' % (temp, temp * 9 / 5 + 32) else: print 'Temperature %d F or %d C' % (temp, (temp - 32) * 5 / 9) print '\n--------------------\n' ![]() ![]() while mode != 'exit': # Вводим режим перевода mode = raw_input('Enter mode [exit, c2f, f2c]:\t') if mode == 'exit': break двойная проверка -- как-то тупо, лучше наверное сделать так: ![]() ![]() prompt = 'Enter mode [exit, c2f, f2c]:\t' mode = raw_input(prompt) while mode != 'exit': # ... # и в самом конце тела цикла mode = raw_input(prompt) и ещё, "задача" конечно простая и особо изощрятся может и не стоит, но я бы разместил (лямбда-)функции конвертации в хеш-таблице с ключём mode =) и если не ошибаюсь, отступ в два пробела не принят, лучше ставить 4 |
![]() |
Сообщ.
#3
,
|
|
вобщем, я бы сделал так:
![]() ![]() #!/usr/bin/python # -*- coding: utf-8 -*- import sys import getopt Mode = dict() Mode['c2f'] = lambda temp: temp * 9 / 5 + 32 Mode['f2c'] = lambda temp: (temp - 32) * 5 / 9 def modes(): print 'available modes:' for m in Mode.keys(): print '\t%s' % m def usage(): print 'usage:' print '\t-h, --help \tprint usage summary' print '\t --modes \tprint available modes' print '\t-d \tshow debugging information while running' print '\t-m <m>, --mode=<m> \tuse <m> as conversion mode' print '\t-t <t>, --temp=<t> \tuse <t> as temperature to convert' def convert(mode, temp): if mode in Mode.keys(): return Mode[mode](temp) else: print >> sys.stderr, 'wrong mode "%s"' % mode modes() sys.exit(2) def main(argv): temp = 0 mode = Mode.keys()[0] try: opts, args = getopt.getopt(argv, "hm:t:d", ["help", "mode=", "temp=", "modes"]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt == '--modes': modes() sys.exit() elif opt == '-d': global _debug _debug = 1 elif opt in ("-m", "--mode"): mode = arg elif opt in ("-t", "--temp"): try: temp = int(arg) except ValueError: print >> sys.stderr, 'wrong integer: %s' % arg sys.exit(2) else: usage() sys.exit() print convert(mode, temp) if __name__ == "__main__": main(sys.argv[1:]) =) |
![]() |
Сообщ.
#4
,
|
|
Цитата Мяут-Настоящий @ Учу питон А какова цель ? |
Сообщ.
#5
,
|
|
|
Ты не поверишь: рубить капусту.
|
Сообщ.
#6
,
|
|
|
Цитата purpe @ А какова цель ? Выучить питон ![]() |
Сообщ.
#7
,
|
|
|
Цитата korvin @ print >> sys.stderr, 'wrong integer: %s' % arg Современные ребята делают так: ![]() ![]() sys.stderr.wrtite("Wrong integer: {0}\n".format(arg)) Цитата ![]() ![]() def usage(): print 'usage:' print '\t-h, --help \tprint usage summary' print '\t --modes \tprint available modes' print '\t-d \tshow debugging information while running' print '\t-m <m>, --mode=<m> \tuse <m> as conversion mode' print '\t-t <t>, --temp=<t> \tuse <t> as temperature to convert' За это убивают. На каждую строчку print? Помилуйте, это же не GW-BASIC! ![]() ![]() def usage(): usage = """Usage: -h, --help print this message --modes print available modes -d show debugging information while running -m MODE, --mode=MODE use MODE as conversion mode -t TEMP, --temp=TEMP use TEMP as temperature to convert \n""" sys.stdout.write(usage) Добавлено А вообще путь настоящих джедаев — это таблица конверсий всего в кельвины и из кельвинов во все. Таким образом можно избежать комбинаторного взрыва при попытки создать таблицы перевода из всего во все. И тогда режим задается как: tempconv --from F --to C 100 |
Сообщ.
#8
,
|
|
|
Ho Im, жжошь
![]() |
Сообщ.
#9
,
|
|
|
Цитата Ho Im @ Современные ребята делают так: Я тут узнал, что современные ребята делают так: ![]() ![]() parser = OptionParser() parser.add_option('-d', '--directory', action="store", type="string", dest="directory", metavar='DIR', help='Explorer directory path') parser.add_option('-t', '--tar-file', action="store", type="string", dest="tarfile", metavar='TARFILE', help='Explorer tar file path') parser.add_option('-c', '--config', action="store", type="string", dest="config", metavar='CONFIG', help='Explorer analyzer configuration file') (options, args) = parser.parse_args() И не парятся ![]() |
Сообщ.
#10
,
|
|
|
Тем более. Меня просто один вид шести подряд идущих print'ов покоробил, помню, на одной из прошлых работ за подобное за горло брали и канделябрами били.
|
![]() |
Сообщ.
#11
,
|
|
ну вот, заодно и я может питон изучу =)
Добавлено Цитата Ho Im @ А вообще путь настоящих джедаев — это таблица конверсий всего в кельвины и из кельвинов во все. Таким образом можно избежать комбинаторного взрыва при попытки создать таблицы перевода из всего во все. мне вообще мультиметоды больше нравятся Добавлено Цитата Ho Im @ Тем более. Меня просто один вид шести подряд идущих print'ов покоробил, помню, на одной из прошлых работ за подобное за горло брали и канделябрами били. а мне не нравится портить форматирование кода "многострочными строками", впрочем может я не знаю, но как поступать в этом случае: ![]() ![]() ... ... ... ... print """abcdef ghjklm nopqrs tuvwxyz""" ... ... ... ... ? |
Сообщ.
#12
,
|
|
|
Ты можешь не заморачиваться и воспользоваться непечатаемыми символами Юникода чтобы не нагромождать пробелами или табами текст. А вообще по сути ты рассуждаешь не как программист а как капризный пацан, реально метод предложенный Ho Im я поддерживаю, т.к он во всех книгах написан и еще ни один учебник мне не показал что нужно "принтить". Да прибудет с тобой сила Any key
|
Сообщ.
#13
,
|
|
|
Цитата korvin @ Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше. мне вообще мультиметоды больше нравятся |
Сообщ.
#14
,
|
|
|
Цитата amk @ Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше. Это можно назвать задачей? ![]() |
Сообщ.
#15
,
|
|
|
Эта проблема - преобразование из всего во все иногда встречается и в реальной работе. Почему бы не выделить ее в отдельную задачу?
|
![]() |
Сообщ.
#16
,
|
|
Цитата korvin @ а мне не нравится портить форматирование кода "многострочными строками", Дык на то нам дана подсветка кода! ![]() Кстати, функции в таблице по ключу - прикольно... возьму на вооружение. ![]() |
![]() |
Сообщ.
#17
,
|
|
Цитата amk @ Цитата korvin @ Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше.мне вообще мультиметоды больше нравятся ой ли? Добавлено Цитата Lumberjack @ Ты можешь не заморачиваться и воспользоваться непечатаемыми символами Юникода чтобы не нагромождать пробелами или табами текст. А вообще по сути ты рассуждаешь не как программист а как капризный пацан, реально метод предложенный Ho Im я поддерживаю, т.к он во всех книгах написан и еще ни один учебник мне не показал что нужно "принтить". Да прибудет с тобой сила Any key я как бы стараюсь придерживаться отступов, выпирающие строки выглядят просто ужасно. я не знаком с питоном, но меня бы вполне устроил вариант а ля: ![]() ![]() ... ... ... print "abcde" "fghij" "klmno" ... ... ... Добавлено Цитата Dark_Sup @ Дык на то нам дана подсветка кода! ![]() а меня жутко раздражает, независимо от подцветки. вообще полагаться на подцветку при написании кода -- не очень здравая затея. |
Сообщ.
#18
,
|
|
|
Цитата korvin @ ой ли? Ну смотри, если у тебя есть десяток конвертируемых вариантов, то тебе нужно написать 100 (!) мультиметодов, включая десяток тривиальных. Для варианта исходный-основа-итоговый только 20, и из них только 2 тривиальных для основного варианта. При добавлении еще одного варианта в случае мультиметода тебе придется написать еще 21 конвертор (1 тривиальный), а для варианта исходный-основа-итог только два - для нового варианта. Работать будет может быть чуть медленнее, но зато куда проще сопровождать. |
Сообщ.
#19
,
|
|
|
Как пример, можно себе представить задачу с конвертированием символов из одной кодировки в другую. В прошлом веке, когда юникод был экзотикой или даже до того, каждый русскоязычный компьютерщик рано или поздно постигал, что такое Codepage 866, 1125, 1251, KOI8-R/U, ISO8859-5. Сейчас это не так актуально, но все же необходимость перекодировывать тексты из и в случается. У нас в юниксах для этого есть утилиты iconv и recode, какую использовать — дело вкуса и религии, но.
Вот что говорит мне iconv, когда я прошу вывести список поддерживаемых кодировок. Сразу говорю, там 143 кодировки ANSI_X3.4-1968 ANSI_X3.4-1986 ASCII CP367 IBM367 ISO-IR-6 ISO646-US ISO_646.IRV:1991 US US-ASCII CSASCII UTF-8 UTF-8-MAC UTF8-MAC ISO-10646-UCS-2 UCS-2 CSUNICODE UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11 UCS-2LE UNICODELITTLE ISO-10646-UCS-4 UCS-4 CSUCS4 UCS-4BE UCS-4LE UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7 UCS-2-INTERNAL UCS-2-SWAPPED UCS-4-INTERNAL UCS-4-SWAPPED C99 JAVA CP819 IBM819 ISO-8859-1 ISO-IR-100 ISO8859-1 ISO_8859-1 ISO_8859-1:1987 L1 LATIN1 CSISOLATIN1 ISO-8859-2 ISO-IR-101 ISO8859-2 ISO_8859-2 ISO_8859-2:1987 L2 LATIN2 CSISOLATIN2 ISO-8859-3 ISO-IR-109 ISO8859-3 ISO_8859-3 ISO_8859-3:1988 L3 LATIN3 CSISOLATIN3 ISO-8859-4 ISO-IR-110 ISO8859-4 ISO_8859-4 ISO_8859-4:1988 L4 LATIN4 CSISOLATIN4 CYRILLIC ISO-8859-5 ISO-IR-144 ISO8859-5 ISO_8859-5 ISO_8859-5:1988 CSISOLATINCYRILLIC ARABIC ASMO-708 ECMA-114 ISO-8859-6 ISO-IR-127 ISO8859-6 ISO_8859-6 ISO_8859-6:1987 CSISOLATINARABIC ECMA-118 ELOT_928 GREEK GREEK8 ISO-8859-7 ISO-IR-126 ISO8859-7 ISO_8859-7 ISO_8859-7:1987 ISO_8859-7:2003 CSISOLATINGREEK HEBREW ISO-8859-8 ISO-IR-138 ISO8859-8 ISO_8859-8 ISO_8859-8:1988 CSISOLATINHEBREW ISO-8859-9 ISO-IR-148 ISO8859-9 ISO_8859-9 ISO_8859-9:1989 L5 LATIN5 CSISOLATIN5 ISO-8859-10 ISO-IR-157 ISO8859-10 ISO_8859-10 ISO_8859-10:1992 L6 LATIN6 CSISOLATIN6 ISO-8859-11 ISO8859-11 ISO_8859-11 ISO-8859-13 ISO-IR-179 ISO8859-13 ISO_8859-13 L7 LATIN7 ISO-8859-14 ISO-CELTIC ISO-IR-199 ISO8859-14 ISO_8859-14 ISO_8859-14:1998 L8 LATIN8 ISO-8859-15 ISO-IR-203 ISO8859-15 ISO_8859-15 ISO_8859-15:1998 LATIN-9 ISO-8859-16 ISO-IR-226 ISO8859-16 ISO_8859-16 ISO_8859-16:2001 L10 LATIN10 KOI8-R CSKOI8R KOI8-U KOI8-RU CP1250 MS-EE WINDOWS-1250 CP1251 MS-CYRL WINDOWS-1251 CP1252 MS-ANSI WINDOWS-1252 CP1253 MS-GREEK WINDOWS-1253 CP1254 MS-TURK WINDOWS-1254 CP1255 MS-HEBR WINDOWS-1255 CP1256 MS-ARAB WINDOWS-1256 CP1257 WINBALTRIM WINDOWS-1257 CP1258 WINDOWS-1258 850 CP850 IBM850 CSPC850MULTILINGUAL 862 CP862 IBM862 CSPC862LATINHEBREW 866 CP866 IBM866 CSIBM866 CP1131 MAC MACINTOSH MACROMAN CSMACINTOSH MACCENTRALEUROPE MACICELAND MACCROATIAN MACROMANIA MACCYRILLIC MACUKRAINE MACGREEK MACTURKISH MACHEBREW MACARABIC MACTHAI HP-ROMAN8 R8 ROMAN8 CSHPROMAN8 NEXTSTEP ARMSCII-8 GEORGIAN-ACADEMY GEORGIAN-PS KOI8-T CP154 CYRILLIC-ASIAN PT154 PTCP154 CSPTCP154 KZ-1048 RK1048 STRK1048-2002 CSKZ1048 MULELAO-1 CP1133 IBM-CP1133 ISO-IR-166 TIS-620 TIS620 TIS620-0 TIS620.2529-1 TIS620.2533-0 TIS620.2533-1 CP874 WINDOWS-874 VISCII VISCII1.1-1 CSVISCII TCVN TCVN-5712 TCVN5712-1 TCVN5712-1:1993 ISO-IR-14 ISO646-JP JIS_C6220-1969-RO JP CSISO14JISC6220RO JISX0201-1976 JIS_X0201 X0201 CSHALFWIDTHKATAKANA ISO-IR-87 JIS0208 JIS_C6226-1983 JIS_X0208 JIS_X0208-1983 JIS_X0208-1990 X0208 CSISO87JISX0208 ISO-IR-159 JIS_X0212 JIS_X0212-1990 JIS_X0212.1990-0 X0212 CSISO159JISX02121990 CN GB_1988-80 ISO-IR-57 ISO646-CN CSISO57GB1988 CHINESE GB_2312-80 ISO-IR-58 CSISO58GB231280 CN-GB-ISOIR165 ISO-IR-165 ISO-IR-149 KOREAN KSC_5601 KS_C_5601-1987 KS_C_5601-1989 CSKSC56011987 EUC-JP EUCJP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE MS_KANJI SHIFT-JIS SHIFT_JIS SJIS CSSHIFTJIS CP932 ISO-2022-JP CSISO2022JP ISO-2022-JP-1 ISO-2022-JP-2 CSISO2022JP2 CN-GB EUC-CN EUCCN GB2312 CSGB2312 GBK CP936 MS936 WINDOWS-936 GB18030 ISO-2022-CN CSISO2022CN ISO-2022-CN-EXT HZ HZ-GB-2312 EUC-TW EUCTW CSEUCTW BIG-5 BIG-FIVE BIG5 BIGFIVE CN-BIG5 CSBIG5 CP950 BIG5-HKSCS:1999 BIG5-HKSCS:2001 BIG5-HKSCS BIG5-HKSCS:2004 BIG5HKSCS EUC-KR EUCKR CSEUCKR CP949 UHC CP1361 JOHAB ISO-2022-KR CSISO2022KR CP856 CP922 CP943 CP1046 CP1124 CP1129 CP1161 IBM-1161 IBM1161 CSIBM1161 CP1162 IBM-1162 IBM1162 CSIBM1162 CP1163 IBM-1163 IBM1163 CSIBM1163 DEC-KANJI DEC-HANYU 437 CP437 IBM437 CSPC8CODEPAGE437 CP737 CP775 IBM775 CSPC775BALTIC 852 CP852 IBM852 CSPCP852 CP853 855 CP855 IBM855 CSIBM855 857 CP857 IBM857 CSIBM857 CP858 860 CP860 IBM860 CSIBM860 861 CP-IS CP861 IBM861 CSIBM861 863 CP863 IBM863 CSIBM863 CP864 IBM864 CSIBM864 865 CP865 IBM865 CSIBM865 869 CP-GR CP869 IBM869 CSIBM869 CP1125 EUC-JIS-2004 EUC-JISX0213 SHIFT_JIS-2004 SHIFT_JISX0213 ISO-2022-JP-2004 ISO-2022-JP-3 BIG5-2003 ISO-IR-230 TDS565 ATARI ATARIST RISCOS-LATIN1 В общем и целом предлагаю охватить масштабность проекта «конвертор из любой кодировки в любую» на мультиметодах. Если исключить варианты «в самого себя», получим 20306 методов. Возможно, если автор — рантье и ему не надо работать, чтобы себя кормить, он сможет до пенсии это написать, правда, кому оно надо, еще вопрос. Ну и появление новой кодировки — это неизменный facepalm для любителя мультиметодов. |
Сообщ.
#20
,
|
|
|
Может ребят вы в холивары?
![]() |
Сообщ.
#21
,
|
|
|
Зачем к лопате приделывать грабли и вилы - работать не удобно.
Лучше разделять, примерно так: def make_inc(t): return lambda x,y=t: x+t cel2kel = make_inc(237) # Цельсий-Кельвин kel2cel = make_inc(-237) # Кельвин-Цельсий Можно обобщить (хотя это не есть хорошо) def CelKel(s,t): if s == "->>": return cel2kel(t) if s == "<<-": return kel2cel(t) Так же можно сделать для других шкал, например для Фаренгейта или Руомера. |
Сообщ.
#22
,
|
|
|
Во-первых, у тебя неправильный сдвиг шкал градусы Кельвина - градусы Цельсия
Вдобавок, для Фаренгейта придется, кроме сдвига шкал еще и масштаб придется менять так что твой конструктор функций не сработает, придется новый писать. Шкала Реомюра не помню чем отличается - слишком старая. То, что ты предложил, еще хуже чем мультиметоды. Тебе в каждом месте придется ручками вписывать из каких конкретно единиц в какие другие единицы ты собираешься преобразовывать, и никакой проверки при этом. |
Сообщ.
#23
,
|
|
|
Какая сказочная бредятина космического масштаба.
А для Фаренгейта мы вместо "->>" сделаем ">-(**)-<" (оператор-крабе). Просто чтобы жизнь малиной не казалась (и чтобы нанотехнологии прославить, оператор «шмеле» еще надо придумать). И не дай Бог надо из Фаренгейта в Реомюра перевести, потому что мы умеем только из Фаренгейта в Цельсия, а из Реомюра только в Ромера, а из Ромера только в Ньютона... |