Онлайн-репетитор по Python

  • Tutorial
Для курса по программированию MIT разработан интерактивный инструмент Online Python Tutor, он в графическом виде показывает изменение стека и кучи на каждом шаге выполнения кода. Таким образом, онлайновый «наставник» как бы наглядно объясняет студенту работу программы.



В окно редактора можно скопировать любой код или посмотреть несколько уже готовых простеньких примеров (факториал, квадратный корень, последовательность Фибоначчи и т.д.). Навигация осуществляется стрелками на клавиатуре. Студенты, изучающие Python, могут увидеть и лучше понять работу кода.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 30
  • +3
    Попробовал
    import math
    Получил
    ImportError: __import__ not found
    Это даже не смешно. Могли бы оставить.
    • 0
      help() вводит в ступор: Unknown error: Please email a bug report to philip@pgbovine.net
      dir() не определен.
      Ну это совсем не интересно…

      • +3
        Кароче юзать как онлайн дебагер не получится. Я думал гораздо лучше будет это все.
        • 0
          как раз хотел начать изучать, но платформа их довольно скудна на данный момент, придется самому все изучать досконально
          • +1
            Там на гитхабе написано что оттуда выкинули всё что можно и поставили ограничение в 200 шагов, что бы не использовали как дебаггер. Ну и сам питон там не на js написан, а кидает аяксом код на сервер, тот исполняет и возвращает все состояния памяти на всех шагах. Для обучения посмотреть что происходит в памяти — это же прекрасно.
      • 0
        Уверен это интересно тем, кто пайтон видел только на картинках (типа меня).
        • +1
          На сайте сайте лежит задачка:
          Two-sum
          Write a function to return the sum of the two largest elements in the given list (assuming you're given a list with at least two elements).
          Hint: Can you find the largest element? How about the second largest? Or think about sorting.
          Solution: Scan through the list twice to find the two largest elements, then sum them (or sort and sum the two largest elements).


          Не пойму, зачем нужно проходить лист два раза? Сортировать тоже, насколько понимаю, не обязательно.
          Разве такой код (ниже) не решает задачу?
          def sumTwoLargest(lst):
              max = -9223372036854775807
              prevMax = max
              for el in lst:
                  if max < el:
                      prevMax = max
                      max = el
                  else:
                      if prevMax < el:
                          prevMax = el
              return max+prevMax
          
          • 0
            может они хотели что нибудь вроде:
            def sumTwoLargest(lst):
                return sorted( lst )[::-1][0]
            
            • 0
              извиняюсь, невнимательно прочитал условие, но решение не сильно отличается (без проверок)
              def sumTwoLargest(lst):
                  return sum( sorted( input )[-2:] )
              
              • +3
                Вас не смущает, что сортировка «слегка медленнее», чем поиск 2-х максимальных чисел в списке? Как бы O(N*logN) и О(N) соответственно.
                • +1
                  А есть какие то требования? пока я увидел массив и пяти элементов. Я согласен что пробежаться по массиву это быстрее, но в данном случае, очевидно, что незачем городить огород для академических задачек в две строки.
                  • 0
                    К стати а вы пробовали проверять решения на время работы?, т.е. прежде чем возражать я думаю должны были попробовать не так ли? Как это ни странно, но короткое решение оказалось в два раза быстрее по скорости работы.
                    Python 2.6.5
                    для первого решения время :
                    real 0m1.905s
                    user 0m1.840s
                    sys 0m0.068s
                    для второго решения время :
                    real 0m0.881s
                    user 0m0.748s
                    sys 0m0.092s
                    строка запуска print sumTwoLargest( range( 1, 10000444 ))

                    в общем ни к чему споры, python это не си и даже не с++, и скорость работы встроенных функций может подкидывать классные загадки.
                    • 0
                      По-честному надо перемешивать (shuffle) массив, подаваемый на сортировку. Однако, это не даёт существенных отличий.
                      • 0
                        Не программирую на питоне.
                        Если я правильно понимаю, range(a,b) возвращает отсортированный по возрастанию лист. Маны говорят, что
                        First the trivial cases, trivial for samplesort because it special-cased
                        them, and trivial for timsort because it naturally works on runs. Within
                        an «n» block, the first line gives the # of compares done by samplesort,
                        the second line by timsort, and the third line is the percentage by
                        which the samplesort count exceeds the timsort count:

                        На той же странице мана можно увидеть время работы сортировки на отсортированном наборе. Насколько понимаю, сложность в таком случае — O(n), т.е. подобная сложности варианта с одним проходом по массиву. Т.е. мы видим отношение констант.
                        Если набор будет случайным, какие будут результаты? :)
                        • 0
                          Наверное вы правы, сортированный список сокращает время работы, поэтому и получилось быстрее. По моему все это offtopic и продолжать не вижу смысла. Понятно что с чисто алгоритмической точки зрения в однопроходном варианте меньше приседаний.
                  • +3
                    Да, скорее всего. Курс, ведь, про Python, а не алгоритмы.
                  • 0
                    Берите max = lst[0], так надежнее.
                    • 0
                      На наборе, упорядоченном по убыванию, ломается.
                      Вообще, вместо этого магического числа я хотел написать -sysmaxint, но импорт sys на том сайте не работает.
                      • 0
                        max = lst[1]
                        prevMax = lst[0]

                        так работает
                        • 0
                          Нет, сорри, и тут есть неработающие варианты. Подумаю еще.
                          • 0
                            угу. Но чем вас не устраивает -sysmaxint? По-моему, безопасно и понятно. :)
                            • 0
                              Это идеологически неправильно — рассчитывать на какие-то умолчания.
                        • 0
                          def sumTwoLargest(lst):
                          prevMax = max = None
                          for el in lst:
                          if max < el:
                          prevMax = max
                          max = el
                          else:
                          if prevMax < el:
                          prevMax = el
                          print max, prevMax,
                          return max, prevMax

                          print sumTwoLargest([9,8,7,6,5,4,3]) == (9, 8)
                          print sumTwoLargest([3, 4, 5, 6, 7, 8, 9]) == (9, 8)
                          print sumTwoLargest([3, 5,7,8,3,2,4,7,9,5,6,7,4]) == (9, 8)
                          print sumTwoLargest([11, 12,7,8,3,2,4,7,9,5,6,7,4]) == (12, 11)
                          print sumTwoLargest([12, 5,7,8,3,2,4,7,9,5,6,7,4]) == (12, 9)
                          print sumTwoLargest([12, 11,7,8,3,2,4,7,9,5,6,7,4]) == (12, 11)
                          print sumTwoLargest([12, 11,7,8,3,2,12,7,9,5,6,7,4]) == (12, 12)
                          print sumTwoLargest([12, 7,8,3,2,4,7,9,5,6,7,11]) == (12, 11)
                          print sumTwoLargest([11, 7,8,3,2,4,7,9,5,6,7,4, 12]) == (12, 11)

                          • 0
                            Про None не знал, спасибо. :)
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • +1
                        D1 = True == False
                        True = False
                        D2 = True == False
                        • 0
                          >>> True = False
                          >>> True or False
                          False
                          >>> True is False
                          True
                          • 0
                            True, False = False, True
                          • 0
                            его легко затроллить
                            x = 5
                            def foo(y):
                              def bar():
                                for i in range(x,y):
                                  yield i
                              return bar
                            
                            it = foo(7)    
                            for z in it():
                              print z
                            
                            • 0
                              на самом деле yield не умеет.
                              с замыканием всё нормально.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.