20 Концепций Python, о которых я хотел бы узнать намного раньше
В Python есть много концепций, которые нужно усвоить. И каждый начинающий разработчик делает это по-разному, в разной последовательности. Вот некоторые вещи, которые я хотел бы узнать гораздо раньше, когда я ещё был новичком в Python.
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__
определяет, что происходит, когда мы сравниваем 2 собаки с помощью оператора >
.
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) Истинные и ложные значения
# 0 if falsy, and evaluates to False
if 0: print('this wont print')
# non-zero numbers are truthy, and evaluate to 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')
# empty sequences are falsy, and evaluate to False
if '': print('this wont print')
if []: print('this wont print')
if {}: print('this wont print')
if set(): print('this wont print')
# non-empty sequences are truthy, and evaluate to True
if 'a': print('this prints')
if [1]: print('this prints')
if {2:3}: print('this prints')
if {1,2}: print('this prints')
# None is falsy, and evaluates to False
obj = None
if obj: print('this wont print')
# objects are truthy, and evaluates to 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:
# risky code that could cause exceptions
except:
# this block executes if an exception happens in the try block
finally:
# stuff here will ALWAYS execute
^ блоки try-except-finally
позволяют нам обрабатывать данные, когда в нашем коде происходят ошибки и исключения (вместо простого сбоя)
11) Библиотеки для создания веб-API на Python
Если вы намерены стать инженером-программистом, скорее всего, вам нужно знать этот аспект достаточно хорошо. Я узнал об этом довольно поздно и хотел бы столкнуться с этим гораздо раньше в своём путешествии по миру программирования.
Несколько простых в освоении библиотек на Python:
- Python FastAPI — она позволяет нам очень легко создавать API
- Python Flask — мы также можем создавать API и даже простые веб-приложения с использованием Flask
12) Декораторы
Я узнал об этом ОЧЕНЬ поздно и раньше игнорировал любой синтаксис @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) Базовые структуры данных и алгоритмы
Пройдя бесчисленные собеседования с программистами для прохождения стажировок и работы на полный рабочий день, я понял, насколько важен этот шаг. Большинство, если не все, собеседований по программированию требовали, чтобы опрашиваемый был достаточно компетентен в этой области.
К сожалению, я провалил немало собеседований по программированию в известных компаниях только потому, что недостаточно практиковался, что, вероятно, стоило мне нескольких отличных стажировок.
Если вам предстоит собеседование в ближайшее время и вы думаете, что сможете пройти его, потому что вы хороши, НЕ делайте ЭТОГО. ПОПРАКТИКУЙТЕСЬ в своих структурах данных и алгоритмах. Возьмите это от того, кто совершил ту же ошибку много лет назад.
Чем раньше вы начнёте практиковать эти вопросы для собеседования по программированию, тем лучше у вас получится с ними справиться и тем больше возможностей вы получите.
17) Различные структуры данных и когда их использовать
В Python есть пара встроенных структур данных:
# ordered collection of elements
list1 = [1,2,3]
# an immutable list. we can use this as a dict key
tuple1 = (1,2,3)
# O(1) when accessing a value using a key
dict1 = {'apple':4, 'orange':5}
# unordered collection containing only unique elements
# O(1) when checking if element exists inside a set
set1 = {1,2,3}
# an immutable set. we can use this as a dict key
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, возникает ошибка утверждения, и наша программа принудительно завершает работу.
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
.
20) Многопроцессорность в Python
Встроенный модуль многопроцессорной обработки в Python позволяет нам запускать более 1 функции одновременно (в одно и то же время).
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
Здесь мой код запускает 3 функции одновременно (каждая выполняется 1 работником):
yourfunction(1)
yourfunction(2)
&yourfunction(3)
выполняются в одно и то же время.yourfunction(4)
yourfunction(5)
&yourfunction(6)
также выполняются в одно и то же время.yourfunction(7)
работает сама по себе.
Заключение
Надеюсь, что данная статья оказалась полезной для вас!