19 февраля 2012 в 21:45

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

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



В окно редактора можно скопировать любой код или посмотреть несколько уже готовых простеньких примеров (факториал, квадратный корень, последовательность Фибоначчи и т.д.). Навигация осуществляется стрелками на клавиатуре. Студенты, изучающие Python, могут увидеть и лучше понять работу кода.
Анатолий Ализар @alizar
карма
751,5
рейтинг 24,6
Пользователь
Самое читаемое Разработка

Комментарии (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 не умеет.
      с замыканием всё нормально.

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