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) работает сама по себе.

Заключение

Надеюсь, что данная статья оказалась полезной для вас!

+1
2
+1
6
+1
2
+1
0
+1
3

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *