Пролог

Сейчас IT - очень востребованная сфера: спрос на специалистов огромный, в индустрию ежедневно «входят» новые джуны. А это значит, что и конкуренция за место под солнцем среди начинающих программистов/аналитиков накаливается с каждым днем.

Что же делать в такой ситуации? Правильно - использовать любую возможность, чтобы немного подкачаться. Так как информации масса и в голове возникает мешанина, хороший способ - порешать несложные задачки и поразбирать вопросы. Это удобно - пока едешь в метро, можно решить пару-тройку задачек и немного привести в порядок свои знания. 

Мы уже больше года выкладываем в своих соцсетях (ВКонтакте, Телеграм, Инстаграм) задачи разной сложности по программированию и смежным темам: Python, SQL, Data Science, Git, аналитике и другим темам. Для этого у нас даже есть специальная рубрика - GROK IT. Узнать ее можно по нашей фирменной утке :)

Так вот, за все это время мы неоднократно сталкивались с такими мыслями, когда планировали очередную задачу: «Ну нет, это слишком легко, люди от нас просто отпишутся за такие плевые задачи». Однако, все оказалось иначе.

Мы собрали для Вас 10 интересных мини-задачек по Python и SQL, которые кажутся очень простыми, но подавляющее большинство опрошенных дали неправильные ответы. Вот такая вот статистика ¯\_(ツ)_/¯

Пару слов о нас :) Мы команда IT Resume и мы пилим крутую платформу для подготовки к техническим собеседованиям и развитию своих навыков. Скоро будет первый релиз, так что ждем вас в гости ;)

А пока подписывайтесь на наши соцсети, туда мы постим интересный и полезный контент по программированию, Data Science и аналитике. 

На любой вкус: ВКонтакте - Телеграм - Инстаграм

Итак, давайте наконец перейдем к задачам. Погнали :)

Задача 1. Метод extend в Python

Формулировка: 

# Дан список l. Что выведет код?   

l = [1, 2, 3]
l.extend('abc')
print(l)

Варианты ответов:

[1, 2, 3, 'abc']
[1, 2, 3]
Error
[1, 2, 3, 'a', 'b', 'c']

Правильных голосов: 36%, неправильных - 64%.

Мы были очень удивлены - казалось бы, extend - стандартный списковый метод в Python. Ан нет - у подавляющего большинства он вызвал затруднение.

Правильный ответ:

[1, 2, 3, 'a', 'b', 'c']

Подробный разбор задачи здесь.

Кстати, еще больше задач мы публикуем в наших закрытых чатах ВКонтакте и Телеграме. Будем рады видеть вас там и решать задачки вместе! :)

Задача 2. Кортеж с одним элементом

Формулировка:

# Что выведет код? 

for i in (3):
	print(i)

Варианты ответов:

1, 2, 3
3
(3)
Error

Правильных голосов: 33%, неправильных - 67%.

В целом, мы предполагали, что многие попадутся в эту ловушку. Но в итоге на нее попались даже больше людей, чем мы думали - сотни человек!

Правильный ответ:

Error

Подробный разбор задачи здесь.

Задача 3. Фигурные скобки в f-строках

Формулировка:

# Что выведет код? 

print(f'Curly brackets: {}')

Варианты ответов:

Curly brackets: {}
Curly brackets: 
Ошибку
Ни один из вариантов

Правильных ответов - 22%, неправильных - 78%.

Здесь мы тоже думали, честно говоря, что ответ прям очевиден: f-строки это же ведь совсем базовый Python. Но мы снова были не правы.

Правильный ответ

Ошибку

Подробный разбор задачи здесь.

Задача 4. DELETE + CTE в SQL

Формулировка:

-- Дана таблица Demo. 
-- Как изменится таблица после выполнения запроса в PostgreSQL? 

WITH temp_tab AS (
	DELETE FROM Demo
)
INSERT INTO Demo
SELECT * FROM temp_tab 

Варианты ответов:

