Hello World – Telegram
Hello World
1.68K 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
​​​​Unpacking

Создадим небольшой словарь из двух пар элементов ключ-значение, и попробуем его распаковать используя multiple assignment. Должно быть вы ожидали, что распаковка вернет вам два кортежа вида (ключ, значение), либо же мы получим ошибку. Однако, питон позволяет нам провести распаковку словаря, хотя и не возвращает пары ключ-значение. Вместо этого вы получите ключи.

Для того, чтобы вернуть именно пары ключ-значение, необходимо использовать dict.items() (работает в Python 3).
#tips
​​Перечисление

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

#enumerate #tips
12 небольших фишек для улучшения твоего кода

1. Обмен значений
x, y = 1, 2
x, y = y, x


2. Получение строки из списка
a_list = [‘I’, ‘like’, ‘python’, ‘programming’]
a_string = “ “.join(a_list)


3. Разбиение строки на список
a_string = ‘I like python programming’
a_list = a_string.split()


4. Инициализация листа каким либо значением
[0]*1000 # лист, заполненный 1000 нулями
[1]*1000 # лист, заполненный 1000 единицами


5. Слияние словарей
x = {‘a’:1, ‘b’:2}
y = {‘c’:3, ‘d’:4}
z = {**x, **y}


6. Переворачивание строки
a = ‘My string’
a = a[::-1]


7. Возврат нескольких переменных из функции
def test(x,y):
return x,y
a,b = test(1,2)


8. Итерирование по словарю
a_dict = {‘a’:1, ‘b’:2, ’c’:3}
for k, v in a_dict.items():
print(‘{0}:{1}’.format(k, v))


9. Инициализация пустых контейнеров
a_list = list()
a_dict = dict()
a_set = set()
a_tuple = tuple()


10. Удаление символов в конце строки
my_string = ‘My string///‘
my_string.strip(‘/‘)


11. Проверка занимаемой объектом памяти
import sys
x = 1
print(sys.getsizeof(x))


12. Нахождение наиболее частого элемента в списке
a_list = [1, 2, 3, 1, 1, 4, 1, 4, 4, 1]
print(max(set(a_list), key=a_list.count))


#tips