Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions 1_if1.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,33 @@

Условный оператор: Возраст

* Попросить пользователя ввести возраст при помощи input и положить
* Попросить пользователя ввести возраст при помощи input и положить
результат в переменную
* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь:
* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь:
учиться в детском саду, школе, ВУЗе или работать
* Вызвать функцию, передав ей возраст пользователя и положить результат
* Вызвать функцию, передав ей возраст пользователя и положить результат
работы функции в переменную
* Вывести содержимое переменной на экран

"""


def main():
"""
Эта функция вызывается автоматически при запуске скрипта в консоли
В ней надо заменить pass на ваш код
"""
pass

def you_need(age):
dict_have_to_do = {tuple(range(1, 3)): 'Вам нужно учиться в детском саду',
tuple(range(3, 18)): 'Вам нужно учиться в школе',
tuple(range(18, 21)): 'Вам нужно учиться в ВУЗе',
tuple(range(21, 80)): 'Вам нужно работать'}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

когда ты оборачиваешь range в tuple, ты заставляешь программу хранить в память все 60 чисел, в несортированном тупле. Это и памяти много занимает, и перебор он делает последовательно по всем числам в списках.

По крайней мере оставь просто range, должно работать.

Но вообще задача была про сделать цепочку if.
C одной стороны у тебя классный, расширяемый подход. С другой стороны цепочка if понятнее, и работает быстрее. Если тебе не нужно вытаскивать произвольный список правил из БД, то я бы сказал что эта абстрактность тут ни к чему - она только усложняет код.


return [value for key, value in dict_have_to_do.items() if age in key][0]

print(you_need(int(input('Введите ваш возраст: \n'))))


if __name__ == "__main__":
main()
33 changes: 25 additions & 8 deletions 2_if2.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,39 @@
Условный оператор: Сравнение строк

* Написать функцию, которая принимает на вход две строки
* Проверить, является ли то, что передано функции, строками.
* Проверить, является ли то, что передано функции, строками.
Если нет - вернуть 0
* Если строки одинаковые, вернуть 1
* Если строки разные и первая длиннее, вернуть 2
* Если строки разные и вторая строка 'learn', возвращает 3
* Вызвать функцию несколько раз, передавая ей разные праметры
* Вызвать функцию несколько раз, передавая ей разные праметры
и выводя на экран результаты

"""


def strings(str1, str2):
if isinstance(str1, str) and isinstance(str2, str):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А можно сделать код менее вложенным? Вложенный условия сложно понимать. Совершенно не вижу причины для трех уровней вложенности тут.

if str1 == str2:
return 1
else:
if len(str1) > len(str2) and str2 != 'learn':
return 2
elif str2.lower() == 'learn':
return 3
return f'Для строк "{str1}" и "{str2}" нет вывода'

return 0


def main():
"""
Эта функция вызывается автоматически при запуске скрипта в консоли
В ней надо заменить pass на ваш код
"""
pass

print(strings('hello', 1))
print(strings('hello', 'world'))
print(strings('qwerty', '123'))
print(strings('learn', 'learn'))
print(strings('learn_python', 'learn'))
print(strings(None, None))


if __name__ == "__main__":
main()
43 changes: 36 additions & 7 deletions 3_for.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import numpy as np

"""

Домашнее задание №1
Expand All @@ -6,7 +8,7 @@

* Дан список словарей с данными по колличеству проданных телефонов
[
{'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]},
{'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]},
{'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]},
{'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]},
]
Expand All @@ -16,12 +18,39 @@
* Посчитать и вывести среднее количество продаж всех товаров
"""


def sum_sales_for_each_product(lsts):
for lst in lsts:
print(f'Cуммарное количество продаж товара: "{lst["product"]}" составляет {sum(lst["items_sold"])} шт.')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

print наружу из функции, тут делаем return



def avg_sales_for_each_product(lsts):
for lst in lsts:
print(f'Среднее количество продаж товара: "{lst["product"]}" составляет {round(np.average(lst["items_sold"]))} шт.')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Попробуй решить без numpy. Использование нампи не дает большой выгоды тут, и в продакшен коде * такое использовать не принято



def sum_sales_for_all_product(lsts):
return f'Суммарное количество продаж товаров: "{", ".join([lst["product"] for lst in lsts])}" составляет {sum([sum(lst["items_sold"]) for lst in lsts])} шт.'


def avg_sales_for_all_product(lsts):
return f'Среднее количество продаж товаров: "{", ".join([lst["product"] for lst in lsts])}" составляет {round(np.average([np.average(lst["items_sold"]) for lst in lsts]))} шт.'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется среднее средних не тоже самое что просили посчитать в задаче.



def main():
"""
Эта функция вызывается автоматически при запуске скрипта в консоли
В ней надо заменить pass на ваш код
"""
pass

