На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > [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:
                                  Эта проблема - преобразование из всего во все иногда встречается и в реальной работе. Почему бы не выделить ее в отдельную задачу?
                                    Цитата korvin @
                                    а мне не нравится портить форматирование кода "многострочными строками",

                                    Дык на то нам дана подсветка кода! :-? У меня на этих "длинных строках" глаз даже не задерживается.

                                    Кстати, функции в таблице по ключу - прикольно... возьму на вооружение. :)
                                      Цитата amk @
                                      Цитата korvin @
                                      мне вообще мультиметоды больше нравятся
                                      Только вот именно в этой задаче пара конверторов из/в работает и сопровождается лучше.

                                      ой ли?

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

                                      я как бы стараюсь придерживаться отступов, выпирающие строки выглядят просто ужасно. я не знаком с питоном, но меня бы вполне устроил вариант а ля:
                                      ExpandedWrap disabled
                                        ...
                                            ...
                                            ...
                                                print
                                                    "abcde"
                                                    "fghij"
                                                    "klmno"
                                                ...
                                            ...
                                        ...


                                      Добавлено
                                      Цитата Dark_Sup @
                                      Дык на то нам дана подсветка кода! :-? У меня на этих "длинных строках" глаз даже не задерживается.

                                      а меня жутко раздражает, независимо от подцветки. вообще полагаться на подцветку при написании кода -- не очень здравая затея.
                                        Цитата korvin @
                                        ой ли?

                                        Ну смотри, если у тебя есть десяток конвертируемых вариантов, то тебе нужно написать 100 (!) мультиметодов, включая десяток тривиальных. Для варианта исходный-основа-итоговый только 20, и из них только 2 тривиальных для основного варианта.
                                        При добавлении еще одного варианта в случае мультиметода тебе придется написать еще 21 конвертор (1 тривиальный), а для варианта исходный-основа-итог только два - для нового варианта.
                                        Работать будет может быть чуть медленнее, но зато куда проще сопровождать.
                                          Как пример, можно себе представить задачу с конвертированием символов из одной кодировки в другую. В прошлом веке, когда юникод был экзотикой или даже до того, каждый русскоязычный компьютерщик рано или поздно постигал, что такое 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 для любителя мультиметодов.
                                            Может ребят вы в холивары? :)
                                              Зачем к лопате приделывать грабли и вилы - работать не удобно.
                                              Лучше разделять, примерно так:

                                              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)
                                              Так же можно сделать для других шкал, например для Фаренгейта или Руомера.
                                                Во-первых, у тебя неправильный сдвиг шкал градусы Кельвина - градусы Цельсия
                                                Вдобавок, для Фаренгейта придется, кроме сдвига шкал еще и масштаб придется менять так что твой конструктор функций не сработает, придется новый писать.
                                                Шкала Реомюра не помню чем отличается - слишком старая.
                                                То, что ты предложил, еще хуже чем мультиметоды. Тебе в каждом месте придется ручками вписывать из каких конкретно единиц в какие другие единицы ты собираешься преобразовывать, и никакой проверки при этом.
                                                  Какая сказочная бредятина космического масштаба.

                                                  А для Фаренгейта мы вместо "->>" сделаем ">-(**)-<" (оператор-крабе). Просто чтобы жизнь малиной не казалась (и чтобы нанотехнологии прославить, оператор «шмеле» еще надо придумать).

                                                  И не дай Бог надо из Фаренгейта в Реомюра перевести, потому что мы умеем только из Фаренгейта в Цельсия, а из Реомюра только в Ромера, а из Ромера только в Ньютона...
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


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