Лямбда-функции
Порой нужно передать функцию в качестве аргумента, либо сделать короткую (но сложную) операцию большое количество раз. В таком случае можно определить обычную функцию через def, а можно использовать лямбда-функцию.
У лямбда-функций есть несколько преимуществ, во-первых их можно передавать мгновенно (переменная не нужна), во-вторых, иногда они способны улучшить читаемость кода. Но злоупотреблять ими не стоит.
Лямбда-функции отлично сочетаются, например, с map.
#lambda
Порой нужно передать функцию в качестве аргумента, либо сделать короткую (но сложную) операцию большое количество раз. В таком случае можно определить обычную функцию через def, а можно использовать лямбда-функцию.
У лямбда-функций есть несколько преимуществ, во-первых их можно передавать мгновенно (переменная не нужна), во-вторых, иногда они способны улучшить читаемость кода. Но злоупотреблять ими не стоит.
Лямбда-функции отлично сочетаются, например, с map.
#lambda
Списковые включения (list comprehensions)
Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией map в сочетании с lambda.
Этот код довольно короткий, но он все еще плохо читаем. К тому же мы вынуждены дополнительно определить лямбда-функцию.
К счастью есть более красивый способ.
Даже человек без знания python легко определит что делает этот код.
Также с помощью списковых включений можно фильтровать список.
Да, это все можно было сделать с помощью цикла for. Однако, подобный подход совсем не гарантирует четкий и лаконичный код.
#list
Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией 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
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
Обычно built-in функция iter() возвращает итератор от переданной последовательности.
Однако, можно передать два параметра. В таком случае, первый параметр должен быть callable-объектом, а второй — результатом вызова первого объекта, на котором нужно остановить итерирование.
Как пример, построчное считывание из файла до первого вхождения пустой строчки.
#iterator
Несколько советов начинающим разработчикам
1. Хорошо написанный код сам себя документирует.
Если комментарии к вашему куску кода слишком запутаны, подумайте, может стоит переписать этот код.
2. Старайтесь использовать только подходящие для данной задачи инструменты.
Например, python хорош для анализа данных или для работы с web, но писать на нем PIC (particle-in-cell) солвер явно не стоит. Перед тем как усложнять что-либо, подумайте, а надо оно вам вообще?
3. Не бойтесь переписывать код.
Планируйте выбросить первый экземпляр программы. Вам в любом случае придется это сделать.
4. Изучите базовые структуры данных.
Связные списки, стэки, очереди, хэш-таблицы, двоичные деревья поиска - must have.
«Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях», — Линус Торвальдс, создатель Linux.
1. Хорошо написанный код сам себя документирует.
Если комментарии к вашему куску кода слишком запутаны, подумайте, может стоит переписать этот код.
2. Старайтесь использовать только подходящие для данной задачи инструменты.
Например, python хорош для анализа данных или для работы с web, но писать на нем PIC (particle-in-cell) солвер явно не стоит. Перед тем как усложнять что-либо, подумайте, а надо оно вам вообще?
3. Не бойтесь переписывать код.
Планируйте выбросить первый экземпляр программы. Вам в любом случае придется это сделать.
4. Изучите базовые структуры данных.
Связные списки, стэки, очереди, хэш-таблицы, двоичные деревья поиска - must have.
«Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях», — Линус Торвальдс, создатель Linux.
Способы чтения данных из файла
Допустим, нам нужно считать пары точек x, y из файла. Например, для того, чтобы в дальнейшем воспользоваться интерполяцией. Рассмотрим несколько способов, которыми мы можем воспользоваться.
1. Построчное считывание.
Ну, здесь все просто. Не забываем привести данные к типу float или int.
2. С использованием функционального программирования.
Заменяем цикл в предыдущем выражении на map().
3. С использованием numpy.
Воспользуемся numpy.loadtxt().
#file
Допустим, нам нужно считать пары точек 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
Допустим, мы создаем небольшой список из пяти элементов и одно генераторное выражение. Если мы сейчас попробуем проверить, содержится ли число 5 в списке, то ответом будет True. С генераторным выраженим должно быть так же, верно? Попробуем проверить. Получаем, что 5 содержится и в нем. Но если мы поинтересуемся еще раз, содержится ли 5 в выражении, получим False.
Не забываем, что генераторное выражение не есть кортеж, для того чтобы создать кортеж, необходимо воспользоваться конструктором tuple().
#tips
Unpacking
Создадим небольшой словарь из двух пар элементов ключ-значение, и попробуем его распаковать используя multiple assignment. Должно быть вы ожидали, что распаковка вернет вам два кортежа вида (ключ, значение), либо же мы получим ошибку. Однако, питон позволяет нам провести распаковку словаря, хотя и не возвращает пары ключ-значение. Вместо этого вы получите ключи.
Для того, чтобы вернуть именно пары ключ-значение, необходимо использовать dict.items() (работает в Python 3).
#tips
Создадим небольшой словарь из двух пар элементов ключ-значение, и попробуем его распаковать используя multiple assignment. Должно быть вы ожидали, что распаковка вернет вам два кортежа вида (ключ, значение), либо же мы получим ошибку. Однако, питон позволяет нам провести распаковку словаря, хотя и не возвращает пары ключ-значение. Вместо этого вы получите ключи.
Для того, чтобы вернуть именно пары ключ-значение, необходимо использовать dict.items() (работает в Python 3).
#tips
Перечисление
Если применить enumerate() к какому-либо итерируемому объекту, можно получить индекс объекта и сам объект. Опциональный аргумент в enumerate позволяет задать начальный индекс.
#enumerate #tips
Если применить enumerate() к какому-либо итерируемому объекту, можно получить индекс объекта и сам объект. Опциональный аргумент в enumerate позволяет задать начальный индекс.
#enumerate #tips
12 небольших фишек для улучшения твоего кода
1. Обмен значений
2. Получение строки из списка
3. Разбиение строки на список
4. Инициализация листа каким либо значением
5. Слияние словарей
6. Переворачивание строки
7. Возврат нескольких переменных из функции
8. Итерирование по словарю
9. Инициализация пустых контейнеров
10. Удаление символов в конце строки
11. Проверка занимаемой объектом памяти
12. Нахождение наиболее частого элемента в списке
#tips
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
Тернарный оператор в python
Тернарным оператором является сокращённая форма записи условного выражения if-else. Такой подход позволяет быстро проверить условие, а не писать несколько строчек оператора if. Зачастую это очень удобно, поскольку позволяет писать более компактный код, сохраняя его читабельность.
#if
Тернарным оператором является сокращённая форма записи условного выражения if-else. Такой подход позволяет быстро проверить условие, а не писать несколько строчек оператора if. Зачастую это очень удобно, поскольку позволяет писать более компактный код, сохраняя его читабельность.
#if
Пробуем beautiful soup на вкус
https://telegra.ph/Pishem-prostoj-veb-skraper-dlya-kriptovalyut-02-09
https://telegra.ph/Pishem-prostoj-veb-skraper-dlya-kriptovalyut-02-09
Telegraph
Пишем простой веб-скрапер для криптовалют
Где-то год назад ко мне обратились с просьбой написать простенький веб-скрапер криптовалют. Это было в качестве тестового задания для какой-то вакансии. Для чего вообще нужен этот скрапер? Для доступа к данным интересующего тебя сайта в автоматическом режиме.…
Изменение словаря во время итерации по нему
▪️Вообще говоря не стоит изменять словарь, по которому происходит итерация
▪️Эта штука срабатывает только восемь раз, ведь именно это та точка, в которой словарь должен был бы изменить размер, чтобы удержать больше ключей (стандартно есть только восемь записей, поэтому меняйте размер, если нужно). Это фактическая деталь реализации.
#dict #tips
▪️Вообще говоря не стоит изменять словарь, по которому происходит итерация
▪️Эта штука срабатывает только восемь раз, ведь именно это та точка, в которой словарь должен был бы изменить размер, чтобы удержать больше ключей (стандартно есть только восемь записей, поэтому меняйте размер, если нужно). Это фактическая деталь реализации.
#dict #tips
Python становится одним из самых популярных языков программирования в мире
«Я ТОЧНО не собирался создавать язык, предназначенный для массового потребления», - говорил Гвидо ван Россум, голландский ученый-компьютерщик, который разработал язык программирования Python в 1989 году. Но спустя почти три десятилетия его изобретение обогнало почти всех его конкурентов.
#news
«Я ТОЧНО не собирался создавать язык, предназначенный для массового потребления», - говорил Гвидо ван Россум, голландский ученый-компьютерщик, который разработал язык программирования Python в 1989 году. Но спустя почти три десятилетия его изобретение обогнало почти всех его конкурентов.
#news
Друзья, нас уже 300.
Я пока еще не пробовал писать на тему data science, но в будущем я думаю, это возможно (если вам будет интересен подобный формат).
А пока что, ловите подборку интересных материалов.
🐍 Набор полезных ссылок про Python для аналитики данных
🔸 Масштабное и хорошо оформленное руководство по библиотеке pandas. Освещает вопросы загрузки данных, очистки и подготовки данных, применения условий для фильтрации.
🔸 Отличная статья о том как вытаскивать данные из PostgreSQL в Питоне с помощью psycopg2.
🔸 Если вы работаете с Google BigQuery, то вам может пригодится инструкция о том как выгружать и загружать данные в BigQuery с помощью Python.
Новые материалы и подборки также читайте на канале, посвященном data science: @datalytx
Я пока еще не пробовал писать на тему data science, но в будущем я думаю, это возможно (если вам будет интересен подобный формат).
А пока что, ловите подборку интересных материалов.
🐍 Набор полезных ссылок про Python для аналитики данных
🔸 Масштабное и хорошо оформленное руководство по библиотеке pandas. Освещает вопросы загрузки данных, очистки и подготовки данных, применения условий для фильтрации.
🔸 Отличная статья о том как вытаскивать данные из PostgreSQL в Питоне с помощью psycopg2.
🔸 Если вы работаете с Google BigQuery, то вам может пригодится инструкция о том как выгружать и загружать данные в BigQuery с помощью Python.
Новые материалы и подборки также читайте на канале, посвященном data science: @datalytx
Недавно хотел написать подобный пост про *args и **kwargs. Стоит добавить только, если вы хотите использовать и *args, и **kwargs, то это делается так: func(fargs, *args, **kwargs), причем порядок следования аргументов важен.
Forwarded from Python Lounge: работа и стажировки для программистов
Сегодня мы разберем с виду сложную, но легкую в использовании конструкцию, которую можно применить практически везде
*args, **kwargs #урок 16
*args, **kwargs #урок 16
Telegraph
*args, **kwargs
Думаю, многие хоть раз видели такую запись, сейчас мы узнаем, что это за магические символы. Сообщу заранее, что args и kwargs - общепринятые имена переменных, а разбирать мы будем звездочки перед нимим. def func(*args, **kwargs): # code *args Рассмотрим…
all() & any()
all() и any() — это встроенные методы, которые позволяют проверить элементы списка на выполнение заданного условия
▪️Встроенная функция all() - идет по списку True/False (либо выражений, сводящихся к этим значениям) и прекращает проверку после первого элемента, не удовлетворяющего условию
▪️Функция any() проверяет те же условия хотя бы для одного элемента
▪️all() и any() могут обрабатывать не только списки, но и любые итерируемые объекты
#tips
all() и any() — это встроенные методы, которые позволяют проверить элементы списка на выполнение заданного условия
▪️Встроенная функция all() - идет по списку True/False (либо выражений, сводящихся к этим значениям) и прекращает проверку после первого элемента, не удовлетворяющего условию
▪️Функция any() проверяет те же условия хотя бы для одного элемента
▪️all() и any() могут обрабатывать не только списки, но и любые итерируемые объекты
#tips
Внешний вид кода
Есть такое понятие как PEP 8. Это специальный стандарт, правило хорошего тона, если хотите. Единый стиль оформления делает код понятным как для самого программиста, так и для его коллег с разным уровнем подготовки.
В идеале наиболее сложный фрагмент кода должен быть понятен с первого прочтения.
PEP 8 затрагивает следующие основные моменты:
▪️выбор кодировки исходного кода
▪️группировку инструкций по импорту модулей
▪️максимальную длину строки кода — рекомендуется до 79 знаков, а для строк документации (docstring) — 72 знака
▪️использование отступов — табуляции и пробелов
▪️использование пустых строк для разбивки кода на блоки и выделения функций верхнего уровня
▪️использование комментариев
▪️именование переменных, констант, классов и экземпляров, функций, аргументов, модулей, пакетов
▪️выбор уровня доступности классов и методов (public, private, API-подклассы), а также порядка их наследования.
Также оставляю ссылку тут
#pep8
Есть такое понятие как PEP 8. Это специальный стандарт, правило хорошего тона, если хотите. Единый стиль оформления делает код понятным как для самого программиста, так и для его коллег с разным уровнем подготовки.
В идеале наиболее сложный фрагмент кода должен быть понятен с первого прочтения.
PEP 8 затрагивает следующие основные моменты:
▪️выбор кодировки исходного кода
▪️группировку инструкций по импорту модулей
▪️максимальную длину строки кода — рекомендуется до 79 знаков, а для строк документации (docstring) — 72 знака
▪️использование отступов — табуляции и пробелов
▪️использование пустых строк для разбивки кода на блоки и выделения функций верхнего уровня
▪️использование комментариев
▪️именование переменных, констант, классов и экземпляров, функций, аргументов, модулей, пакетов
▪️выбор уровня доступности классов и методов (public, private, API-подклассы), а также порядка их наследования.
Также оставляю ссылку тут
#pep8