
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.239.11] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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
,
|
|
|
Эта проблема - преобразование из всего во все иногда встречается и в реальной работе. Почему бы не выделить ее в отдельную задачу?
|