Позднее Ctrl + ↑

Задача о средних зарплатах

Условие. В IT-компании «ЭВМ+» работает 70 человек. У каждого сотрудника плавающая зарплата: каждый месяц она случайно генерируется в диапазоне от 20 до 150 тысяч рублей. Список зарплат хранится в двумерном списке. Ваша задача узнать количество человек, получивших среднюю зарплату за год выше среднего. Итак, решаем:

from random import randint

# Список зарплат, количество работников и месяцев, диапазон зарплат
salaries = []
people = 70
months = 12
min_salary = 20000
max_salary = 150000

# Заполняем список зарплат случайными данными
for i in range(people):
    salaries.append([])
    for j in range(months):
        salaries[i].append(randint(min_salary, max_salary))


def people_average_salary(salaries_list):
    # Считаем среднюю зарплату за год
    average_salary = 0
    for i in range(len(salaries_list)):
        average_salary += sum(salaries_list[i])
    average_salary = int(average_salary / 12 / 70)

    # Считаем количество людей с з/п выше средней
    people_counter = 0
    for i in range(len(salaries_list)):
        if sum(salaries[i]) / 12 > average_salary:
            people_counter += 1

    print("Количество людей с з/п выше среднего:", people_counter, "человек.")


people_average_salary(salaries)

Шпаргалка по SQL

CRUD — это базовые функции для работы с базами данных.
Create — создаём, Read — читаем, Update — обновляем, Delete — удаляем.

Добавление записи INSERT

INSERT INTO <имя таблицы> (<имена столбцов>, ...) VALUES (<значения>, ...);
INSERT INTO blog (user, birth_year) VALUES ('Igor Markin', 1990);

Чтение записи SELECT

SELECT <перечень столбцов> FROM <перечень таблиц> WHERE <условия>;
SELECT DISTINCT birth_year FROM blog; - уникальные значения
SELECT * FROM blog;

Изменение записи UPDATE

UPDATE <таблица> SET <столбец> = <значение>, ... WHERE <условие>;
UPDATE blog SET user = 'Markin Igor' WHERE user = 'Igor Markin';

Удаление записи DELETE

DELETE FROM <таблица> WHERE <условие>; 
DELETE FROM blog WHERE user = 'Markin Igor';

Конструкция SQL-запроса

SELECT *** - выбираем нужные данные
FROM *** - из таблицы
WHERE *** - где выполняется условие
GROUP BY *** - группируем по
HAVING *** - из того, что получилось выбираем по условию
ORDER BY *** - сортируем по столбцу
LIMIT *** - ограничиваем вывод

Операторы

OR, NOT, AND, IN, BETWEEN, LIKE, ILIKE
> , < , >= , <= , <> , !=

BETWEEN <значение 1> AND <значение 2> — выбирает значение между указанными, включая сами значения.
name LIKE ’igor mar%’ — поиск по шаблону с учётом регистра, найдёт ’Igor Markin’.
name ILIKE ’igor mak%’ — поиск без учёта регистра, найдёт ’Igor Markin’.
% — заменяет любой набор символов.

Функции

COUNT() — считает количество записей
MIN() — ищет минимальное значение
MAX() — ищет максимальное значение
AVG() — вычисляет среднее значение

EXCTRACT(<ДАТА> FROM <столбец>) — извлекает дату

  • century — век;
  • day  — день;
  • doy (от англ. day of the year) — день года: от 1 до 365/366;
  • isodow — день недели: понедельник — 1, воскресенье — 7;
  • hour — час;
  • milliseconds — миллисекунда;
  • minute — минута;
  • second — секунда;
  • month — месяц;
  • quarter — квартал;
  • week — неделя в году;
  • year — год.

DATE_TRUNC(<ДАТА>, <столбец>) — усекает дату

  • microseconds — микросекунды;
  • milliseconds — миллисекунды;
  • second — секунда;
  • minute — минута;
  • hour — час;
  • day — день;
  • week — неделя;
  • month — месяц;
  • quarter — квартал;
  • year — год;
  • decade — декада года;
  • century — век.

AS — задаёт псевдоним для столбца

Нельзя использовать псевдонимы из SELECT в WHERE и т. д. так как порядок выполнения SQL запроса таков:

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