Никак, т.к. INSERT вставит удаленные строки
Никак, т.к. запрос не выполнится
Станет пустой, т.к. DELETE ничего не возвращает и вставлять нечего
Никак, т.е. INSERT нельзя использовать с CTE

Правильных ответов: 28%, неправильных - 72%.

В отличие от предыдущих задач, тут мы предполагали, что людей ожидает некая засада :) Все-таки не все знают про CTE, RETURNING и так далее. Собственно, так и получилось. Но зато многие теперь познакомились с новой конструкцией SQL.

Правильный ответ

Никак, т.к. запрос не выполнится.

Подробный разбор задачи здесь.

Кстати, вот здесь мы подробно объясняем, как и зачем использовать Common Table Expressions. В том числе и про DELETE.

Задача 5. Хитрый оператор AND в Python

Формулировка:

# Что выведет код? 

print(50 and 100)

Варианты ответов:

50 100
50
100
Ни один из этих вариантов

Правильных ответов - 13%, неправильных - 87%.

Статистика говорит сама за себя. Это тот случай, когда вдруг забываешь, в какой руке держать вилку. Вроде все очевидно - 2 числа и оператор AND. А что получится в итоге - не понимаешь. И никто почти не понимает.

Правильный ответ

100

Подробный разбор задачи здесь.

Задача 6. Shrug face и escape-последовательности в Python

Формулировка:

# Что выведет код? 

print('¯\\_(ツ)_//¯')

Варианты ответов:

'¯\\_(ツ)_//¯'
'¯\_(ツ)_//¯'
'¯\\_(ツ)_/¯'
Ничего из перечисленного

Правильных ответов - 28%, неправильных - 72%.

Конечно, эту задачку мы разместили смеха ради, потому что все любят каомодзи :) Но на самом деле такая ситуация встретилась у нас при разработке платформы - мы хотели передавать shrug face в качестве строки и наткнулись на интересные эффекты экранирования. Так что вполне себе бизнесовая задачка!

Правильный ответ

 '¯\_(ツ)_//¯’

Подробный разбор задачи здесь.

Задача 7. Удаление таблицы SQL

Формулировка:

Какой запрос отработает без ошибок в PostgreSQL?

Варианты ответов:

DELETE * FROM Demo;
DELETE FROM Demo;
TRUNCATE TABLE Demo;
TRUNCATE * FROM Demo;

Правильных ответов - 28%, неправильных - 72%.

Это еще один вопрос из серии «Какой рукой я держу вилку?». Из-за того, что некоторые операции делаешь на автомате, не зацикливаешься - а как же правильно, и такие задачи могут ввести в ступор. Да и чего уж там - многие в целом не знают, как удалять таблицу и в чем разница между DELETE и TRUNCATE. 

Правильный ответ

DELETE FROM Demo. Неочевидно, но проверьте :)

Подробный разбор задачи здесь.

Задача 8. Добавление элементов в set

Формулировка:

# Что выведет код? 

set1 = {1, 2, 3}
set2 = set1.add(4)

print(set2)

Варианты ответов:

{1, 2, 3, 4}
True
None
Error

Правильных ответов: 16%, неправильных - 84%.

Стандартные методы списков, множеств, словарей и т.д. в Python устроены, пожалуй, не до конца очевидно. В том плане, что какие-то методы возвращают значения, какие-то не возвращают ничего. Каждый раз в этом путаешься и метод add - яркий пример.

Правильный ответ

None

Подробный разбор задачи здесь.

Кстати, недавно мы делали подборку 5 методов множеств, которые обязательно нужно знать. Не забудьте проверить себя ;)

Задача 9. Комбинирование условий сравнения в Python

Формулировка:

# Что выведет код? 

print(11 > 0 is True)

Варианты ответов:

True
False
Error

Правильных ответов - 10%, неправильных - 90%.