sales = [
{'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]},
{'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]},
{'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]},
]
sum_sales_for_each_product(sales)
print('_' * 75)
avg_sales_for_each_product(sales)
print('_' * 75)
print(sum_sales_for_all_product(sales))
print('_' * 75)
print(avg_sales_for_all_product(sales))


if __name__ == "__main__":
main()
13 changes: 6 additions & 7 deletions 4_while1.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,17 @@

Цикл while: hello_user

* Напишите функцию hello_user(), которая с помощью функции input() спрашивает
* Напишите функцию hello_user(), которая с помощью функции input() спрашивает
пользователя “Как дела?”, пока он не ответит “Хорошо”

"""


def hello_user():
"""
Замените pass на ваш код
"""
pass
while True:
if input('Как дела?\n').capitalize() == 'Хорошо':
break



if __name__ == "__main__":
hello_user()
31 changes: 24 additions & 7 deletions 5_while2.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import random

"""

Домашнее задание №1
Expand All @@ -12,16 +14,31 @@

Пользователь: Что делаешь?
Программа: Программирую

"""
import time

questions_and_answers = {'как дела': ('Отлично!!!', 'Хорошо)', 'Так себе('), 'кто ты': ('ИИ', 'Не знаю', 'Программа'),
'что делаешь': ('Программирую', 'Ничего', 'Секрет'),
'как тебя зовут': ('У меня много имен', 'Секрет')}

questions_and_answers = {}

def ask_user(answers_dict):
"""
Замените pass на ваш код
"""
pass

while True:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В этом цикле все смешалось в кучу, логика, ввод-вывод, задержки.
Попробуй упростить это.

time.sleep(0.7)
question = input('Введите вопрос:\nUser: ').strip().lower()
if question in questions_and_answers:
print(f'AI: {random.choice(questions_and_answers[question])}')
elif question.lower() in ['хватит', 'стоп', 'stop']:
break
else:
time.sleep(0.7)
print('Такого вопроса нет в общей базе')
time.sleep(1)
print('Придумайте свой ответ на этот вопрос')
time.sleep(1)
questions_and_answers[question] = (input('Введите ответ на вопрос:\nUser: '.strip()),)


if __name__ == "__main__":
ask_user(questions_and_answers)
19 changes: 11 additions & 8 deletions 6_exception1.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@

Исключения: KeyboardInterrupt

* Перепишите функцию hello_user() из задания while1, чтобы она
перехватывала KeyboardInterrupt, писала пользователю "Пока!"
* Перепишите функцию hello_user() из задания while1, чтобы она
перехватывала KeyboardInterrupt, писала пользователю "Пока!"
и завершала работу при помощи оператора break

"""

def hello_user():
"""
Замените pass на ваш код
"""
pass

try:
while True:
if input('Как дела?\n').capitalize() == 'Хорошо':
break
except KeyboardInterrupt:
print('Пока!')


if __name__ == "__main__":
hello_user()
37 changes: 30 additions & 7 deletions 7_exception2.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,42 @@
* Первые два нужно приводить к вещественному числу при помощи float(),
а третий - к целому при помощи int() и перехватывать исключения
ValueError и TypeError, если приведение типов не сработало.

"""
import sys


def discounted(price, discount, max_discount=20):
try:
price = abs(float(price))
except (ValueError, TypeError):
return f'Произошла ошибка {sys.exc_info()[0]}. Проверьте корректность введенной цены товара {price=}.'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно проще получать текущее исключение, в except блоке добавляешь as ex, и используешь переменную ex


try:
discount = abs(float(discount))
except (ValueError, TypeError):
return f'Произошла ошибка {sys.exc_info()[0]}. Проверьте корректность введенной скидки на товар {discount=}.'

try:
max_discount = abs(int(max_discount))
except (ValueError, TypeError):
return f'Произошла ошибка {sys.exc_info()[0]}. Проверьте корректность введенной максимальной ' \
f'скидки на товар {max_discount=}.'

if max_discount >= 100:
raise ValueError("Слишком большая максимальная скидка")
if discount >= max_discount:
return price
else:
return price - (price * discount / 100)


def discounted(price, discount, max_discount=20)
"""
Замените pass на ваш код
"""
pass

if __name__ == "__main__":
print(discounted(100, 2))
print(discounted(100, "3"))
print(discounted("100", "4.5"))
print(discounted("five", 5))
print(discounted("сто", "десять"))
print(discounted(100.0, 5, "10"))
print(discounted(None, 5, "10.0"))
print(discounted(100, 5, None))
41 changes: 27 additions & 14 deletions 8_ephem_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,43 +12,56 @@
бота отвечать, в каком созвездии сегодня находится планета.

"""
import ephem
import logging

from settings import API_KEY
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
from datetime import date

logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s',
level=logging.INFO,
filename='bot.log')


PROXY = {
'proxy_url': 'socks5://t1.learn.python.ru:1080',
'urllib3_proxy_kwargs': {
'username': 'learn',
'password': 'python'
}
}


def greet_user(update, context):
text = 'Вызван /start'
print(text)
update.message.reply_text(text)
update.message.reply_text(f'Привет {update["message"]["chat"]["first_name"]}. {text}')


def talk_to_me(update, context):
user_text = update.message.text
print(user_text)
update.message.reply_text(text)
update.message.reply_text(user_text)


def constellation_planet(update, context):
planets_name = {
'mars': ephem.Mars,
'mercury': ephem.Mercury,
'venus': ephem.Venus,
'jupiter': ephem.Jupiter,
'saturn': ephem.Saturn,
'uranus': ephem.Uranus,
'neptune': ephem.Neptune
}
planet = update.message.text.split()[1].lower()
con_planet = ephem.constellation(planets_name[planet](date.today()))

if planet in planets_name:
update.message.reply_text(
f'Планета {planet.capitalize()} находится в созведии {con_planet[1]} ({con_planet[0]})'
)


def main():
mybot = Updater("КЛЮЧ, КОТОРЫЙ НАМ ВЫДАЛ BotFather", request_kwargs=PROXY, use_context=True)
mybot = Updater(API_KEY, use_context=True)

dp = mybot.dispatcher
dp.add_handler(CommandHandler("start", greet_user))
dp.add_handler(CommandHandler("planet", constellation_planet))
dp.add_handler(MessageHandler(Filters.text, talk_to_me))

logging.info('Бот стартовал')
mybot.start_polling()
mybot.idle()

Expand Down