ORDER BY — сортировка

ASC сортирует данные в порядке возрастания. Это аргумент ORDER BY по умолчанию.
DESC сортирует данные по убыванию.

Типы данных и преобразование

integer — целочисленный тип. В SQL диапазон целых чисел от -2147483648 до 2147483647.
real — число с плавающей точкой. Точность числа типа real до 6 десятичных разрядов.

varchar(n) — строка переменной длины, где n — ограничение.
text — строка любой длины.

timestamp — дата и время.
date — дата.

boolean — логический тип данных. TRUE — «истина», FALSE — «ложь» и NULL — «неизвестно».

Типы преобразуют конструкцией CAST:

CAST (<столбец> AS <тип данных>) или <столбец> :: <тип данных>
 Нет комментариев    113   4 мес   SQL

Началось обучение

Сегодня началось долгожданное обучение в Яндекс.Практикуме. Авторы рассказали о курсе, о структуре занятий, добавили в чатик Slack и представили команду. В ближайший почти год с нами будут дружить куратор, два наставника, код-ревьюер и техническая поддержка.

Обучение разбили на спринты по 2 недели. Спринты складываются в модули. В самом конце будет писать большой дипломный проект за который нам выдадут диплом о профессиональной переподготовке.

После вводных слов и лирических отступлений первый спринт предполагает изучение основ работы с SQL. Интересно и непонятно, но буду двигаться до победного конца :) Я никуда не деваюсь. Уверен, будет оставаться время. Это значит, что буду продолжать работать по книге Виктора Трофимова и писать игры.

На подходе игра Crazy Racing, которая является переделкой из игры «Ипподром». Потом возьмусь за второй том. Там всё куда сложнее и интереснее. Мы с вами остаёмся на связи. До скорой встречи.

Консольная игра «Казино 678» или «Super Duper Casino»

Ну вот, я наконец-то закончил проект «Казино 678» по книге Виктора Трофимова. В двух словах, что из себя представляет программа.

  • Умеет сохранять и загружать из файла остаток денег
  • Из игр: рулетка, кости и однорукий бандит
  • Сначала игра была в цвете, а потом я его убрал (не расстраивайтесь)
  • В игре была анимация всех игр, но её я тоже убрал (не злитесь)

В «Казино 678» мы научились делать функции и методы, активно использовали циклы и ветвления и поработали с файлами. Главное — научились разбивать большие задачи на изолированные подзадачи. Отличный навык, мне понравился.

Скачать код игры можно по ссылке.

 Нет комментариев    58   4 мес   python

Задача о количестве пирогов

Мне подкинули вот такую задачку.

Петя любит печь пироги. У него есть его любимый рецепт и определённое количество ингредиентов. Сколько он сможет испечь любимых пирогов? Необходимо написать функцию, на вход которой подаётся два словаря: первый содержит пары {ингредиент: необходимое_количество_для_рецепта}, а второй — {ингредиент: доступное_количество}. Ингредиенты, не указанные во втором списке, отсутствуют.

Тест-кейсы:

cakes({"flour": 500, "sugar": 200, "eggs": 1}, {"flour": 1200, "sugar": 1000, "eggs": 5, "milk": 200}) # answer: 2
cakes({"apples": 2, "flour": 300, "milk": 100, "sugar": 100}, {"sugar": 500, "milk": 2000}) # answer: 0
cakes({"flour": 200, "sugar": 200, "eggs": 1}, {"sugar": 200, "flour": 200, "eggs": 1}) #answer: 1

Вот, как я решил задачу:

