13:20 "кортеж отличается от списка тем, что из него невозможно сделать срез" Штопрастити?... >>> tpl = (1, 2, 3, 4, 5, 'a', 'b') >>> tpl_2 = tpl[2:6] >>> tpl_2 (3, 4, 5, 'a') Хоть обсрезайся до посинения. Хоть скобками, хоть слайсом. Тем более что даже из списка срез не "берётся", а КОПИРУЕТСЯ, "в чём отличие, брат? В правде или в дЕньгах?.." Равно как и из строки. Срез всегда только копируется и никак иначе это не происходит. "А ты точно сантехник?.." Шо-то синьор из своего поднебесья уже вообще на земле мышей не ловит. Вот для того, уважаемые радиослушатели, и нужны джуниоры. И будут нужны. Потому что эти прокачанные и просветлённые, по их же словам, "уже не всё из основ помнят", а делать это тем не менее как требовалось, так и будет требоваться. И никакой GPT в этом не поможет, проверял уже раз 50, нафиг, нафиг, этот придурок даже сам на лету придумывает несуществующие "библиотеки", из которых якобы берёт команды, а в двух постах подряд сам себе противоречит на все 100% и оба раза неправильно. Ну и кому не лень, измерьте скорость линейного считывания данных (кортеж быстрее почти в полтора раза) и поиск индекса по значению/значения по индексу (список быстрее процентов на 20-30), особенно на коллекциях длиной в миллионы и состоящих из разных типов данных. Разница между ними есть, и немалая, для разных задач есть свой оптимальный выбор. Про функции вас здесь откровенно дурят. Да, это изолированный осмысленный блок кода. Как и класс. Как и файл. Как и модуль. Но такое определение верно только до первого вызова. С этого момента функция -- ПРОСТРАНСТВО ИМЁН, она инициировалась, оживила весь свой внутренний механизм и в таком виде висит в памяти не "до выдачи результата", а до самого окончания работы кода либо пока её принудительно не удалить командой del. И все последующие обращения происходят уже не к коду "строка за строкой", а именно к этому пространству, это уже самостоятельная сущность, как и любая встроенная питоновская команда. Играйтесь: import inspect def dec(color=7, /): def layer(fnc): def inner(*args, **kwargs): res = fnc(*args, **kwargs) for x in (s for s in dir(res)): xx = getattr(res, x) if callable(xx) and inspect.isfunction(xx): inner.cnt += 1 print(f"{inner.cnt} {x = }") setattr(res, x,\ lambda xx=xx: f"\033[1;3;3{color}m{xx()}\033[0m") print(f"{res.__name__!a}") return res inner.cnt = 0 print("starting inner:", fnc.__name__) return inner print("starting layer") return layer @dec(2) def outer(a): def inner_1(): def self(): return f"Value: {a}" def isiter(): if "__iter__" in dir(a): try: return f"{len(a) = }" except TypeError: return f"{type(a)} is iterable but has no len" return f"{a} is not iterable" inner_1.self = self inner_1.isiter = isiter inner_1() return inner_1 c = outer(4) d = outer(range(7)) e = outer((x for x in "abcd")) print(c.self()) print(c.isiter()) print(d.self()) print(d.isiter()) print(e.self()) print(e.isiter()) c.f = 'tra-la-la' print(c.f) Точно так же фабрика создания объектов путём клонирования вложенного пространства имён. Точно так же атрибуты и методы у каждого экземпляра. И всё это живёт столько, сколько родина прикажет.
Про сборщик мусора ответ слишком простой, еще бы неплохо было рассказать про разрешение циклических ссылок. Про дикты - хеш таблицы и коллизии. Кстати интересный вопрос, который я спрашиваю на собесах, и самое интересное мало кто знает. Какая есть встроенная структура данных, аналогичная словарю.
@@borismish3017 спасибо за ответ, погуглил, значениями множества могут быть только хешируемые типы данных, а у словаря -- изменяемыми. Странно конечно.
@borismish3017 set - это словарь, у которого ключи и есть значения множества, а значения этих ключей - это один и тот же фиктивный объект (просто экземпляр object), который вообще не используется. Как раз это и объясняет почему значениями множества могут быть только хешируемые типы, т.к. это по сути ключи внутреннего словаря и так реализуется уникальность элементов в set, а у самого словаря значениями могут быть уже любые типы
35:06 - достать элемент по индексу из dict в python, чего Б....???? Может по ключу?! 35:19 - получение элемента по индексу в list - O(1), а вот поиск по List'y - O(n). А упоминать коллизию и etc. Лучше не смотреть полностью, а то с ума сойду.
Крутой чувак базу выдает. Лол меня всегда умиляют разные "разработчики" которые выбрали узконаправленный легчайший кал для изучения, аля руби, джс, тд, и тявкают на питон. Джил ко-ко-ко, управление памятью куд-ку-дах. Дохера веб-макаки треды открывают в своем браузере на джаваскрипте, или менеджерят память побитно на руби. Это как терпила которого все всегда унижали, придет и с нифига начнет на тебя гнать, чтобы самоутвердиться.
Так получилось что видео начал смотреть не с начала, а с 13 минуты...и как получается что у tuple нельзя сделать срез? точно также делается как у списка. кортежы быстрее, под них выделяется меньше памяти. дальше смотреть не стал, сорян.
Смысл ответа в том, что ты не можешь взять полкортежа в отличии от половины списка. Половина списка будет реально срезом списка, а "половина" тупла будет новым туплом.
Половина коментов в стиле: "Эээ..у кортежа можно брать срез, ты че дядь!?". Технически можно, как у любой последовательности, но в промышленном коде так никто не делает...вот и оговорился человек, у которого опыта больше, чем многим комментаторам лет отроду)
Вы меня, конечно, извините, и кто я такой что бы Александру как человеку с многолетним опытом рассказывать как правильно. Но есть путаница в терминологии. Пайтон он же и есть со СТРОГОЙ типизацией, просто она ДИНАМИЧЕСКАЯ
Строгая типизация не для тебя, она под капотом происходит и как и многое другое в питоне, так что расслабь булки никто не поругает если просто скажешь что у питона динамическая типизация
Как же круто и понятно он всё объясняет
13:20 "кортеж отличается от списка тем, что из него невозможно сделать срез"
Штопрастити?...
>>> tpl = (1, 2, 3, 4, 5, 'a', 'b')
>>> tpl_2 = tpl[2:6]
>>> tpl_2
(3, 4, 5, 'a')
Хоть обсрезайся до посинения. Хоть скобками, хоть слайсом. Тем более что даже из списка срез не "берётся", а КОПИРУЕТСЯ, "в чём отличие, брат? В правде или в дЕньгах?.." Равно как и из строки. Срез всегда только копируется и никак иначе это не происходит.
"А ты точно сантехник?.." Шо-то синьор из своего поднебесья уже вообще на земле мышей не ловит. Вот для того, уважаемые радиослушатели, и нужны джуниоры. И будут нужны. Потому что эти прокачанные и просветлённые, по их же словам, "уже не всё из основ помнят", а делать это тем не менее как требовалось, так и будет требоваться. И никакой GPT в этом не поможет, проверял уже раз 50, нафиг, нафиг, этот придурок даже сам на лету придумывает несуществующие "библиотеки", из которых якобы берёт команды, а в двух постах подряд сам себе противоречит на все 100% и оба раза неправильно.
Ну и кому не лень, измерьте скорость линейного считывания данных (кортеж быстрее почти в полтора раза) и поиск индекса по значению/значения по индексу (список быстрее процентов на 20-30), особенно на коллекциях длиной в миллионы и состоящих из разных типов данных. Разница между ними есть, и немалая, для разных задач есть свой оптимальный выбор.
Про функции вас здесь откровенно дурят. Да, это изолированный осмысленный блок кода. Как и класс. Как и файл. Как и модуль. Но такое определение верно только до первого вызова. С этого момента функция -- ПРОСТРАНСТВО ИМЁН, она инициировалась, оживила весь свой внутренний механизм и в таком виде висит в памяти не "до выдачи результата", а до самого окончания работы кода либо пока её принудительно не удалить командой del. И все последующие обращения происходят уже не к коду "строка за строкой", а именно к этому пространству, это уже самостоятельная сущность, как и любая встроенная питоновская команда.
Играйтесь:
import inspect
def dec(color=7, /):
def layer(fnc):
def inner(*args, **kwargs):
res = fnc(*args, **kwargs)
for x in (s for s in dir(res)):
xx = getattr(res, x)
if callable(xx) and inspect.isfunction(xx):
inner.cnt += 1
print(f"{inner.cnt} {x = }")
setattr(res, x,\
lambda xx=xx: f"\033[1;3;3{color}m{xx()}\033[0m")
print(f"{res.__name__!a}")
return res
inner.cnt = 0
print("starting inner:", fnc.__name__)
return inner
print("starting layer")
return layer
@dec(2)
def outer(a):
def inner_1():
def self():
return f"Value: {a}"
def isiter():
if "__iter__" in dir(a):
try:
return f"{len(a) = }"
except TypeError:
return f"{type(a)} is iterable but has no len"
return f"{a} is not iterable"
inner_1.self = self
inner_1.isiter = isiter
inner_1()
return inner_1
c = outer(4)
d = outer(range(7))
e = outer((x for x in "abcd"))
print(c.self())
print(c.isiter())
print(d.self())
print(d.isiter())
print(e.self())
print(e.isiter())
c.f = 'tra-la-la'
print(c.f)
Точно так же фабрика создания объектов путём клонирования вложенного пространства имён. Точно так же атрибуты и методы у каждого экземпляра. И всё это живёт столько, сколько родина прикажет.
У кортежей можно брать срезы. Как и строк (строки тоже неизменяемый тип данных). Просто срез возвращает новый объект
Классный гость :), наверное один из самых сдержанных у вас на канале.
Спасибо большое!)
крутой гость, интересно рассказывает и доходчиво.
Спасибо за качественные и лаконичные ответы!
и вам спасибо)
Спасибо за полезную информацию!
И вам спасибо за фидбек
Зачем кортежи обидели, кортежи могут быть ключами словарей и быть внутри множества, а список ни того ни другого не может (это про гибкость)
Возможно не пользуется вот и забыл
Изучаю Python, было интересно послушать .
Спасибо)
Наш человек)
В смысле "у кортежа нельзя взять срез"? И у строки, и у кортежа можно взять срез. В чем проблема?
Very nice 😅
Про сборщик мусора ответ слишком простой, еще бы неплохо было рассказать про разрешение циклических ссылок. Про дикты - хеш таблицы и коллизии. Кстати интересный вопрос, который я спрашиваю на собесах, и самое интересное мало кто знает. Какая есть встроенная структура данных, аналогичная словарю.
И какая же это структура данных? Не нашел в документации
@@ВладиславБаранов-с2р set - это по сути словарь, но у которого ключи последовательность чисел от 0
@@borismish3017 спасибо за ответ, погуглил, значениями множества могут быть только хешируемые типы данных, а у словаря -- изменяемыми. Странно конечно.
@borismish3017 set - это словарь, у которого ключи и есть значения множества, а значения этих ключей - это один и тот же фиктивный объект (просто экземпляр object), который вообще не используется. Как раз это и объясняет почему значениями множества могут быть только хешируемые типы, т.к. это по сути ключи внутреннего словаря и так реализуется уникальность элементов в set, а у самого словаря значениями могут быть уже любые типы
35:06 - достать элемент по индексу из dict в python, чего Б....???? Может по ключу?!
35:19 - получение элемента по индексу в list - O(1), а вот поиск по List'y - O(n).
А упоминать коллизию и etc.
Лучше не смотреть полностью, а то с ума сойду.
Всё правильно, ато разобьёшь свой хрупкий мозг и растеряешь последние мозги
@@How_is-x5b Это оскорбление в мой адрес или что? sorry
Судя по таймкодам ты уже практически все просмотрел 😂
То есть на джуна проходит?
Крутой чувак базу выдает. Лол меня всегда умиляют разные "разработчики" которые выбрали узконаправленный легчайший кал для изучения, аля руби, джс, тд, и тявкают на питон.
Джил ко-ко-ко, управление памятью куд-ку-дах. Дохера веб-макаки треды открывают в своем браузере на джаваскрипте, или менеджерят память побитно на руби. Это как терпила которого все всегда унижали, придет и с нифига начнет на тебя гнать, чтобы самоутвердиться.
Так получилось что видео начал смотреть не с начала, а с 13 минуты...и как получается что у tuple нельзя сделать срез? точно также делается как у списка. кортежы быстрее, под них выделяется меньше памяти. дальше смотреть не стал, сорян.
Было сказано, что под кортежи быстрее
Смысл ответа в том, что ты не можешь взять полкортежа в отличии от половины списка. Половина списка будет реально срезом списка, а "половина" тупла будет новым туплом.
@@MyFearIsMyBlue что значит "реально срезом списка"? срезы всегда возвращают новый объект, неважно срез чего вы делаете.
Ну и иди отсюда, всем плевать
Уже подозрительно,что ты с 13 минуты залип😂
Половина коментов в стиле: "Эээ..у кортежа можно брать срез, ты че дядь!?".
Технически можно, как у любой последовательности, но в промышленном коде так никто не делает...вот и оговорился человек, у которого опыта больше, чем многим комментаторам лет отроду)
пистолет с глушителем)))
признавайтесь тоже проходили курс по python для профессионалов на stepik?
Если бы из ролка вырезали все цитаты персонажа справа - было бы на много лучше. В остальном ролик понравился
извините, "персонаж" справа пока останется. придется терпеть)
Вы меня, конечно, извините, и кто я такой что бы Александру как человеку с многолетним опытом рассказывать как правильно. Но есть путаница в терминологии. Пайтон он же и есть со СТРОГОЙ типизацией, просто она ДИНАМИЧЕСКАЯ
Спасибо за замечание! Принимаем все)
Строгая типизация не для тебя, она под капотом происходит и как и многое другое в питоне, так что расслабь булки никто не поругает если просто скажешь что у питона динамическая типизация
когда будет такое видео только по c# c Пашей Львовом ?
Есть уже 2 на канале. Пока в процессе подготовки контента)