Хочешь уверенно проходить IT-интервью?

Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.
💡 Почему Т1 тренажёр — это мастхэв?
- Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше
- Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
- Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.
Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!
Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy
1. Распаковка кортежа + Распаковка кортежа с *
person = ['bob', 30, 'male']
name, age, gender = person
# name='bob, age=30, gender='male'
Мы можем использовать распаковку кортежей для одновременного назначения нескольких переменных.
fruits = ['apple', 'orange', 'pear', 'pineapple', 'durian', 'banana']
first, second, *others = fruits
# first='apple', second='orange'
# others = ['pear', 'pineapple', 'durian', 'banana']
Мы можем добавить *
перед переменными, чтобы распаковать все остальное в эту переменную.
2. Генератор списка + понимание генератора словарей/множеств
lis = [expression for i in iterable if condition]
l1 = [i for i in range(1,4)] # [1,2,3]
l2 = [i*2 for i in range(1,4)] # [2,4,6]
l3 = [i**2 for i in range(1,4)] # [1,4,9]
l4 = [i for i in range(1,4) if i%2==1] # [1,3]
С генератором списка мы можем создать собственный список в одной строке кода.
set1 = {i for i in range(1,4)} # {1,2,3}
d1 = {i:i**2 for i in range(1,4)} # {1:1, 2:4, 3:9}
Генератор множества и генератор словаря можно использовать для создания множеств и словарей так же, как мы создаем списки, используя генератор списков.
3. Тернарный оператор
score = 57
if score > 90:
grade = 'A*'
elif score > 50:
grade = 'pass'
else:
grade = 'fail'
# grade = 'pass'
Обычный блок if-elif-else
.
score = 57
grade = 'A*' if score>90 else 'pass' if score>50 else 'fail'
# grade = 'pass'
Мы можем сжать блок if-elif-else
в ОДНУ строку, используя тернарный оператор.
4. Магические методы в классах Python
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Dog(name={self.name}, age={self.age})'
def __gt__(self, otherDog):
return self.age > otherDog.age
__ init __
, __str__
и __ gt __
являются магическими методами, которые позволяют нам работать по-особенному с нашими объектами Dog
.
dog = Dog('rocky', 4)
print(dog) # Dog(name=rocky, age=4)
Магический метод __str__
определяет, что возвращается, когда мы вызываем str(dog)
, который вызывается, когда мы печатаем объекты Dog
.
dog1 = Dog('rocky', 4)
dog2 = Dog('fifi', 2)
print(dog1 > dog2) # True
Магический метод __ gt __
определяет, что происходит, когда мы сравниваем двух собак с помощью оператора >
.
5. * *args и **kwargs
def test(a, b, *args):
print(f'{a=} {b=} {args=}')
test(1,2,3,4,5) # a=1 b=2 args=(3,4,5)
*args
позволяют нашим функциям принимать любое количество позиционных аргументов (которые будут храниться в кортеже args
).
def test(a, b, **kwargs):
print(f'{a=} {b=} {kwargs=}')
test(a=1, b=2, c=3, d=4) # a=1 b=2 kwargs={'c': 3, 'd': 4}
**kwargs
позволяют нашим функциям принимать любое количество аргументов ключевого слова (которые будут храниться в словаре kwargs
).
6. Работа с несколькими .py файлами
# helper.py
def test123():
print('test123 is called')
# main.py
from helper import test123
test123() # test123 is called
Когда вы получите работу инженера-программиста, вы будете работать над проектами со множеством разных файлов. Обязательно заранее ознакомьтесь с тем, как импортировать функции из других файлов.
7. if __name__ == ‘__main__’
# helper.py
def test123():
print('test123 is called')
if __name__ == '__main__':
# this line only runs if we run helper.py DIRECTLY
print('print statement from helper.py')
# main.py
from helper import *
test123() # test123 is called
Строка if __name__ == '__main__'
оценивается как True
в файле .py
, только если мы запустим файл .py
файл напрямую. Мы используем эту строку, чтобы случайно не запустить строки кода, которые мы не собираемся запускать.
8. True и False значения
# 0, если falsy, и оценивается как False
if 0: print('this wont print')
# ненулевые числа truthy и оцениваются как True
if 1: print('this prints')
if 2: print('this prints')
if 100: print('this prints')
if -1: print('this prints')
if 3.14: print('this prints')
# пустые последовательности являются falsy и оцениваются как False
if '': print('this wont print')
if []: print('this wont print')
if {}: print('this wont print')
if set(): print('this wont print')
# непустые последовательности являются truthy и оцениваются как True
if 'a': print('this prints')
if [1]: print('this prints')
if {2:3}: print('this prints')
if {1,2}: print('this prints')
# None является falsy и оценивается как False
obj = None
if obj: print('this wont print')
# объекты являются truthy и оцениваются как True
obj = Dog()
if obj: print('this prints')
9. break vs continue vs pass
for i in [1,2,3,4,5]:
if i == 3:
break
print(i)
# this prints 1 and 2
break
полностью останавливает цикл for/while
. Никакой другой итерации не происходит.
for i in [1,2,3,4,5]:
if i == 3:
continue
print(i)
# this prints 1, 2, 4 and 5
continue
пропускает ОДНУ итерацию. Другие итерации все еще происходят позже.
for i in [1,2,3,4,5]:
if i == 3:
pass
print(i)
# this prints 1, 2, 3, 4 and 5
pass
абсолютно ничего не делает.
10. Блоки try, except, finally
try:
# код, в котором потенциально могут быть вызваны исключения
except:
# этот блок выполняется, если в блоке try возникает исключение
finally:
# вещи здесь будут выполняться ВСЕГДА
Блоки try-except-finally
позволяют нам обрабатывать вещи, когда в нашем коде возникают ошибки и исключения (вместо просто сбоя)
11. Библиотеки построения веб-API Python
Если вы намерены стать инженером-программистом, скорее всего, вам нужно хорошо это знать. Я узнал об этом довольно поздно и хотел бы, чтобы я столкнулся с этим намного раньше в своем путешествии по программированию.
Некоторые простые в освоении библиотеки на Python:
- Python FastAPI – это позволяет нам очень легко создавать API.
- Python Flask – мы также можем создавать API с помощью Flask и даже простые веб-приложения.
12. Декораторы
Я узнал об этом ОЧЕНЬ поздно на своем пути развития в Python и игнорировал любой синтаксис @decorator
, который я видел. Но лучше понимать, что происходит в вашем коде.
def add_exclamation_mark(your_function):
def inner(*args, **kwargs):
return your_function(*args, **kwargs)
return inner
@add_exclamation_mark
def greet(name):
return f'hello {name}'
Декораторы – это функции, которые: 1) принимают другую функцию, 2) настраивают работу функции и 3) возвращают другую функцию. Когда мы помещаем @add_exclamation_mark
над функцией greet
, мы фактически декорируем функцию greet
и меняем ее работу.
# @add_exclamation_mark
# def greet(name)
#
# ^ THIS IS THE SAME AS BELOW:
#
# greet = add_exclamation_mark(greet)
print(greet('tim')) # hello tim!
Что происходит, когда мы вызываем декорированную функцию greet
. Из-за нашего декоратора наша функция greet
ведет себя по-другому, и теперь у нее есть дополнительный !
после возвращаемого значения.
13. Генераторы + ключевое слово «yield»
def simple_generator():
yield 'apple'
yield 'orange'
yield 'pear'
for fruit in simple_generator():
print(fruit)
# apple orange pear
Ключевое слово yield
похоже на ключевое слово return
. За исключением того, что функция не останавливается полностью после чего-то.
Функция, содержащая ключевое слово yield
, становится функцией-генератором и может иметь несколько выходных данных.
14. Цепочка методов
На самом деле я узнал об этом намного позже, чем должен был.
s = ' APPLE ORANGE PEAR '
s = s.strip() # s is now 'APPLE ORANGE PEAR'
s = s.lower() # s is now 'apple orange pear'
s = s.split() # s is now ['apple', 'orange', 'pear']
Некоторый общий код для очистки строки.
s = ' APPLE ORANGE PEAR '
s = s.strip().lower().split()
# s is now ['apple', 'orange', 'pear']
Мы можем объединить несколько методов в одну строку, чтобы сэкономить несколько строк кода.
15. Базовое машинное обучение – регрессия и классификация
Прежде чем я узнал (на базовом уровне), как работает машинное обучение, я думал, что это какая-то магия.
После того, как я узнал, как работает машинное обучение (на базовом уровне), я подумал: «О, хорошо, так это своего рода автоматическая статистика с помощью компьютера». Это больше не было волшебной магией.
Машинное обучение – это огромная область, но обычно мы начинаем с обучения с учителем, точнее, с классификации и регрессии. В качестве стартового набора попробуйте scikit-learn
, библиотеку Python, которая выполняет за вас весь код машинного обучения и позволяет вам просто использовать их функции и классы.
16. Основные структуры данных и алгоритмы
Пройдя бесчисленное количество собеседований по программированию для стажировок и штатных должностей, я понял, насколько важен этот шаг. Большинство, если не все собеседования по кодированию, требовали от интервьюируемого достаточной компетентности в этой области.
К сожалению, я провалил довольно много собеседований по программированию в известных компаниях только потому, что недостаточно практиковался, что, вероятно, стоило мне нескольких отличных стажировок.
Если вы собираетесь на собеседование в ближайшее время или сейчас думаете, что сможете пройти собеседование, потому что вы хороши, – не надо. Улучшьте понимание структур данных и алгоритмов. Послушайте того, кто сделал ту же ошибку много лет назад.
Если устраиваешься кодером – ни один собес не пройдет без них. Кстати, у «Библиотеки программиста» как раз есть курс «Алгоритмы и структуры данных», который помогает подготовиться к алгоритмическому собеседованию в крупные IT-компании.
17. Различные структуры данных и когда их использовать
В Python есть несколько встроенных структур данных.
# упорядоченный набор элементов
list1 = [1,2,3]
# неизменяемый список. мы можем использовать это как ключ словаря
tuple1 = (1,2,3)
# O(1) при доступе к значению с помощью ключа
dict1 = {'apple':4, 'orange':5}
# неупорядоченная коллекция, содержащая только уникальные элементы
# O(1) при проверке существования элемента внутри множества
set1 = {1,2,3}
# неизменяемое множество. мы можем использовать это как ключ dict
frozenset1 = frozenset({1,2,3})
18. Лямбда-функции
В течение долгого времени я видел лямбда-функции, и все было в порядке, я просто игнорировал их. Пока мне не потребовалось некоторое время, чтобы понять их. И узнал, как просто это было на самом деле.
def add(x, y):
return x + y
# this is the same as
add = lambda x,y : x + y
Лямбда-функции – это обычные функции, но написанные с использованием другого синтаксиса. Еще примеры:
def test():
return 'hello'
# this is the same as
test = lambda : 'hello'
def test2(a,b,c,d):
return (a+b) / (c-d)
# this is the same as
test2 = lambda a,b,c,d : (a+b) / (c-d)
19. assert + raise + custom исключения
assert score <= 100
# ensuring that score cannot be above 100.
Ключевое слово assert
позволяет нам провести тест на работоспособность в середине нашего кода. Если оценка > 100, возникает ошибка AssertionError
, и наша программа принудительно завершает работу.
if score > 100:
raise Exception('score cannot be higher than 100')
# ensuring that score cannot be above 100.
Ключевое слово raise
позволяет нам принудительно вызвать исключение (мы также можем настроить сообщение в исключении)
class ScoreException(Exception):
def __init__(self):
super().__init__('score cannot be higher than 100')
if score > 100:
raise ScoreException()
Мы также можем создавать свои собственные типы Exception
, наследуя от класса Exception
.
20. Многопроцессорность в Python
Встроенный модуль multiprocessing
в Python позволяет нам запускать более одной функции одновременно.
import multiprocessing
import time
import datetime
def yourfunction(x):
start = datetime.datetime.now()
time.sleep(1)
end = datetime.datetime.now()
return f'x={x} start at {start}, end at {end}'
if __name__ == '__main__':
with multiprocessing.Pool(processes=3) as pool:
data = pool.map(yourfunction, [1, 2, 3, 4, 5, 6, 7])
for row in data:
print(row)
x=1 start at 2023-04-16 13:39:32.035510, end at 2023-04-16 13:39:33.037308
x=2 start at 2023-04-16 13:39:32.035795, end at 2023-04-16 13:39:33.037324
x=3 start at 2023-04-16 13:39:32.037349, end at 2023-04-16 13:39:33.037629
x=4 start at 2023-04-16 13:39:33.037725, end at 2023-04-16 13:39:34.040135
x=5 start at 2023-04-16 13:39:33.037892, end at 2023-04-16 13:39:34.040160
x=6 start at 2023-04-16 13:39:33.037986, end at 2023-04-16 13:39:34.040161
x=7 start at 2023-04-16 13:39:34.040454, end at 2023-04-16 13:39:35.045383
Здесь мой код выполняет три функции одновременно (каждая по одному работнику)
yourfunction(1)
yourfunction(2)
иyourfunction(3)
выполняются одновременно.yourfunction(4)
yourfunction(5)
иyourfunction(6)
также выполняются одновременно.yourfunction(7)
работает сама по себе
Знаете интересные фишки языка Python? Поделитесь ими в комментариях!