def cakes(recipe, ingredients):
    values = list()
    for recipe_key in recipe:
        if recipe_key in ingredients:
            values.append(ingredients[recipe_key] // recipe[recipe_key])
        else:
            return 0
    return min(values)

А вот, как её можно было решить. Этот вариант подсказал модератор чата. Минус, который я нашёл в таком решении: функция будет перебирать значения до самого конца, даже если сразу будет очевидно, что пирог мы не приготовим.

def cakes(recipe, ingredients):
    return min(ingredients.get(ingredient, 0) // recipe[ingredient] for ingredient in recipe)

Красиво, чисто, лаконично. Мне к такому ещё стремиться и стремиться)

Консольная игра «Учись считать» или «Math Generator»

Забыл поделиться кодом игры «Math Generator». Она умеет составлять математические примеры на сложение, вычитание, умножение и деление. Из бонусов: раздаёт баллы, считает количество правильных и неправильных ответов и подсказывает решение, если игрок не знает ответ.

Эта игра вторая в учебнике по программированию игр и в книге называется «Учись считать». Ученик на этом этапе знает о переменных, умеет работать с ветвлениями и циклами и знает, что такое f-строки.

Скачать код игры можно по ссылке.

 Нет комментариев    46   4 мес   python

Как в Python сравнить переменную с несколькими объектами?

Увидел я в чатике вот такой вопрос:

while(not x==«m» and not x==«f» and not x==«g» and not x==«h»): — Можно ли как-то короче записать такую строку?

Оказывается, можно. Делается это так:

while(not x in ("m", "f", "g", "h")):

Красиво, лаконично, просто :) Пёрфект!

Задача про количество пробелов

В чатике для начинающих программистов один человек выложил задачку.

Задача «Loneliest character». Напишите функцию loneliest(), которая принимает строку вида «a b  z   p c» и возвращает массив символов, у которых больше всего пробелов справа и слева.

Примеры:

'a b  c' => ['b']
'a bcs           d k' => ['d']
'    a b  sc     p     t   k'  => ['p']
'a  b  c  de'  => ['b', 'c']
'     a  b  c de        '  => ['b']
'abc' => ['a', 'b', 'c']

Примечание:

  • Начальные и конечные пробелы в строке не считаем
  • Строки содержат только уникальные символы от a до z;
  • Порядок символов в массиве не имеет значения.

Вот, как пытался решать задачу человек, который скинул её в чат.

Я сначала выписывал индексы букв из строки. Потом между этими индексами считал количество пробелов и записывал значение. Потом складывал два смежных значения и выписывал самое большое, потом запутался.
Пользователь чата

Я минут 20 ломал голову, думал уже бросит затею, но потихоньку родилась вот такая реализация. Она не идеальная (далеко), но с поставленной задачей справляется.

По ссылке можно посмотреть исходный код.

Форматирование текста в Python без импортов

В книге Виктора Трофимова о программировании игр есть раздел об игре «Казино 678». Для того, чтобы на экране было весело, автор предлагает раскрашивать текст в разные цвета. Для этого он подключает модуль ctypes и использует длинный страшный код.

windll.Kernel32.GetStdHandle.restype = c_ulong
h = windll.Kernel32.GetStdHandle(c_ulong(0xfffffff5))

def color(c)
    windll.Kernel32.SetConsoleTextAttribute(h, c)

В таком подходе три минуса:

  1. Сразу не разобраться, что написано в коде
  2. Подключаем модуль, который для других целей не нужен
  3. Кроме цвета нельзя добавить другое форматирование

Я решил использовать ASCII-цвета и форматирование. Это сразу решает три проблемы, указанные выше и делает программу гибкой. Для удобства написал функцию, которая принимает в себя аргументы с тегами и текстом, который будем оформлять.

Вот, что в итоге получилось. Забирайте код по ссылке, пользуйтесь, наслаждайтесь :)

Консольная игра «Угадай число» или «Guess the Number»

Читаю учебник Виктора Трофимова «Программирование игр, создание с нуля (Python) 1». Так занимаю время до начала потока в Яндекс.Практикуме, который начинается 27 октября. В первом разделе учебника автор рассказывает о переменных, циклах и проблемах новичков. Во втором помогает создавать простенькие консольные игры.

Первая игра называется «Угадай число». Суть такая: компьютер загадывает число, а пользователь угадывает. При этом считаются очки, выдаются подсказки и обрабатываются ошибки ввода. Подразумевается, что на этом этапе программист не знает, что такое методы и функции и не придерживается принципов ООП.

Автор направляет ученика, помогает написать готовую программу, но конечные решения оставляет за разработчиком. Наигравшись с названиями переменных, делюсь тем, что получилось.

Исходный код консольной игры «Угадай число» смотрите по ссылке. Играйте, получайте удовольствие :)

 Нет комментариев    43   4 мес   python
Ранее Ctrl + ↓