Ну это задача совсем неочевидная. Python хоть и проповедует прозрачность, но эта конструкция прям совсем не прозрачная, как нам кажется (:

Правильный ответ

False

Подробный разбор задачи здесь.

Задача 10. Импорт библиотек по PEP8

Формулировка:

# Сколько правил PEP8 нарушено при таком импорте библиотек?

import face_recognition
import sys, os
import mymodule # пользовательский скрипт
from subprocess import Popen, PIPE

Варианты ответов:

1
2
3
4

Правильных ответов - 25%, неправильных - 75%.

Одно дело писать код, а другое - писать код правильно. И делают это далеко не все, хотя по факту это очень важно: через год читать грязный код просто невозможно - порой проще его просто переписать. PEP8 в Python, пожалуй, базовое руководство по этому поводу. Но оказывается, почти никто его не знает :)

Правильный ответ

3

Подробный разбор задачи здесь.

К слову, по этому поводу мы весной делали целый Style Guide кода на Python - очень рекомендуем посмотреть :)

Почти эпилог

Согласитесь, все эти 10 задачек кажутся очень легкими на первый взгляд. Но когда начинаешь разбираться чуть глубже, понимаешь, что зачастую твои знания не так уж и крепки :) Даже матерый профи может оплошать на некоторых заданиях - не потому что с ним что-то не так, а потому что некоторые вещи настолько уже доведены до автоматизма, что даже не зацикливаешься на мелочах. 

Кстати, в чатах ВКонтакте и Телеграме мы стараемся подробно отвечать на все решения, которые вы присылаете, так что с радостью ждем вас! :) И впереди у нас еще много задачек по программированию, Data Science и аналитике.

Эпилог

А в качестве заключения, вот вам еще одна задачка по Python. Посмотрим, сможете ли Вы ее решить ;)

Формулировка:

Дан Pandas-датафрейм df, заполненный числами: 

+----------+----------+----------+
|   col1   |   col2   |   col3   |
+----------+----------+----------+

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

Присылайте свои решения в чаты - там и узнаете правильный ответ! Будем ждать ;)


P.S. Если для кого-то эти задачки показались слишком легкими или «нежизненными», то мы на это и не претендуем :) Наши задачки помогают людям немного прокачивать свое знание тонкостей языка в игровой форме и обращать внимание на мелочи, которые в повседневной суровой жизни выпадают из виду. Выкатывать целые комбайны в продакшен мы не учим, но le bon Dieu est dans le détail, как говорится ;-)

