Hello World
1.66K subscribers
71 photos
6 videos
3 files
161 links
Be so good that you cannot be ignored. And then, go one step beyond.
Download Telegram
Channel created
​​​​Проверка на вхождение подстроки

Для того, чтобы проверить содержится ли подстрока в строке, можно воспользоваться оператором “in”, по аналогии с кортежем или листом.

#tricks
​​​​​​Лямбда-функции

Порой нужно передать функцию в качестве аргумента, либо сделать короткую (но сложную) операцию большое количество раз. В таком случае можно определить обычную функцию через def, а можно использовать лямбда-функцию.
У лямбда-функций есть несколько преимуществ, во-первых их можно передавать мгновенно (переменная не нужна), во-вторых, иногда они способны улучшить читаемость кода. Но злоупотреблять ими не стоит.

Лямбда-функции отлично сочетаются, например, с map.

#lambda
Списковые включения (list comprehensions)

Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией map в сочетании с lambda.
numbers = [1,2,3,4,5]
squares = map(lambda item: item**2, numbers)


Этот код довольно короткий, но он все еще плохо читаем. К тому же мы вынуждены дополнительно определить лямбда-функцию.
К счастью есть более красивый способ.
numbers = [1,2,3,4,5]
squares = [number*number for number in numbers]


Даже человек без знания python легко определит что делает этот код.

Также с помощью списковых включений можно фильтровать список.
numbers = [1,2,3,4,5]
evens = [number for number in numbers if number%2==0]


Да, это все можно было сделать с помощью цикла for. Однако, подобный подход совсем не гарантирует четкий и лаконичный код.

#list
​​Цепочки сравнений (chaining comparison)

Python позволяет составлять произвольные цепочки сравнений, читаются они слева направо, a<b<c разбивается на два выражения: a<b and b<c. Обратите внимание, если a<b возвращает False, b<c уже не оценивается.
https://en.wikipedia.org/wiki/Short-circuit_evaluation
​​Параметры в iter

Обычно built-in функция iter() возвращает итератор от переданной последовательности.
Однако, можно передать два параметра. В таком случае, первый параметр должен быть callable-объектом, а второй — результатом вызова первого объекта, на котором нужно остановить итерирование.
Как пример, построчное считывание из файла до первого вхождения пустой строчки.
#iterator
​​Несколько советов начинающим разработчикам

1. Хорошо написанный код сам себя документирует.
Если комментарии к вашему куску кода слишком запутаны, подумайте, может стоит переписать этот код.

2. Старайтесь использовать только подходящие для данной задачи инструменты.
Например, python хорош для анализа данных или для работы с web, но писать на нем PIC (particle-in-cell) солвер явно не стоит. Перед тем как усложнять что-либо, подумайте, а надо оно вам вообще?

3. Не бойтесь переписывать код.
Планируйте выбросить первый экземпляр программы. Вам в любом случае придется это сделать.

4. Изучите базовые структуры данных.
Связные списки, стэки, очереди, хэш-таблицы, двоичные деревья поиска - must have.
«Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях», — Линус Торвальдс, создатель Linux.
Способы чтения данных из файла

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

1. Построчное считывание.
Ну, здесь все просто. Не забываем привести данные к типу float или int.
def load(filename):
data = []
with open(filename, “r”) as file:
for line in file:
data.append([float(item) for item in line.split()])
return data


2. С использованием функционального программирования.
Заменяем цикл в предыдущем выражении на map().
def load(filename):
with open(filename, “r”) as file:
data = [list(map(float, line.split())) for line in file]
return data


3. С использованием numpy.
Воспользуемся numpy.loadtxt().
def load(filename):
import numpy as np
dt = np.dtype([(“x”, float), (“y”, float)])
data = np.loadtxt(filename, dtype=dt)
return data

#file
​​Containment checking

Допустим, мы создаем небольшой список из пяти элементов и одно генераторное выражение. Если мы сейчас попробуем проверить, содержится ли число 5 в списке, то ответом будет True. С генераторным выраженим должно быть так же, верно? Попробуем проверить. Получаем, что 5 содержится и в нем. Но если мы поинтересуемся еще раз, содержится ли 5 в выражении, получим False.
Не забываем, что генераторное выражение не есть кортеж, для того чтобы создать кортеж, необходимо воспользоваться конструктором tuple().
#tips