• Как сделать вывод в строку более грамотно?

    adugin
    @adugin Куратор тега Python
    from itertools import starmap
    
    items = [
        (161, 0, 'the-north-face', 25, 110),
        (164, 1, 'ralf-Lauren', 87, 170),
        (165, 2, 'the-north-face', 10, 75)
    ]
    
    template = 'название: {2},  состояние: {3},  цена: {4},  продать: /sell_{1}'
    
    message = '\n'.join(starmap(template.format, items))
    Ответ написан
    1 комментарий
  • Есть ли разница между написаниями?

    Amoralny
    @Amoralny
    Python-разработчик
    Когда вводишь данные, ставь их в "", тогда SQL будет читать их как строки.
    UPDATE data SET inventory = "{inventory}" WHERE id = "id";

    И даже если вставить вместо id какой-то код для изменения базы, то SQL будет искать что-то типа:
    ... id="6346327; DROP DATABASE base";

    Еще в cursor() есть свой ввод данных
    cursor.execute("UPDATE data SET inventory = :inventory WHERE id = :id", {"inventory" : inventory-1, "id" : id})
    #или
    cursor.execute("UPDATE data SET inventory = ? WHERE id = ?", (inventory-1, id))


    Если же надо полностью запретить использование команд SQL, то проверяй каждый запрос на их наличие.
    Еще можно выдать определенные права пользователю SQL и тогда он сможет только читать, обновлять и добавлять, что, на мой взгляд, не так страшно, как полное удаление базы.

    ps. не юзай root пользователя для запросов :D
    Ответ написан
    2 комментария
  • Есть ли разница между написаниями?

    @deliro
    Ну подставь id="1; DELETE FROM data" и сразу увидишь:)
    Ответ написан
    Комментировать
  • Как заменить фото бота в телеграм?

    @twistfire92
    Python backend developer
    Вот поиграйтесь с этим кодом.
    найдите картинки соответствующие и просмотрите как все это работает в примере ниже

    import telebot
    from telebot import types
    
    token = '' 
    
    bot = telebot.TeleBot(token)
    
    @bot.message_handler(commands=['start'])
    def send_welcome(message):
    	photo = open('racoon.jpg', 'rb')
    	markup = create_markup()
    	bot.send_photo(message.chat.id, photo, caption='Енот', reply_markup=markup)
    
    @bot.callback_query_handler(func=lambda c: True)
    def change_photo(call):
    	markup = create_markup()
    	chat_id=call.message.chat.id
    	message_id=call.message.message_id
    	if call.data == 'racoon':
    		photo = open('racoon.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Енот')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    	elif call.data == 'fox':
    		photo = open('fox.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Лиса')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    	elif call.data == 'rabbit':
    		photo = open('rabbit.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Заяц')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    
    def create_markup():
    	markup = types.InlineKeyboardMarkup()
    	button1 = types.InlineKeyboardButton(text='Енот', callback_data='racoon')
    	button2 = types.InlineKeyboardButton(text='Лиса', callback_data='fox')
    	button3 = types.InlineKeyboardButton(text='Заяц', callback_data='rabbit')
    	markup.row(button1, button2, button3)
    	return markup
    
    bot.polling()


    Результат этого кода (Все это - одно сообщение, в котором перерисовывалась картинка):

    5f72cdac977d9702675906.png
    5f72cdc24d779354601542.png
    5f72cddaf2294374777349.png

    Единственный момент - это если будете менять зайца на зайца например, то код упадет в ошибку.
    Но это уже другая проблема))
    Ответ написан
    Комментировать
  • Алгоритм рандома при котором чем больше число тем ниже шанс его выпадения?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    У random.choices есть возможность задавать "вес" для элементов. Например:
    import random
    
    item_chances = {
        'item_1': 10,
        'item_2': 30,
        'item_3': 50,
        'item_4': 70,
        'item_5': 90
    }
    
    selected = random.choices(
        list(item_chances.keys()), weights=list(item_chances.values()), k=5000)
    
    for item in set(selected):
        print(f'{item}: {selected.count(item)}')

    Здесь у item_1 самый маленький вес, то есть самый маленький шанс выпадения этого значения, в то время как у item_5 самый высокий. Аргумент k указывает сколько элементов нужно выбрать. В данном случае 5000 я выбрал для теста. Вывод:
    item_1: 175
    item_2: 578
    item_3: 1001
    item_4: 1458
    item_5: 1788

    Как видишь все сходится и "предметы" выпадали согласно их "весу".
    Ответ написан
    8 комментариев