Всё, что вы хотели знать о функциях в Python

compscicenter.ru/
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция №2 в курсе "Python" (осень 2015).
Преподаватель курса: Сергей Лебедев
Страница лекции на сайте CS центра: goo.gl/z9cY9X

Пікірлер: 55

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil2 жыл бұрын

    0:00:00 Синтаксис 0:05:56 Упаковка и распаковка 0:45:34 Области видимости 1:03:00 Функциональное программирование 1:05:22 функция map 1:07:36 функция filter 1:09:06 функция zip 1:10:56 генераторы списков 1:14:54 PEP8 1:29:08 Инструменты для применения PEP8

  • @absolutus.
    @absolutus. Жыл бұрын

    Очень приятная подача материала, спасибо за работу.

  • @viktorz1986
    @viktorz19868 жыл бұрын

    Плюсы: Хорошие уроки, хороший преподаватель. Минусы: плохо слышно вопросы. Было бы здорово послушать подобные лекции на английском.

  • @alexanderkozlikhin
    @alexanderkozlikhin7 жыл бұрын

    Прекрасно! Хочу цикл лекций этого автора про Go!

  • @undefinedundefined2459
    @undefinedundefined24592 жыл бұрын

    9:45 в питоне это называется не итератор, а итерируемый объект Итератор - то, от чего можно вызвать next От списка или множества нельзя вызвать next, но можно с помощью iter сделать его итератором, и тогда уже воспользоваться next

  • @BPLYATS
    @BPLYATS3 жыл бұрын

    11:45 функция bounded_min(...) def bounded_min(first, *args, lo=float("-inf"), hi=float("inf")): res = hi for arg in (first, ) + args: if arg res = arg return max(res, lo) Пару вопросов. 1) Зачем возвращать return max(res, lo)? Просто вернуть res не достаточно? ... return res ... 2) Зачем два раза проверять одно и то же: - if arg res

  • @val9489

    @val9489

    2 жыл бұрын

    Плюсую, может быть в образовательных целях чисто так расписал, но, как по мне, не оправдание таким приседаниям непонятным, только смуту вносит. Не хейтер, лекции классные, дальше смотрю. :)

  • @Forvater
    @Forvater8 жыл бұрын

    Насчёт булевых значений в условиях. Не всегда можно быстро определить тип переменной смотря на большую функцию, а вариант "if foo == True : something" вместо "if foo : something" даёт понять, что something мы хотим выполнить только когда у нас foo - это boolean, а не, скажем int.

  • @slebedev

    @slebedev

    8 жыл бұрын

    +Александр Закрытной Отличать True от других truthy значений почти никогда не нужно. Если ваш код использует такую логику, то это верный сигнал, что его пора переписать :)

  • @mcfistish
    @mcfistish8 жыл бұрын

    16:33 : мне кажется что вместо "if arg < res and lo < arg < hi" уместнее было бы "if lo < arg < res"

  • @Andre-mp4ii

    @Andre-mp4ii

    5 жыл бұрын

    net

  • @BPLYATS

    @BPLYATS

    3 жыл бұрын

    тебе не кажется, так и есть, лектор тупит, еще и возвращает max(lo, res), когда достаточно return res

  • @hunan131
    @hunan1317 жыл бұрын

    The primitive `zip` can work with arguments of different sizes. This means that, in full generality, it's not definable in terms of `map`, because "If one [of the arguments to map] is shorter than another it is assumed to be extended with `None` items.". So, for example: `zip(range(1), range(2))` is not equal to `map(lambda x,y: (x,y), range(1), range(2))`. When the arguments have the same cardinality, however, it works out. Good exercise nevertheless. Excellent lecturer, btw.

  • @slebedev

    @slebedev

    7 жыл бұрын

    Hi, that's a great comment! I did some research and it seems the None-padding only happens in Python2.X. In Python3.X map behaves exactly like zip. Here's an example: >>> list(map(lambda *args: args, [1], [2, 3])) [(1, 2)] which in Python2.X works as: >>> map(lambda *args: args, [1], [2, 3]) [(1, 2), (None, 3)] This little subtleties are what makes writing 2/3 compatible code a nightmare :)

  • @hunan131

    @hunan131

    7 жыл бұрын

    Ah! I got the versions mixed up again. Thank you very much for the response, Sergei.

  • @ivanbag9741
    @ivanbag97414 жыл бұрын

    Вопрос по функции bounded_min(). В случае если мы в неё передаём все значения отрицательные (-5, -12, -13, lo=0, hi=255), то функция возвращает верхнюю границу значение hi. Это так и задумано?

  • @Lokamp_

    @Lokamp_

    3 жыл бұрын

    Да, так и задумано, так как у нас нижняя граница это 0, а верхняя 255 т.е. мы ищем только в этом диапазоне и изначально в res передаем hi.

  • @f1n1st13
    @f1n1st135 ай бұрын

    41:16 не понял про мораль присваивания. как там в х получилось 2??

  • @andarielbaal3405
    @andarielbaal34054 жыл бұрын

    Почему в коде примерно на этом интервале 15:00. Мы пишем "if arg Можно ли написать " if arg И я не совсем понял, если lo = 0 и hi = 255, то под наше условие подходит два аргумента (12 и 13) почему 13 не возвращается? Или он отбирает в начале по условию, чтобы число было в пределах границы, а уже потом отбирает из этих чисел минимальное?

  • @Lokamp_

    @Lokamp_

    3 жыл бұрын

    По первому вопросу - Мы ищем минимальное число в диапазоне от lo до hi, поэтому и пишем if arg По второму вопросу - потому что мы в принципе условие такое задаем - искать только одно минимальное значение.

  • @BPLYATS

    @BPLYATS

    3 жыл бұрын

    @@Lokamp_ он перед циклом присвоил res = hi, достаточно в условии было указать if lo это во первых, а во вторых зачем-то возвращает max(res, lo), когда достаточно было return res

  • @arkane38
    @arkane386 жыл бұрын

    Сергей, а можно получить домашние задания из этого курса?

  • @yauheniyazhdanovich5725

    @yauheniyazhdanovich5725

    6 жыл бұрын

    Аналогичный вопрос

  • @CompscicenterRu

    @CompscicenterRu

    6 жыл бұрын

    Задачи доступны только студентам CS центра (набор раз в год в Питере и Новосибе).

  • @CompscicenterRu

    @CompscicenterRu

    6 жыл бұрын

    Задачи доступны только студентам CS центра (набор раз в год в Питере и Новосибе).

  • @trskldn

    @trskldn

    3 жыл бұрын

    Дайте домашку! Или мы выйдем на демонстрации и устроим беспорядки возле вашего центра!

  • @xvii5753

    @xvii5753

    3 жыл бұрын

    Taras Kolodny Запишись на курс, заплати деньги и получи домашку

  • @secondmodu7184
    @secondmodu71847 жыл бұрын

    33:32 x,y,z = {1,2,3} # unordered что значит здесь unordered? типа должна выдаваться такая ошибка?

  • @slebedev

    @slebedev

    7 жыл бұрын

    Это означает, что порядок присваивания не детерминирован, и использовать такую конструкцию не стоит. Пример: >>> x, y, z = {"abc", "def", "ghi"} >>> z 'def'

  • @secondmodu7184

    @secondmodu7184

    7 жыл бұрын

    ясно, спасибо

  • @user-py7cp7zu1p
    @user-py7cp7zu1p8 жыл бұрын

    Зачем здесь нужен seen=set()? def unique(iterable, seen=set()): seen = set(seen or []) acc = [] for item in iterable: if item not in seen: seen.add(item) acc.append(item) return acc Так короче будет: def unique(iterable): acc = [] for item in iterable: if item not in acc: acc.append(item) return acc Или я чего то не понял? Объясните, пожалуйста.

  • @slebedev

    @slebedev

    8 жыл бұрын

    +Алекс Неизвестенков реальном коде аргумент seen скорее всего не потребуется, а сама функция будет генератором. Версия в лекции нужна исключительно для иллюстрации того, почему не стоит использовать изменяемые значения по умолчанию.

  • @usersbit

    @usersbit

    5 жыл бұрын

    Проверка на вхождение в set "seen" происходит за константное время O(1), нежели в список acc за линейное O(n).

  • @secondmodu7184
    @secondmodu71847 жыл бұрын

    47:47 а разве кроме этих четырех областей видимости есть другие?

  • @slebedev

    @slebedev

    7 жыл бұрын

    Нет, других нет.

  • @dmbo2365
    @dmbo23658 жыл бұрын

    >>> def bounded_min(first, *args, lo=float("-inf"), hi=float("inf")): ... res = hi ... for arg in (first, ) + args: ... if arg ... res = arg ... return max(res, lo) ... >>> bounded_min(-5, 12, 13, lo=0, hi=255) 12 не могу запустить этот код нигде. Почему тут 12 а не 13?

  • @user-py7cp7zu1p

    @user-py7cp7zu1p

    8 жыл бұрын

    +Dmytro Boiko Ищем минимальное из 3 чисел, но только то, что входит в диапазон от 0 до 255. Это и будет 12

  • @LeBrondoter1

    @LeBrondoter1

    6 жыл бұрын

    Компилятор выдаёт 255, что не так?

  • @GENZEKIRILL

    @GENZEKIRILL

    4 жыл бұрын

    @@LeBrondoter1 Стоит проверить откуда у питона компилятор...

  • @user-vg4iq7ji8o
    @user-vg4iq7ji8o8 жыл бұрын

    На 26 слайде написано, что global лучше заменять на thread local объект. О чем речь, подскажите? Киньте ссылкой про это, а то все что нагуглилось, касается многопоточности, что явно не то

  • @slebedev

    @slebedev

    8 жыл бұрын

    +Вова Крылов речь как раз о threading.local. Прежде чем отвечать на ваш вопрос, хочется подчеркнуть два момента: а) если вы можете обойтись без изменяемой глобальной переменной --- сделайте это, б) при использовании одного потока thread-local не даёт никаки преимуществ по сравнению с global. Теперь к вопросу. Мысль тут в том, что thread-local --- это чуть менее глобальная глобальная переменная. Популярный веб-фреймворк Flask использует thread-local переменные ровно с этой целью. Написанное с использованием Flask веб-приложение может обслуживать запросы сразу в нескольких потоках. При этом API Flask устроен таким образом, что программист имеет доступ к запросу только через специальный объект request. Объект request не может быть глобальным, потому что у каждого потока свой запрос, поэтому во Flask он реализован через threading.local.

  • @user-vg4iq7ji8o

    @user-vg4iq7ji8o

    8 жыл бұрын

    Спасибо за ответ. В данный момент меня интересует как раз таки однопоточный случай и пока я его расписывал тут, мне пришла в голову идея как избавиться от изменяемости глобальной переменной (метод желтой уточки работает на славу :) )

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil2 жыл бұрын

    0:46 ..и противоречит pep8

  • @DiamondSane
    @DiamondSane7 жыл бұрын

    Смотрю и не понимаю.. Почему python популярен? Лектор хорош, кстати говоря.

  • @ata.ibragimoff

    @ata.ibragimoff

    4 жыл бұрын

    Читаю и не понимаю, почему вы не понимаете, почему python популярен

  • @user-je2nh4op3s
    @user-je2nh4op3s3 жыл бұрын

    я пишу на иврите

  • @batonbaggetovich2072
    @batonbaggetovich20722 жыл бұрын

    очень сложно обьясняет … поверхностно как по книжке… подача как умник у доски… понятное дело что пришли черпать знание а тут распылителем не связано… вопщем доработать программу надобна

  • @antonl149
    @antonl1496 жыл бұрын

    можно не бегать из угла в угол )) Как энот в клетке ))))

  • @Das.Kleine.Krokodil

    @Das.Kleine.Krokodil

    5 жыл бұрын

    Полтора часа стоять?

  • @tankostream
    @tankostream8 жыл бұрын

    слишком много костылей в питоне, для того чтобы он был языком который проще читать, если сравнить код этой функции в питоне и на джава то проще читать его будет именно в джаве)

  • @faustinutub

    @faustinutub

    6 жыл бұрын

    но в целом читаемость питона в разы выше, чем у c-like языков.

  • @stasseven2577
    @stasseven25775 жыл бұрын

    Ужасная лекция. Неужели есть люди, которые заплатили деньги за это? Кого может научить этот лектор? Манера у него, конечно милашечная и, типо, все элементарно, но по сути перескакивает, не акцентирует и вообще хрень

  • @maximfialkovskij8445

    @maximfialkovskij8445

    5 жыл бұрын

    Лекция проводилась в CSСenter, где учатся ребята с хорошей базой и большим опытом в других языках, поэтому элементарные вещи не рассматриваются подробно

  • @crea7or
    @crea7or7 жыл бұрын

    Очень классный преподаватель, хоть сам Питон и отстой :)

  • @user-hx6nv7ys5x

    @user-hx6nv7ys5x

    5 жыл бұрын

    какой язык вы считаете лучше ?