На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > [Py] Учу питон, поругайте за код
      Всем привет. Написал первую программу на питоне. Поругайте, ЧЯДНТ, что можно сделать лучше 8-)
      Задача классическая - температурный конвертер в обе стороны

      ExpandedWrap disabled
        #!/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'
        Цитата Мяут-Настоящий @
        Всем привет. Написал первую программу на питоне. Поругайте, ЧЯДНТ, что можно сделать лучше 8-)
        Задача классическая - температурный конвертер в обе стороны

        ExpandedWrap disabled
          #!/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'

        ExpandedWrap disabled
          while mode != 'exit':
            # Вводим режим перевода
            mode = raw_input('Enter mode [exit, c2f, f2c]:\t')
            if mode == 'exit':
              break

        двойная проверка -- как-то тупо, лучше наверное сделать так:
        ExpandedWrap disabled
          prompt = 'Enter mode [exit, c2f, f2c]:\t'
          mode = raw_input(prompt)
          while mode != 'exit':
              # ...
              # и в самом конце тела цикла
              mode = raw_input(prompt)


        и ещё, "задача" конечно простая и особо изощрятся может и не стоит, но я бы разместил (лямбда-)функции конвертации в хеш-таблице с ключём mode =)

        и если не ошибаюсь, отступ в два пробела не принят, лучше ставить 4
        Сообщение отредактировано: korvin -
          вобщем, я бы сделал так:
          ExpandedWrap disabled
            #!/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:])

          =)
            Цитата Мяут-Настоящий @
            Учу питон

            А какова цель ?
              Ты не поверишь: рубить капусту.
                Цитата purpe @
                А какова цель ?

                Выучить питон :tong:
                  Цитата korvin @
                  print >> sys.stderr, 'wrong integer: %s' % arg


                  Современные ребята делают так:

                  ExpandedWrap disabled
                    sys.stderr.wrtite("Wrong integer: {0}\n".format(arg))


                  Цитата
                  ExpandedWrap disabled
                    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!

                  ExpandedWrap disabled
                    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
                    Ho Im, жжошь :D
                      Цитата Ho Im @
                      Современные ребята делают так:

                      Я тут узнал, что современные ребята делают так:
                      ExpandedWrap disabled
                            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()


                      И не парятся :D
                        Тем более. Меня просто один вид шести подряд идущих print'ов покоробил, помню, на одной из прошлых работ за подобное за горло брали и канделябрами били.
                          ну вот, заодно и я может питон изучу =)

                          Добавлено
                          Цитата Ho Im @
                          А вообще путь настоящих джедаев — это таблица конверсий всего в кельвины и из кельвинов во все. Таким образом можно избежать комбинаторного взрыва при попытки создать таблицы перевода из всего во все.

                          мне вообще мультиметоды больше нравятся

                          Добавлено
                          Цитата Ho Im @
                          Тем более. Меня просто один вид шести подряд идущих print'ов покоробил, помню, на одной из прошлых работ за подобное за горло брали и канделябрами били.

                          а мне не нравится портить форматирование кода "многострочными строками", впрочем может я не знаю, но как поступать в этом случае:
                          ExpandedWrap disabled
                            ...
                            ...
                                ...
                                ...
                                    print """abcdef
                            ghjklm
                            nopqrs
                            tuvwxyz"""
                                    ...
                                    ...
                                ...
                            ...

                          ?
                            Ты можешь не заморачиваться и воспользоваться непечатаемыми символами Юникода чтобы не нагромождать пробелами или табами текст. А вообще по сути ты рассуждаешь не как программист а как капризный пацан, реально метод предложенный Ho Im я поддерживаю, т.к он во всех книгах написан и еще ни один учебник мне не показал что нужно "принтить". Да прибудет с тобой сила Any key
                              Цитата korvin @
                              мне вообще мультиметоды больше нравятся
                              Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше.
                                Цитата amk @
                                Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше.

                                Это можно назвать задачей? :huh:
                                  Эта проблема - преобразование из всего во все иногда встречается и в реальной работе. Почему бы не выделить ее в отдельную задачу?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0452 ]   [ 15 queries used ]   [ Generated: 2.05.24, 23:16 GMT ]