Комментарии (31)


  1. ScreamPassion
    09.11.2021 17:29
    +1

    Интересное конечно голосование, а если я знаю sql и при этом не практикую python?)

    Может быть стоит разделить голосование на отдельно sql отдельно python ?


  1. n0isy
    09.11.2021 17:30
    +11

    Задача 7. DELETE FROM ок, и TRUNCATE TABLE тоже ок:

    TRUNCATE TABLE test;
    [2021-11-09 17:28:37] completed in 170 ms

    Обе команды при этом не являются "удалением таблицы", а являются удалением ИЗ таблицы. С рядом различий между собой.

    Питона не знаю, но задача 9 наоборот, показалась самая лёгкая (так как в задаче 5 было пояснено, что and оператор логический, а не бинарный)


    1. Melkij
      09.11.2021 17:47
      +4

      Совершенно верно, «TRUNCATE TABLE test;» это SQL:2008 стандартный синтаксис. Для postgresql слово TABLE здесь опционально, но это полностью корректный вариант записи.

      При том, будет совсем другой разговор, если таблица действительно названа именно Demo, а не demo. В этом случае все приведённые запросы будут ошибочны, т.к. необходимо писать TRUNCATE TABLE «Demo»;


  1. Anastasia_K
    09.11.2021 17:32
    +4

    print('Curly brackets: {}')

    а Вы тут f не пропустили?)

    # Что выведет код? 
    
    print(11 > 0 and True)


    Правильный ответ

    False



    ¯\_(ツ)_/¯


    1. ArsenAbakarov
      09.11.2021 17:42

      Как с языка сняли, сложное if условие проверил специально в 3.7 и 3.9, и везде True


    1. ss-nopol
      09.11.2021 17:50

      Имелось в виду

      print(11 > 0 is True)

      причём в третьем питоне выдаёт ещё и синтаксическое предупреждение


      1. Anastasia_K
        09.11.2021 17:52
        +9

        второй уровень сложности: не только правильно отвечать на задачи, но и исправлять сами задачи, чтоб ответ автора стал бы правильным!)


        1. ITResume Автор
          09.11.2021 18:22

          А это чтобы интересней было) пофиксили)))) Спасибо за внимательность!


  1. SergeiMinaev
    09.11.2021 17:43

    Задача 1. Метод extend в Python

    IMHO, в extend не очень соблюдается питоновский принцип "явное лучше неявного". Потому что фиг догадаешься, что добавится в этих случаях:

    l.extend({'K':'V'})
    
    l.extend({'key':'value'})
    
    l.extend(['value'])
    
    l.extend('value')
    
    l.extend(('qwe',))
    
    l.extend(('qwe'))

    Задача 9. Комбинирование условий сравнения в Python

    У вас тут в коде должно быть is или == вместо and. Но сама задача вообще не очевидная, никогда ды не догадался.


    1. ArsenAbakarov
      09.11.2021 17:47

      да, особенно плачевно все с кортежами и запятой


    1. SergeiMinaev
      09.11.2021 18:50

      Ещё к задаче №9, тоже забавно и (совсем чуть-чуть) попахивает JS-ом :)

      3 > 0 == True
      3 > 1 == True
      3 > 2 == True


    1. unsignedchar
      09.11.2021 20:32

      Когда смешивают разные типы данных - это всегда подвох. Девочка_и_JavaScript.jpg есть и в питоне ;)


  1. Vadimio
    09.11.2021 17:45
    +2

    По-моему здесь: print('Curly brackets: {}') будет все-таки первый вариант

    Curly brackets: {}


    1. emkh
      10.11.2021 14:14

      Там была ошибка - похоже копировали на скорую руку)


  1. rafuck
    09.11.2021 17:45
    +1

    В задаче 9 ошибка, предлагаю вам найти ее самостоятельно.
    Я всегда буду обновлять комментарии…


  1. GennPen
    09.11.2021 17:48
    +4

    Публиковали бы развернутые ответы под спойлером. А то ВК не дает картинки смотреть без регистрации.


  1. TheGodfather
    09.11.2021 18:55
    +11

    Как-то у вас очень biased комментарии. Ну вообще-то нет, не так:

    Мы были очень удивлены — казалось бы, extend — стандартный списковый метод в Python. Ан нет — у подавляющего большинства он вызвал затруднение.

    Стандартный, только вот программисту по рукам надо бить, если он в здравом уме пишет конструкции типа предложенных. И в ответе на задачку не сколько знание языка, сколько зазубривание всяких undefined behavior и неочевидностей, на которые в реальном коде никогда не наткнешься.
    Здесь мы тоже думали, честно говоря, что ответ прям очевиден: f-строки это же ведь совсем базовый Python. Но мы снова были не правы.



    2021, конечно, но все-таки f-строки появились-то буквально недавно, в 3.6, который вышел в 2017, на секундочку. Может, у вас конечно все на bleeding edge живут, но вот у нас до сих пор местами встречаются индивиды, которые на 2.7 пишут, как их по рукам не бей. Хотя сейчас уже скорее исключения, но есть. А вы тут про новые модные фичи спрашиваете, да и подаете как «базовые».
    Вроде все очевидно — 2 числа и оператор AND. А что получится в итоге — не понимаешь. И никто почти не понимает.

    Простите, как очевидно? Это также, как в первой задаче — по рукам бить такого программиста надо, а не вникать в такие странные конструкции. Но серьезно — что очевидно-то? Возможно, если бы там какое-нибудь побитовое AND было на сях, еще можно было бы сказать, что «очевидно». Но явно не в питоне. Тут за такое по рукам бить мало.

    # Сколько правил PEP8 нарушено при таком импорте библиотек?


    Это вообще за гранью, разработчику делать больше нечего, что ли? Ладно вы бы бинарно спросили «нарушает ли пеп8», там хоть понятно. А тут, ну блин, я не знаю, как у вас процесс разработки устроен, но обычно такие сервисные штуки напишут как-нибудь, потом просто нажмут какой-нибудь Ctrl+Shift+F или Alt+Shift+L или пре-коммит запустят, что там у вас в проекте и оно все отформатируется как надо. Достаточно ихмо ответа «да чот кажется не очень, пользовательские либы вперемешку со стандартными, надо поменять местами и пустую строчку добавить».

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


    Неа, не согласимся. И уж тем более ни одна из предложенных «задач» не отражает ни опыта ни знаний языка. Максимум, отражает то, насколько кандидат ботал какие-то undefined вещи. Если бы я был собеседующим, вынужденным задавать такие вопросы, то, думаю, я бы сразу сделал оффер кандидату, если бы ответ\реакция был «что за отстой, давайте перепишем нормально и не будем задавать такие тупые вопросы».


    1. SergeiMinaev
      09.11.2021 20:55
      +3

      по рукам надо бить

      по рукам бить такого

      по рукам бить мало

      Злой вы :)


      1. SaM1808
        10.11.2021 09:25

        Ну теперь понятно откуда "безрукие" программисты. Отбили...


      1. vladshulkevich
        22.11.2021 09:29

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


  1. RC_Cat
    09.11.2021 19:39

    То чувство когда UB есть не только лишь в C/C++


    1. unsignedchar
      09.11.2021 20:35
      +1

      Только не undefined, а unobviously. ;)


  1. Andy_U
    09.11.2021 20:22

    В задаче 6 - правильный ответ - ничего из перечисленного, потому что кавычки выведены не будут!


  1. Andy_U
    09.11.2021 20:36
    +1

    В задаче 9 3.10 вот что мне вывел:

    C:\>py
    Python 3.10.0 (tags/v3.10.0:b494f59, Oct  4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print(11 > 0 is True)
    <stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
    False
    >>>


  1. TyVik
    09.11.2021 20:40
    +6

    Когда мне на собеседовании задают такие вопросы, то я спрашиваю в ответ "а зачем писать код, который вызывает затруднения?". Ради спортивного интереса, конечно, прикольно, но в проде я бы такое и сам не писал, и на ревью не пропустил. "Встретив двусмысленность, отбрось искушение угадать."


    1. ScarferNV
      10.11.2021 11:22
      +2

      Как правило такие работодатели на самом деле понятия не имеют кто им нужен, бежать от таких надо.


      1. unsignedchar
        10.11.2021 11:50
        +1

        Собеседование это не экзамен на знание неочевидных особенностей. Кандидат увидел неправильность и заявил об этом - хорошо, он будет избегать подобных вещей. Смог правильно решить ребус - тоже хорошо, значит разбирается в теме.


        1. onegreyonewhite
          11.11.2021 02:21

          Смог правильно решить ребус - тоже хорошо, значит разбирается в теме.

          Не факт... Может просто читает на хабре такие статьи и ходит на курсы.


          1. unsignedchar
            11.11.2021 11:31

            Может просто читает на хабре такие статьи и ходит на курсы.

            Интересуется этой темой и пытается развиваться в этом направлении. Тем более надо брать ;)


          1. AMaxKaluga
            11.11.2021 13:02

            я наверно неправильный, но при знакомстве с новым языком после первичного изучения синтаксиса и логических принципов/особенностей стараюсь найти статьи с описанием правильного стиля и таких неоднозначных "подлянок".

            а на собеседовании такие вопросы чисто джастфофан на сообразительность и понимание особенностей


  1. kx13
    13.11.2021 19:47

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

    Потомучто ваши задачки для очень опытных разработчиков. Своей короткой формулировкой они просто вводят в заблуждение.

    Поскольку в задачках формулируются очень необычные случаи, то для из решения очень хорошо надо разбираться в языке.

    Я бы такие задачи задавал на собеседования для Senior разрабочиков, чтобы узнать насколько человек разбирается в языке и не будет подобные штуки писать в реальном коде :)

    А на практике когда непонятно как работает какая-то короткая конструкция, запускаешь консоль и там проверяешь. Опциально можно разобраться почему вывод именно такой.