Не работает рандомные изображения discord.py
<code>
@client.command()
async def hug (ctx, member:discord.Member):
    if member == None or member == ctx.message.author:
        slaa = (random.choice(hug))
        bs = discord.Embed(title = 'Обнимашки')
        bs.add_field(name = ':3', value = f'Пользоватлеь {ctx.message.author} обнял самого себя!')
        bs.set_image(url = slaa)
        await ctx.send (embed = bs)
    if member != ctx.message.author:
        b = discord.Embed (title = 'Обнимашки!')
        b.add_field(name= ':3', value= f'Пользоватлеь {ctx.message.author} обнял {member.mention}')
        b.set_image(url = slaa)
        await ctx.send(embed = b)
</code>
Есть список из изображений. Переменная slaa рандомно выбирает изображение, но set_image не хочет его добавлять в embed.

У вас функция и переменная одинаково называется. Замените название переменной hug, например, на hugimage.


Сгрупировать список кортежей по первому элементу кортежа
Уважаемые коллеги помогите разобраться с одной казалось бы тривиальной задачей.
Есть список кортежей

list_tuple = [('A','word1'),('A', 'word2'),('A', 'word3'),('B', 'word1'),('B','word2'),('B','word3'),('C', 'word1'),('C','word2')]

Как превратить такие данные в сгрупированный вид по первому элементу кортежа следующего вида:

group_list = [('A', ['word1', 'word2','word3']), ('B', ['word1', 'word2','word3']), ('C', ['word1', 'word2'])]

Помогите с алгоритмом. Желательно без
itertools или
collections
Спасибо.

Нужен
dict. Без него элементы не сгруппировать. А у
dict есть метод
setdefault хорошо подходящий для создания отсутствующих ключей:

list_tuple = [
    ('A', 'word1'),
    ('A', 'word2'),
    ('A', 'word3'),
    ('B', 'word1'),
    ('B', 'word2'),
    ('B', 'word3'),
    ('C', 'word1'),
    ('C', 'word2')
]

d = {}
for k, v in list_tuple:
    d.setdefault(k, []).append(v)

group_list = list(d.items())

print(group_list)

Результат:

[('A', ['word1', 'word2', 'word3']), ('B', ['word1', 'word2', 'word3']), ('C', ['word1', 'word2'])]


Прогрузка картинок на сайт при использовании библиотеки python eel
Делаю небольшую программу и хочу сделать сменяемый фон, который будет браться из директории программы bg и не важно, какое будет кол-во картинок, оно будет само подгружать их кол-во (
len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))]) ).
При запуске, запускается локальный хост localhost:(любой свободный порт). И он уже не может пройти по директории bg, как можно это обойти, или можно сделать какой нибудь прелоад картинок.
Пробовал так же и через python обращаться к функции из js с прогрузкой (
document.head.insertAdjacentHTML("afterbegin", `<link rel="prefetch" href="bg/`+count+`.jpg">`);), но это уже слишком поздно

И такс, начну с структуры проекта:

main.py
site-----|img----|1.jpg
                 |2.jpg
         |index.html
         |style.css
         |script.js

Теперь идут коды:
main.py:

import eel
eel.init('site')
eel.start('index.html')

index.html:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Это моя программа</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div>
        <p class='toogleParagraph' id='gg'>Вот туты должна меняться картинка</p>
    </div>
    <script src='script.js'></script>
</body>
</html>

style.css:

#gg{
    background-image: url(img/1.jpg);
    color: chocolate;
    width: 100%;
    height: 900px;
}
#bg{
    background-image: url(img/2.jpg);
    color: chartreuse;
    width: 100%;
    height: 900px;
}

script.js:

function toogleBackground(){
 let element = document.getElementsByClassName("toogleParagraph")[0];
    if(element.id == 'gg'){
        element.id = 'bg';
    }else{
        element.id = 'gg';
    };
};

setInterval(toogleBackground, 1000);

И так. Про
py,
html и
css объяснять не буду, а вот
js поясню.
Я сделал функцию, которая работает для смены картинок. Картинки все заданы
id в
css и делая смену
id у элемента
p я меняю цвет текста и фоновую картинку. Далее я всё запихнул в
setInterval, чтобы картинка и цвет менялись каждую секунду.
Ну, и остаётся только результат


как сделать чтоб в python socket клиент сделал скриншот и отправялл его на сервер [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 2 года назад.

                        Улучшить вопрос

Как можно сделать скриншот клиента и передать его на сервер? Я сначала подумал что это будет легкая задача но столкнулся с проблемой как можно выполнить команду для скриншота вить если просто передать команду то она не исполниться а просто сохраниться и все

server.py - простой TCP сервер, который принимает любое сообщение за файл. После записи файла проверяется его настоящий mime-type. Нужно это для совместимости в виндовсом, ибо виндовс не хочет открывать файл без расширения в отличие от могучого Линукса. После происходит rename файла с добавлением его mime-type. Можно указать на каком IP адресе запустить сервер. (0.0.0.0 нужен, чтобы могли подключиться к этому серверу хосты с разных сетей. localhost - только с этого компютера). Также можна указать каталог, в который сохранять приходящие файлы.

import socket
from os.path import expanduser
import os
import magic

class Server:

    def __init__(self, address='localhost', port=8080, save_dir=expanduser('~')):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind((address, port))
        self.file_id = 1
        self.save_dir = save_dir
        self.address = address
        self.port = port

    def run(self):
        self.socket.listen(1)
        while True:
            client_socket, client_address = self.socket.accept()
            file_path = os.path.join(self.save_dir, str(self.file_id))
            file = open(file_path, 'wb')
            while 1:
                data = client_socket.recv(1024)
                if data:
                    file.write(data)
                else:
                    break
            mime = magic.from_file(file_path, mime=True).split('/')[1]
            os.rename(file_path, file_path + '.' + mime)
            self.file_id = self.file_id + 1
            file.close()
            client_socket.close()

if __name__ == '__main__':
    server = Server()
    server.run()

client.py - простой TCP клиент, который принимает файл и отправляет его TCP серверу. Также содержит логику, чтобы сделать скриншот с помощью библиотеки PIL

from os.path import expanduser
from PIL import ImageGrab
import socket
import os

class Client:

    def __init__(self, host_address='localhost', host_port=8080):
        self.socket = socket.socket()
        self.host_address = host_address
        self.host_port = host_port
        self.socket.connect((host_address, host_port))

    def send_file(self, file_name):
        file = open(file_name, 'rb')
        self.socket.sendfile(file)

def screenshot(to_file, mime='JPEG'):
    _screenshot = ImageGrab.grab()
    _screenshot.save(to_file, mime)

if __name__ == '__main__':
    file_name = os.path.join(expanduser('~'), '30.jpeg')
    screenshot(file_name)
    cli = Client()
    cli.send_file(file_name)

Запуск происходит двух файлов по отдельности. Сначала сервер, потом клиент. Каждый раз, когда хотите загрузить скриншот компютера, нужно запустить client.py
Кажется, вам не придеться даже устанавливать сторонние зависимости и кажется, что он кросс-платформенный(проверено только на Ubuntu 20.04)


pandas.dataFrame. Рассчитать данные произвольным образом из численного столбца произвольного размера
Опыт в программировании не один год, но это мой первый пост на SOF. Прошу помочь мне на позитивной волне влиться в изучение python ☺.
Дано:

dataFrame pandas c колонкой bid, содержащей float64 (курс валюты)

Найти:

Для значения колонки std в каждой строке N датафрейма найти среднеквадратческое отклонение на основании предыдущих i=2 значений (N-1 и N-2; два - в качестве примера; в работе будет i=1000-100000) из колонки bid чтобы получилось как в последней ячейке по ссылке из Дано (и так для 50 миллионов строк - поэтому ищу способы сделать это оптимально)
(опционально) Универсальный алгоритм, который мог бы считать не только std, но и, скажем, среднекубическое отклонение (только что придумал), то есть, в широком смылсе - взять f(∑X(i)) произвольную функцию от i предыдущих значений колонки

Решение:

apply не подходит т.к. берет общее значение std по всей колонке bid
rolling не взлетел т.к. нет процедуры вычисления std для каждой строки, а numpy не принимает на вход данные сложного типа, только массив чисел
циклом делать не хочется, т.к. предполагаю что для 50 миллионов строк это затянется надолго, но если это единственный вариант - он принимается

rolling не взлетел т.к. нет процедуры вычисления std для каждой строки,  - объясните, что вы имели ввиду, когда писали. Дело в том,

что df['B']=df.A.rolling(window=N).std()

прекрасно считает std на основании последних N значений столбца A и записывает результат в столбец B.
Непонятно и выражение "а numpy не принимает на вход данные сложного типа, только массив чисел"  -  а откуда у вас в bid данные "сложного типа"?
Ну и наконец:
Универсальный алгоритм,....взять ... произвольную функцию от i предыдущих значений колонки

def my_func(r):
    s=r.iloc[0]**0+r.iloc[1]**1+r.iloc[2]**2+r.iloc[3]**3
    return (s)
df['C']=df['A'].rolling(window=4, axis='rows').apply(lambda row: my_func(row))


Как отправить сообщение в whatsapp?
Я хочу отправить сообщение в
whatsapp, используя
python, без сторонних сервисов по типу
twilio или
chat api...
Могу я реализовать это, используя post-запрос?

Разумеется вы сможете реализовать отправку.
Только перед этим вам необходимо пройти авторизацию:

Первым делом получить Token и QR изображение (по сути вы будете эмулировать работу webwhatsapp).
Затем с мобильного устройства сканируете этот код и получаете callback от системы whatsapp об успешной авторизации и собственно Token.
Дальше уже вы сможете отправлять сообщения простым Post запросом.

Сторонние сервисы выполняют ту же работу, только за вас.
Просто отправить сообщение, не пройдя авторизацию не получится.
P.S. Многие данные придется брать из JavaScript, т.к. отловив просто запросы, много информации не получите, что усложняет процесс эмуляции.


Перебор массива (найти x+1 элемент )
Условие задачи если кому-то интересно:
Given a sequence of items and a specific item in that sequence, return the item immediately following the item specified. If the item occurs more than once in a sequence, return the item after the first occurence. This should work for a sequence of any type.
When the item isn't present or nothing follows it, the function should return nil in Clojure and Elixir, Nothing in Haskell, undefined in JavaScript, None in Python.
Я написал код который находит элемент в массиве и выводит следующий за ним, но он не работает с последним условием тестов ниже, как это можно исправить, чтобы он работал и с последним условием:

def next_item(xs, item):
   lenght , i = len (list(xs)) , 0
   while i < lenght:
       if item == xs [i]:
          if i+1 < lenght:
              return xs [i+1]
       i += 1

Вот код тестов:

print (next_item ([1, 2, 3, 4, 5, 6, 7, 8], 5), 6)
print (next_item (['a', 'b', 'c'], 'd'), None)
print (next_item (['a', 'b', 'c'], 'c'), None)
print (next_item ('testing', 't'), 'e')
print (next_item (iter(range(1, 30000)), 12), 13)

p.s: Можно еще описать в ответе, что делает iter() в 5 тесте

Чуть измените ваш код - переведите полученные данные в список:

def next_item(xs, item):
    arr = list(xs)
    lenght, i = len(arr), 0
    while i < lenght:
        if item == arr[i]:
            if i+1 < lenght:
                return arr[i+1]
        i += 1

после этого вы можете работать с итерируемыми объектами, обращаясь по индексу и т.д.
а что мешает сделать в лоб?

def find(arr, value):
    data = list(arr)
    # проверить, существует ли элемент в списке
    if value in data:
        # получить индекс искомого элемента
        index = data.index(value)

        # проверить, существуют ли элементы за найденным элементом
        if index < len(data) - 1:
            return data[index + 1]
        else:
            return None
    else:
        return None

arr = [1, 5, 7, 11, 0, 3]

value = 11

print(find(arr, 11))  # вернет 0, ибо он следует за 11
print(find(arr, 3))   # вернет None ибо 3 - последний элемент в списке
print(find(arr, 111)) # вернет None ибо 111 нет в списке


Как преобразовать символьные вычисления в число на python
Я пробовал преобразовать строку  "-5/x" в целое число и число с плавающей точкой, но не получилось.
Кто может помочь?
Пример кода:
<code>
y = input("Y= ")
primer = ''
count = int(input("Colvo: "))
i = 0
first_spisok = []
end_spisok = []
while i != count:
    for j in range(1, len(y)):
        if y[j] == "x":
            first_spisok += y
            first_spisok[j] = str(i)
            for i in range(1, len(first_spisok)):
                primer += first_spisok[i]
            if float(primer) % 0.5 or float(primer) % 1:
                end_spisok.append(float(primer))
                i += 1

print(end_spisok)
</code>

Вариант 1. Если вам разрешено использовать внешние модули, есть отличный пакет для этих целей SymPy, устанавливаем его один раз через командную строку
python -m pip install sympy.
Далее получается такой код для разбора и вычисления значения произвольного математического выражения с подстановкой переменных, для примера в коде вычисляю выражение с несколькими переменными:
Попробовать онлайн!

import sympy
from sympy.parsing.sympy_parser import parse_expr
expr = parse_expr('-5/x + y + sqrt(z)')
x, y, z = sympy.symbols('x y z')
val = float(expr.evalf(subs = {x: 2, y: 0.1, z: 9}))
print(val)

Вывод:

0.6

Если не все переменные из выражения заданы в
subs = ... то будет ошибка/исключение.

Вариант 2. Если не разрешено использовать внешних больших пакетов, то простейший вариант это использовать встроенный в Питон eval(), в таких выражениях можно например даже функции math модуля использовать:
Попробовать онлайн!

from math import *
expr = '-5/x + y + sqrt(z)'
x, y, z = 2, 0.1, 9
val = eval(expr)
print(val)

Вывод:

0.6

Дополнение. Использование
math модуля не обязательно, т.е. строка
from math import * не нужна, если в выражении нет математических функций типа
sqrt(x) и если например мы хотим не использовать ни одного модуля. Если нужен и импортировать все имена из math в глобальное пространство имён запрещено (через
... import * в коде выше), то можно использовать такую технику.
Внимание - eval() можно использовать только если выражение пришло из надёжного источника, т.е. например вы ввели его, а не произвольный злоумышленник из интернета. Т.к. eval() может исполнить произвольный Python код, даже вредоносный.


Как узнать сколько осталось до нового года?
Как можно узнать сколько осталось дней до нового года на. Языке программирования пайтон? В числовом формате чтоб можно было вывести на экран такое сообщение: до нового года осталось сколько то дней.

Как вариант:
<code>
import datetime

now = datetime.datetime.today()
NY = datetime.datetime(2021, 1, 1)
d = NY-now

mm, ss = divmod(d.seconds, 60)
hh, mm = divmod(mm, 60)

print('До нового года: {} дней {} часа {} мин {} сек.'.format(d.days, hh, mm, ss))
</code>


Как правильно написать метод в классе? [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 2 года назад.

                        Улучшить вопрос

Есть два класса. Нужно написать метод в классе report которая будет возвращать id post по BlogHost.
<code>
class Post:
    def __init__(self, post_id: int = 1, BlogHost: int = 1):
        self.post_id = post_id
        self.Blog = Blog

class Report:
    def __init__(self, report_id: int = 1, posts: list = None):
        self.report_id = report_id
        self.posts = posts

    def search_post(self, Blog: int,

posts = []
for i in range(1, 9):
    posts.append(Post(post_id=i, BlogHost=1))
    posts.append(Post(post_id=i + 9, BlogHost=2))
    posts.append(Post(post_id=i + 18, BlogHost=3))

report_test = Report(report_id = 2)
report_1.search_post(4)
report_1.print_info()
</code>

Например, так:

def search_post(self, Blog: int):
    return [post.post_id for post in posts if post.Blog == Blog]

Проверка:

report = Report(42, posts)
print(report.search_post(2))

Вывод:

[10, 11, 12, 13, 14, 15, 16, 17]

Да, и "функция в классе" называется "метод класса".


Помогите, пожалуйста, с объяснением сути self.__class__ в питоне
Вот у меня есть такой код:

class Vehicle:
    def __init__(self, length, width):
        self.length = length
        self.width = width
    def info(self):
        print('information')
class Car(Vehicle):
    def __init__(self, length, width):
        super().__init__(length, width)
    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.__class__(self._length + other._length)
        else:
            print('damn')

какой именно класс проверяется в строке :
if isinstance(other, self.__class__)? Это имеется ввиду класс Vehicle или класс Car? И как это вообще понять?

вот так допилил ваш код чтобы работал:

class Vehicle:
    def __init__(self, length, width):
        self._length = length
        self._width = width

    def info(self):
        print(self._length, self._width)

class Car(Vehicle):
    def __init__(self, length, width):
        super().__init__(length, width)

    def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.__class__(self._length + other._length, self._width + other._width)
        else:
            print('damn')

какой именно класс проверяется в строке : if isinstance(other,
self.class)? Это имеется ввиду класс Vehicle или класс Car? И как
это вообще понять?

можно сделать print и посмотреть что именно выводится
проверяется именно с
Car
опять же легко проверить:

data1 = Car(10, 20)
data2 = Vehicle(30, 40)

data1 += data2

получим
damn
Вообще более корректно написать код так:
если невозможно из-за неправильного типа данных сделать сложение - выбрасываем исключение и вне класса его обрабатываем

class Vehicle:
    def __init__(self, length, width):
        self._length = length
        self._width = width

    def info(self):
        print(self._length, self._width)

class Car(Vehicle):
    def __init__(self, length, width):
        super().__init__(length, width)

    def __add__(self, other):
        if isinstance(other, type(self).__bases__):
            return self.__class__(self._length + other._length, self._width + other._width)
        else:
            raise TypeError

data1 = Car(10, 20)
data2 = Vehicle(30, 40)

try:
    data1 += data2
    data1.info()
except:
   print("damn 1")

try:
    data1 += 3
    data1.info()
except:
   print("damn 2")

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

def __add__(self, other):
    if isinstance(other, type(self).__bases__):
        return self.__class__(self._length + other._length, self._width + other._width)
    else:
        print('damn')
        return self

т.е. никакого сложения не произойдет, а вернется исходный класс и выдастся ваш текст
есть один недостаток - для
data1 += 3 все понятно - мы меняем существующий объект, но для
data = data1 + 3 результат будет несколько нелогичным -
data = data1


Проблема с генератором случайных паролей на discord.py
Пытаюсь сделать генератор паролей для дискорд бота на pyhton 3. Имеется вот такой код:
<code>
import discord
import json
import requests
import random
import string

s1 = string.ascii_letters
s2 = string.digits
s3 = string.punctuation

s = s1 + s2 + s3
pas = ""

for i in range(15):
    p = random.choice(s)
    pas += p
    if message.author == bot.user:
        return
    if message.content.startswith('!pass'):
        await message.channel.send(f"Пароль {pas}")
</code>
При команде !pass генерируется и выдается один пароль. При последующей команде !pass выдается этот же пароль. Как можно сделать так чтобы при команде !pass выдавался уже другой пароль?

Честно говоря, не разбираюсь в модуле discord, но генератор паролей можно реализовать так, затем просто запихать в функцию и сделать выполнение этой функции при вводе команды.
<code>
import random
import string

n = 0
l = ""
ascii = string.ascii_letters + str(string.digits)
while n <= 8: # где 8 - количество символов в нике
    l += random.choice(ascii)
    n += 1
print(l)
</code>


Получить из списка нужный элемент с учетом нулевого индекса
Нужно получить нужный элемент списка с учетом его первым индексом, к примеру у нас есть такой список:
<code>
listdata = [['ams', 1, 98],['online', 1, '22 billion'],['ingame', 1, '10 million']]
</code>
Как получить нужный элемент по ключевому названию, это всегда нулевый индекс к примеру мы хотим получить элемент с названием ams, как это можно сделать?

можно в лоб:

listdata = [['ams', 1, 98],['online', 1, '22 billion'],['ingame', 1, '10 million']]

key = 'online'
res = None
for obj in listdata:
    if key in obj:
        res = obj
        break

print(res)

хотя как я понимаю, надо искать только среди первых элементов ключ, а не среди всех значений?
тогда так к примеру:

key = 'online'
res = [obj for obj in listdata if obj[0] == key]
res = None if res == [] else res[0]

А вот так можно сделать в 1 строчку:

res = ([obj for obj in listdata if obj[0] == key] or [None])[0]


lambda проблема с выводом <function Player.set_skills.<locals>.<lambda> at 0x02B6A2F8>
Собственно, сам код.
<code>
class Player:
    def __init__(self, name):
        self.name = name
        self.lvl = 1
        self.xp = 0
        self.hp = 10
        self.streng = 1
        self.agility = 1
        self.damage = 1
        self.points = 5

    def set_skills(self):
        while 1:
            print(f"{self.streng} - Сила  |  {self.agility} - Ловкость") # Вывод
            print("1) +1 steng\n2)+1 agility\n3)-1 steng\n4)-1 agility")

            a = input(" : ")

            if a == "1":    self.streng = lambda: self.streng + 1 if self.points >= 1 else print("1")

a = Player("merka")
a.set_skills()
</code>
не могу понять, из за чего ругает лямбду. Вроде обращаюсь как и положено.
В чём проблема?

Вывод в принте - <function Player.set_skills.. at 0x02B6A2F8> - Сила  |  1 - Ловкость

во-первых в силе не хватает
th
во вторых

self.streng = lambda: self.streng + 1 if self.points >= 1 else print("1")

делает следующее

если
self.points >= 1, то
self.streng будет функцией
self.streng + 1
иначе выведется
1, а
self.streng будет
None - это результат работы функции

вам именно такая логика нужна было?
а вам надо без всяких лямбда делать:

if a == "1":
    self.streng = self.streng + 1 if self.points >= 1 else 1


Как создать exe файл?
У меня есть код, который с помощью
tkinter-а получает входные данные и формирует отчет (результат кода: создается один
txt и один
xls файл). Код работает, но когда я конвертирую его в
exe файл (библиотека
pyinstaller, еще попробовал
auto-py-to-exe тоже не получилось) файл создается, но не работает. В чем может быть проблема?

import tkinter as tk
def get_data():
    date1 = dateFrom.get()
    date2= dateTo.get()
    from pathlib import Path
    print("Начало даты")

    print("Конец даты")

    import os
    import pandas as pd

    mylist=[]
    for path in Path().glob('ot-*.log'):
        if f'ot-{date1}.log' <= path.name <= f'ot-{date2}.log':
            mylist.append(path.name)

    import re
    from datetime import datetime

    with open('final.txt', 'w', encoding='utf-8') as outfile:
        for fname in mylist:
            file_date = fname.replace('ot-', '').replace('.log', '')
            with open(fname, encoding='utf-8') as infile:
                for line in infile:
                    outfile.write(file_date + ' ' + line)

    sessions = {}

    data = []

    with open('final.txt', 'r', encoding='utf-8') as f:
        log = f.readlines()

    for line in log:

        if 'Login successful' in line:
            chunks = re.search(r"(.+?) Login successful from user (.+?) from .+ session=(.+?) .+", line)

            login_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p')

            sessions[chunks.group(3)] = {'login_time': login_time, 'username': chunks.group(2)}

        elif 'Closing session' in line:

            chunks = re.search(r'(.+?) Closing session.+session=(.+?) .+', line)

            logout_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p')
            session_id = chunks.group(2)

            if session_id not in sessions:
                print('Сессия {} закрыта, нет данных о входе'.format(session_id))
            else:
                login_time = sessions[session_id]['login_time']
                username = sessions[session_id]['username']
                session_time = logout_time - login_time
                #print('Пользователь {} зашел в {}, вышел в {}. Время сеанса- {} . ID сессии- {}'.format(username, login_time, logout_time, session_time, session_id))
                data.append([username, login_time,logout_time, session_id, session_time ])
                del sessions[session_id]

    df = pd.DataFrame(data, columns=['user_name', 'login', 'logout', 'session id', 'session_time' ])
    df.to_excel("test.xlsx")

win=tk.Tk()
dateFrom = tk.Entry(win)
dateFrom.grid(row=0,column=1)

dateTo=tk.Entry(win)
dateTo.grid(row=1,column=1)
tk.Button(win, text="Report", command=get_data).grid(row=2,column=1)

Следующие шаги позволили мне успешно построить EXE приложение используя свежий PyInstaller на Python 3.7 64-bit и Windows 10 64-bit, и это приложение в итоге запускалось и работало:

Добавить в конец скрипта (в последнюю строку)
tk.mainloop(). Возможно этого вообще у вас будет достаточно для работы. Если нет, выполните остальные шаги.

Использовать только Python версии
3.7 или меньше, если у вас его нет то установите. PyInstaller официально ещё не поддерживает Python
3.8 и больше. Хотя он инсталлируется на эти версии но в итоге не всегда или плохо работает.

В питоне 3.7 обновить PyInstaller до последней версии, следующей командой
C:\bin\Python37\python -m pip install --upgrade pyinstaller, где
C:\bin\Python37\python это полный путь к питону 3.7, для примера это путь на моём компьютере, на вашем папка будет отличаться.

В папке где лежит ваш скрипт (допустим он называется
script.py) выполнить команду
C:\bin\Python37\Scripts\pyinstaller --onefile --noupx script.py, где
C:\bin\Python37\ это полный путь с установкой питона 3.7, на вашем компьютере будет другая папка.

В папке рядом со скриптом появится папка
dist/ в ней будет
script.exe, это запускной файл финальный, вся программа это один EXE файл. Запускайте его и пробуйте. У меня такие шаги производят рабочий и успешно выполняющийся EXE.


BeautifulSoup не парсит блок внутри тега span
Алгоритм парсит нужный элемент span, но не может спарсить его содержимое.

...for pricelist in price:
       prices = pricelist.findAll('span')[2]
       print(prices)
           for divs in prices:
               div = divs.findAll('div')[1]
               print(div)

На выводе ожидаю:

<span><div class="column-title">avg</div><div>1.24$</div></span>
<div>1.24$</div>

но получаю:

<span><div class="column-title">avg</div><div>1.24$</div></span>
[]

В чём тут проблема? Заранее спасибо за ответ.

Вы написали лишний for, поэтому ничего и не работает, а вот так должно
<code>
for pricelist in price:
   prices = pricelist.findAll('span')[2]
   print(prices)
   div = prices.findAll('div')[1]
   print(div)
</code>


Как изменить переменную цикла в цикле for? Так что бы значения не повторялись
Попытаюсь объяснить.
Как сделать так: например в Blog 1 идут id 1-3, в Blog 2 идут 4-6, в Blog 3 идёт 7,8?
<code>
posts = []
for i in range(1, 9):
    posts.append(Post(post_id=i, Blog=1))
    posts.append(Post(post_id=i, Blog=2))
    posts.append(Post(post_id=i, Blog=3))
</code>

вариант 1:

posts = []

for i in range(1, 4):
    posts.append(Post(post_id=i, Blog=1))

for i in range(4, 7):
    posts.append(Post(post_id=i, Blog=2))

for i in range(7, 9):
    posts.append(Post(post_id=i, Blog=3))

вариант 2:

posts = []
for i in range(1, 9):
    if 1 <= i <= 3:
        posts.append(Post(post_id=i, Blog=1))

    if 4 <= i <= 6:
        posts.append(Post(post_id=i, Blog=2))

    if 7 <= i <= 8:
        posts.append(Post(post_id=i, Blog=3))


Необходимо объяснение работы кода и алгоритма [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 2 года назад.

                        Улучшить вопрос

Всем привет! Внизу я прикрепил пример кода написанный на python, я совсем не понимаю как он работает, пожалуйста, помогите с пониманием. Безумно буду благодарен за помощь!
<code>
k = 3 # сколько требуется выбрать животных
m = 4 # число видов
n = [2, 1, 1, 1]
total = 0 # число способов (результат)

def cnk(n, k):
  if k > n:
    return 0

  if n == k:
    return 1

  if k == 1:
    return n

  return cnk(n - 1, k - 1) + cnk(n - 1, k)

for i in range(0, len(n)):
  total += cnk(m - 1 - i, k - 1) * n[i]

print(total)
</code>

<code>
k = 3 # сколько требуется выбрать животных
m = 4 # число видов
n = [2, 1, 1, 1]
total = 0 # число способов (результат)

def cnk(n, k):
  if k > n:
    return 0  # базовый случай

  if n == k:
    return 1 # базовый случай

  if k == 1:
    return n # базовый случай

  return cnk(n - 1, k - 1) + cnk(n - 1, k) # тут 2 рекурсии их результаты складываются

for i in range(len(n)): # тут изменил но это тоже самое отсчет с 0 по умолчанию
  total += cnk(m - 1 - i, k - 1) * n[i]  # накапливаем результат
print(total)
</code>
Что конкретно код высчитывает я не знаю но
это динамическое программирование.
Использованы рекурсивные вызовы (функция вызывает сама себя)
базовые случаи нужны для того чтобы алгоритм не зациклился и формируют простейшее решение задачи которое динамически усложняется.
Про динамическое программирование:
Как правило,решить одну малую задачу проще, чем решить большую задачу, состоящую из маленьких.
Поэтому ДП предлагает следующее:

Берем одну подзадачу с переменной X1, об остальных подзадачах пока забываем.
После того, как найдем оптимальное решение для первой подзадачи, берем подзадачу для двух переменных Х1 и Х2, и решаем ее с помощью уже найденного решения для первой подзадачи.
Получаем оптимальноерешение уже для большей подзадачи, где фигурируют переменные Х1 и Х2. Затем, используя полученное решение, берем подзадачи, охватывающиеX1,X2 и Х3.
И так продолжаем пока не получим оптимальноерешение для всей общей задачи.

Таким образом, для решения поставленной задачи методом динамического программирования необходимо:

разбить задачу на отдельные части (подзадачи, этапы);
определить начальные условия;
решить этиподзадачи;
объединитьэти решенияв одно общее решение.


isinstance и self.__class__ в классах в питоне
Объясните, пожалуйста, что такое
self.__class__? То есть, например, когда используют функцию isinstance(), в скобках пишут объект и класс, имея ввиду проверку того, принадлежит ли этот объект этому классу. Но вот если есть такой класс:

class Rope:
    def __init__(self, length):
        self._length = length

    def __len__(self):
        # Переопределяем оператор len
        return self._length

    def __add__(self, other):
        # Переопределяем оператор +
        if isinstance(other, self.__class__):
            # Если второй объект (то с чем складываем) того же класса
            return Rope(self._length + other._length)  # возвращаем новый объект
        elif isinstance(other, (int, float)):
            # Если второй объект - число
            return Rope(self._length + other)  # возвращаем новый объект
        else:
            raise TypeError

почему у первого isinstance в скобках пишут
self.__class__? Что это вообще значит? Мы же хотим проверить принадлежит ли объект other тому же классу, что и self. Но ведь self принадлежит классу Rope. Почему бы тогда не написать так: isinstance(other, Rope)? Тем более, что, если написать просто Rope, то и смотрится попроще. В чем отличие (other,
self.__class__) от (other, Rope), если self принадлежит классу Rope? Заранее спасибо за ответ.

Обычно
isinstance(other, self.__class__) имеет смысл писать, если мы ожидаем, что от класса будут наследоваться другие классы, и мы хотим, чтобы тип сравнивался именно с типами тех дочерних классов, а не родительского
Rope.
Но в данном коде в этом особого смысла нет, т.к. дальше идёт
return Rope, то есть в дочернем классе этот метод наследовать без изменения не получится.
То есть для чего так написано в данном коде - надо спрашивать у автора этого кода, конкретно здесь это бессмыслено.
Если бы предполагалось, что от этого класса будут наследоваться другие, то ретурн надо было бы писать так:
return self.__class__(self._length + other._length)


Какие методы сравнения достаточно перегрузить в python чтобы можно было сортировать объекты собственного класса
у меня есть пользовательский класс и его нужно сортировать по специфичному признаку (от признака можно абстрагироваться), какие методы сравнения мне достаточно перегрузить чтобы сортировка работала правильно? потому что мне кажется что все методы перегружать избыточно

Нужно переопредилить метод
__lt__ либо
__gt__

class my1:
    def __lt__(self, other):
        print("__lt__")
        return True

class my2:
    def __gt__(self, other):
        print("__gt__")
        return True

sorted([my1(), my1()])
sorted([my2(), my2()])

Если переопредилить оба то будет использовать только
__lt__

class my:
    def __lt__(self, other):
        print("__lt__")
        return True

    def __gt__(self, other):
        print("__gt__")
        return True

sorted([my(), my()])


Каким образом можно заменить байт в файле, не перезаписывая его полностью?
Каким образом можно заменить байт в файле, не перезаписывая его полностью? У меня в файле большие бинарные данные в виде пар ключ-значение, и нужно каждый раз менять точечно.

Чисто программно это выглядит так:

with open('sample_data/README.md', 'rb+') as f:
    f.seek(1)
    f.write(bytes([ord('H')]))

В Google Colab проверил, поменял один байт в файле, который там всегда есть. В файле одна буква (вторая) поменялась:

THis directory includes a few sample datasets...

Пояснения:

файл открывается на чтение и запись
r+ и в двоичном режиме
b
на нужную позицию файла переход делается с помощью
file.seek
после перехода на нужную позицию можно как читать
read, так и писать
write нужное количество байтов
открывать файл лучше с использованием конструкции
with, чтобы закрылся он автоматически по окончании блока кода


не могу спарсить все посты канала
есть код
<code>
from telethon.sync import TelegramClient
from telethon import functions, types
import datetime

api_id=API_ID
api_hash='API_TOKEN'

with TelegramClient('name', api_id, api_hash) as client:
    result = client(functions.messages.GetHistoryRequest(
        peer='любой канал',
        offset_id=0,
        offset_date=0,
        add_offset=0,
        limit=100000,
        max_id=0,
        min_id=0,
        hash=0
    ))
    result=result.messages
    for i in range(len(result)):
        if result[i].message!='':
            nic=result[i].message

            print('--------------start-------------------------\n\n')
            print(nic)
            print('------------------end---------------------\n\n')

            with open('result.txt', 'ab') as f:
                f.write(nic.encode('utf-8'))
                f.write('\n\n\n'.encode('utf-8'))
</code>
Его задача - парсить посты с телеграм каналов, и записывать в текстовик. Но данный код парсит не все посты, а примерно 75 постов. Подскажите пожалуйста, как спарсить весь канал(или до заданного поста).
Есть вариант использовать offset_date=datetime.datetime(2020, 12, 10)  перебирать в цикле, но тогда посты будут повторяться

Согласно документации можно использовать
offset_id параметр для постраничного извлечения всей истории.
Для этого задаём некий относительно небольшой лимит например
limit=100 и дальше по 100 штук вычитываем, чтобы запросить следующую страницу просто указываем в
offset_id айди последнего сообщения т.е.
result[-1].id, после этого будут извлечены посты только идущие "старше" чем пост с заданным айди, т.е. вторая и т.д. страницы.
Полный доработанный код ниже:

from telethon.sync import TelegramClient
from telethon import functions, types
import datetime

api_id=12345
api_hash='API_TOKEN'

with TelegramClient('name', api_id, api_hash) as client:
    limit, cur_id = 100, 0
    while True:
        result = client(functions.messages.GetHistoryRequest(
            peer='любой канал', offset_id=cur_id, offset_date=0,
            add_offset=0, limit=limit, max_id=0, min_id=0, hash=0,
        ))
        result=result.messages
        if len(result) < limit:
            break
        for i in range(len(result)):
            if result[i].message!='':
                nic=result[i].message

                print('--------------start-------------------------\n\n')
                print(nic)
                print('------------------end---------------------\n\n')

                with open('result.txt', 'ab') as f:
                    f.write(nic.encode('utf-8'))
                    f.write('\n\n\n'.encode('utf-8'))
        cur_id = result[-1].id


Как вернуть значение из класса?
Суть проблемы:
Допустим есть класс Ball и если он создается без атрибута name, то нужно вернуть из метода ball_type значение "regular", а если есть любое другое значение, то вывести нужно "super".
Мой код:

class Ball (object):
    name = ""

    def ball_type (self):

        if self.name == "":
            return regular

        else:
            return super

print (Ball ().ball_type, "regular")
print (Ball ("super").ball_type, "super")

Вывод с консоли:

TypeError: __init__() missing 1 required positional argument: 'name'

надо добавить метод
__init__ который принимает не обязательный параметр
name.Но в этом случае вам надо вызвать
ball_type

class Ball (object):
    def __init__(self, name = ""):
        self.name = name

    def ball_type (self):
        if self.name == "":
            return "regular"
        else:
            return "super"

print (Ball().ball_type(), "regular")
print (Ball("super").ball_type(), "super")

либо создавать
ball_type в
__init__. В этом случае вызывать не надо

class Ball (object):
    def __init__(self, name = ""):
        self.name = name
        self.ball_type = "super" if name else "regular"

print (Ball().ball_type, "regular")
print (Ball("super").ball_type, "super")


Использование метода resample для преобразования структуры временного ряда
У меня есть временной ряд с месячными таймрефмами. Допустим, выглядит он так:

date    fz
2013-01-01  2.780300e+11
2013-02-01  3.646940e+11
2013-03-01  4.543250e+11
2013-04-01  5.842260e+11
2013-05-01  4.436440e+11
2013-06-01  4.171660e+11
2013-07-01  5.243020e+11
2013-08-01  4.557350e+11
2013-09-01  4.517440e+11
2013-10-01  7.839200e+11

Далее мне необходимо перевести его в квартальные таймфремы. Делаю я это, используя pandas.resample.

data_q = data.resample('QS', axis=0).mean()

На выходе получаю следующий датасет:

date    fz
2013-01-01  3.656830e+11
2013-04-01  4.816787e+11
2013-07-01  4.772603e+11
2013-10-01  7.839200e+11

Передо мной стоит задача выводить только полные кварталы. Следовательно, последний квартал в данном случае лишний, так как для его завершения не хватает 11 и 12 месяцев. Итоговая таблица должна была выглядеть следющим образом:

date    fz
2013-01-01  3.656830e+11
2013-04-01  4.816787e+11
2013-07-01  4.772603e+11

Что-то мне пока ничего не придумалось умнее этого:

res = df.groupby(df['date'].dt.to_period('Q')).filter(lambda x: len(x)==3).groupby(df['date'].dt.to_period('Q')).mean()

res:

                  fz
date
2013Q1  3.656830e+11
2013Q2  4.816787e+11
2013Q3  4.772603e+11

Думаю, стоит отметить, что если
date у вас является индексом, то перед указанной операцией нужно сделать
reset_index


Как преобразовать строку в hex формат цвета?
Как с помощью
input() получить
hex код цвета?
Обычно я делал это так
white = 0xffffff, но с преобразованием строки возникли проблемы
Мне нужно именно преобразование в
hex, а не запись строки
ffffff для дальнейшего преобразования в
rgb
Код:

class Color:

    def __init__(self, name, val):
        self.name = name
        self.value = hex(val)

    def __str__(self):
        return "\n{} - #{}\n".format(self.name, str(self.value).replace('0x', ''))

colors = []
for i in range(1):
    n = input('Name: ')
    v = input('Value: ')
    colors.append(Color(n, v))

Пример ввода:

Name: White
Value: ffffff

Вывод:

White - #ffffff

Я поменял:

class Color:

    def __init__(self, name, val):
        self.name = name
        self.value = int(val, 16) # преобразуем из 16-ричного числа в int

    def __str__(self):
        return "\n{} - #{}\n".format(self.name, hex(self.value).replace('0x', '')) # а тут обратно из int в 16-ричное

colors = []
for i in range(1):
    n = input('Name: ')
    v = input('Value: ')
    colors.append(Color(n, v))

print(colors[0])

Ввод:

Name: White
Value: ffffff

Вывод:

White - #ffffff


Как заменить значение в строке, FREERADIUS + APC Outlets
Всем привет!
Пытаюсь автоматизировать работу
freeradius для замены значений в конфиге.
Вводные данные:

Словарь для оборудования
APC в
radius/dictionary
Блок значений для пользователя в виде,

ipetrov
            Auth-Type = ntlm_auth,
            APC-Service-Type = Outlet,
            APC-Outlets = "1[1,3,5];"

где необходимо менять значения внутри квадратных скобок, всего значений от 1 до 24, одновременное количество значений неизвестно (т.е. пользователь может работать как с одним значением, например
APC-Outlets = "1[24];", так и с несколькими, например
APC-Outlets = "1[11,18,22];"
Пользователей, естественно, под сотню. А значит и таких блоков в файле
radius/users.conf будет под сотню. Не обязательно, что все сто пользователей будут работать одновременно, но иметь блоки пользователей необходимо заранее (а может, и нет?)

Задача:

Иметь возможность динамически менять значения в
APC-Outlets = "1[11,18,22];" для нужного пользователя.

Как это вижу я:

Пользователь запускает программу, программа принимает значение
username через команду
whoami, пользователь указывает нужные ему значения через запятую

./script.sh 1,2,3
ИЛИ программа предлагает ввести нужны значения через
input
Далее выбирается рабочая директория freeradius

workdir=/etc/freeradius/3.0/mods-config/files/
Программа находит блок пользователя
username в файле users.conf
Программа меняет значение внутри скобок
APC-Outlets = "1[];" на введенные значения из
input

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

Пробую создать блок целиком, меняя значение переменной:

username = input('Имя пользователя: ')
apc_outlets = str(input('Номера розеток: '))
file_path = ('test.conf')

block = (username + '\n'
                  '\t' + '\t' + '\t' + '\t' + "Auth-Type = ntlm_auth," + '\n'
                  '\t' + '\t' + '\t' + '\t' + "APC-Service-Type = Outlet," + '\n'
                  '\t' + '\t' + '\t' + '\t' + 'APC-Outlets = "1[' + apc_outlets + '];"' + '\n' + '\n')

with open(file_path, 'a+') as file:
  file.write(block)

Окей, как создавать блоки я понял, пробую менять значение внутри блока у переменной
apc_outlets:

with open(file_path, 'a+') as file:
    apc_outlets_new = apc_outlets
    apc_replaced = block.replace(apc_outlets, apc_outlets_new)
    file.write(apc_replaced)

И тут я понял, что метод
replace не меняет значение внутри строки, а записывает новую строку с новым значением, т.е. сейчас я имею два блока с одним юзернеймом, но с разными значениями
APC-Outlets = "1[];". Увы, это не то, что я хотел.
Ладно, попробуем посчитать строки, будем отталкиваться от них

username = input('Имя пользователя: ')
apc_outlets = str(input('Номера розеток: '))
apc = 'APC-Outlets = '
file_path = ('test.conf')

with open(file_path, 'a+') as file:
    n = 0
    for line in file:
        n += 1
        if username in line:
            print(username, 'найден в строке', n)
            n = 0
            for line_two in file:
                n += 1
                if apc in line_two:
                    print(apc, 'найден в строке', n)
                    break

Отлично! Я могу найти номер строки переменной
username, а потом найти номер нужной мне строки с параметрами
APC-Outlets = "1[];"
И все. Дальше не могу сдвинуться с места уже неделю. Я не могу понять, как можно осуществить замену значений без удаления всего содержимого файла (например, через
with open(file_path, 'r+') as file:) или без создания нового содержимого через метод
replace.
Есть ли какой-то вариант решения моей задачи? Как можно менять значение в подстроке, не меняя больше ничего?
Мне очень жаль, что пришлось написать такую простыню, но я не представляю, как можно описать задачу по иному.
Возможно, вы подскажете новый вариант решения этой задачи.

Вот реализовал центральную функцию
modify_config() которая делает нужные действия. Её вызывает некая
main() в которой читается файл плюс имя пользователя и аутлеты, модифицируется конфиг через
modify_config() и записывается результирующий конфиг.
Поиск и чтение/запись именно нужного конфиг файла не делал, т.к. посчитал что основная трудность это именно внесение изменений в конфиг.
Попробовать онлайн!

import re

def modify_config(text, user, outlets):
    cuser, res, ufound, fixed = None, '', False, False
    for iline, line in enumerate(text.splitlines()):
        if line.strip():
            m = re.fullmatch(r'^([a-zA-Z0-9_\-]+?)\s*$', line)
            if m:
                cuser = m.group(1)
                if cuser == user:
                    ufound = True
            else:
                m = re.fullmatch(r'^\s+(.+?)\s*\=\s*(.+?)\s*$', line)
                assert m, f'Unmatched line "{line}" at line {iline}!'
                l, r = m.group(1), m.group(2)
                if cuser == user and l == 'APC-Outlets':
                    m2 = re.fullmatch(r'^\".*\[(.*)\].*\"$', r)
                    assert m2, f'Unmatched outlets "{r}" at line {iline}!'
                    line = line[:m.span(2)[0] + m2.span(1)[0]] + outlets + line[m.span(2)[0] + m2.span(1)[1]:]
                    m3 = re.fullmatch(r'^\s+APC-Outlets\s*\=\s*\".*\[' + outlets + r'\]\.*\"\s*$', line)
                    assert m3, f'Unmatched resulting outlets "{line}" at line {iline}!'
                    fixed = True
        res += line + '\n'
    assert ufound, f'User "{user}" not found in config!'
    assert fixed, f'No modifications made!'
    return res

def main():
    user = input('Username: ').strip()
    outlets = ','.join([str(int(e)) for e in re.split(r'[\s,;]+', input('Outlets: ').strip()) if e.strip()])
    with open('0296.txt', 'r', encoding = 'utf-8-sig') as f:
        text = f.read()
    rtext = modify_config(text, user, outlets)
    with open('0296.txt2', 'w', encoding = 'utf-8') as f:
        f.write(rtext)

if __name__ == '__main__':
    main()

Пример входного файла:

ipetrov
            Auth-Type = ntlm_auth,
            APC-Service-Type = Outlet,
            APC-Outlets = "1[1,3,5];"
isidorov
            Auth-Type = ntlm_auth,
            APC-Service-Type = Outlet,
            APC-Outlets = "1[];"

Пример ввода консоли:

Username: ipetrov
Outlets: 1,2,3

Пример результирующего файла:

ipetrov
            Auth-Type = ntlm_auth,
            APC-Service-Type = Outlet,
            APC-Outlets = "1[1,2,3];"
isidorov
            Auth-Type = ntlm_auth,
            APC-Service-Type = Outlet,
            APC-Outlets = "1[];"


Сортировка словаря по значению
Требутеся отсортировать
Dict по значению
counter
Мой код ошибок не выдает, просто не выполняет задуманной функции.

import re, requests

url_input = input("Enter url: ")

url_checked = re.findall(r'https?://\S+', url_input)[0] # берем первый элемент

if url_input != url_checked: # проверка валидности ссылки
    print("Entered url is invalid")
else:
    pass

response = requests.get(str(url_checked)) # запрос на введенную ссылку

result = re.findall(r'/[A-Za-z.]+/', response.text) # фильтрация ссылок

result.sort() # сортировка по алфавиту

def count_words(List):
    Dict = {}
    for word  in List:
        if word in Dict:
            Dict[word] += 1
        else:
            Dict[word] = 1

    for word, counter in Dict.items():
        Dict.update({word : counter})

    for word, counter in Dict.items():
        sorted(Dict.items(), key = lambda Dict: Dict[1])
        print(f"{word} matches {counter} times")

count_words(result)

В прошлом вопрос я предлагал использовать
Counter. Сейчас снова предлагаю
В
Counter можно вывести слова, в порядке убывания через метод
most_common.
Весь код:

from collections import Counter
...

def count_words(items):
    for word, counter in Counter(items).most_common():
        print(f"{word} matches {counter} times")


Перенос вызова конструктора на следующую строку
Создаю 1 statement-ом класс
X и его инстанс
x, однако строка длинная, поэтому переношу с помощью
\:

x = create_class('X', 'int_field') \
    (int_field=42)

Но мне пишет:

PEP 8: E211 whitespace before '('

Никакого whitespace кроме переноса строки на 1-ой строке после
\ нет. Как тогда стилистически правильно надо переносить, чтобы не было никаких предупреждений?

Вот так:

x = create_class('X', 'int_field')(
    int_field=42
)

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


Реализация остановки цикла при зажатой клавиши Esc (Python)
Сама идея заключается в том что у меня есть бесконечный цикл, который манипулирует курсором мыши и для того, чтобы выйти из этого цикла мне нужно сделать условие при котором зажатая клавиша Esc (не имеет значения какая будет клавиша на деле), завершала работу цикла.
Проблема заключается в том, что во время работы цикла, Cmd считается не активным окном.

keyboard
Используйте модуль keyboard.

import keyboard
keyboard.wait("esc")
print("Escape!")

Активно ли окно или нет - не имеет значения. Он поймает нажатие.
Пример с циклом

# 7621ec305801.py
# Date: December 23th, 2020.
import keyboard
import time

n = 2
IsAlive = True
def Terminate():
    global IsAlive
    IsAlive = False
keyboard.add_hotkey('esc', Terminate)

while IsAlive:
    n = 2 + (n ** 2) % 2147000000
    print('\r', n, sep='')
    time.sleep(0.2)


Вызов lru_cache из functools
Известно, что в Python синтаксис:

@decorator
def function():
    return ...

аналогичен:

def function():
        return ...
function = decorator(function)

Но когда я попробовал реализовать подобное поведение с
lru_cache из
functools, он не сработал. Посмотрев повнимательнее, я увидел, что в сигнатуре вообще нет функции, которая принимается.
Теперь прошу объяснения, а каким образом мне вызвать
lru_cache без использования спец. синтаксиса @ в Python?

Ну в общем-то понятно, почему у вас "не работает", хотя другие ответы на ваш вопрос тоже правильные.

def fib(n):
    return 1 if n == 0 or n == 1 else fib(n-1) + fib(n-2)

Если вы обернёте функцию
fib в декоратор, то имя
fib получит кэшированная версия функции, поэтому кэшироваться будет как основной вызов функции
fib, так и рекурсивные вызовы
fib из самой себя.
А вот в случае, если вы вручную обернёте функцию
fib в
lru_cache и вызовете эту обёртку, то исходная функция
fib так и останется обычной, не кэшированной. И все рекурсивные вызовы будут к обычной версии
fib, от такого кэширования толку не будет, конечно.

cached_fib = lru_cache()(fib)
cached_fib(30)
print(cached_fib.cache_info())

Кэшированная функция вызвалась только один раз:

CacheInfo(hits=0, misses=1, maxsize=128, currsize=1)

Но! Это же питон. Вы можете присвоить кэшированную версию обратно в название исходной функции и всё будет кэшироваться:

fib = lru_cache()(fib)
fib(30)
print(fib.cache_info())

Кэш работает, потому что
fib теперь кэшированная:

CacheInfo(hits=28, misses=31, maxsize=128, currsize=31)

Итак, по идее ваш код изначально должен был сработать с кэшированием, просто вы не нашли правильную форму вызова декоратора вручную.


Что обозначает тильда в pandas?
Что значит в данном случае тильда?

df = df.loc[~non_numberic_profits]

В столбец
non_numberic_profits были заданы строки, которые не отвечают типу данных
float. То есть, не цифры, а какие-то буквы или символы.
Что в данном случае значит тильда? Какую функцию она выполняет?
После данной сроки последовала следующая строка кода `

df.profit = df.profit.apply(pd.to_numeric)

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

Это операция
not, которая часто применяется для инвертирования логических столбцов / значений.
Из документации:

Another common operation is the use of boolean vectors to filter the
data. The operators are:
| for or,
& for and, and
~ for not.

Пример:

In [475]: s = pd.Series(np.random.choice([True, False], size=5))

In [476]: s
Out[476]:
0     True
1     True
2    False
3     True
4     True
dtype: bool

In [477]: ~s
Out[477]:
0    False
1    False
2     True
3    False
4    False
dtype: bool

UPD: что делает команда
df = df.loc[~non_numberic_profits]:
данная команда фильтрует фрейм таким образом что выбираются только те строки фрейма для которых в соответствующей позиции
non_numberic_profits стоит значение
False.
NOTE: длина
non_numberic_profits должна совпадать с длиной (числом строк)
df.

UPD2: что делает команда
df.profit = df.profit.apply(pd.to_numeric):
это не очень эффективный способ преобразовать все значения столбца к числовому типу данных
int64 или
float64.
Лучше это делать так:

df["profit"] = pd.to_numeric(df["profit"], errors="coerce")


Смена мест ключей и значений в словаре
Есть словарь вида:

{'apple:': ['apple1,', 'apple2'],....}

Как мне поменять местами значения ключей и их значений?
Чтобы получился такой:

{'apple1:': 'apple', 'apple2:': 'apple',...}

если в лоб, то так:
<code>
arr = {'apple:': ['apple1,', 'apple2'], 'banana': ['banana1', 'banana2', 'banana3']}

res = dict()

for obj in arr.items():
    for elem in obj[1]:
        res[elem] = obj[0]

print(res)
</code>

пройти по всем ключам,
пройти по всем значениям для каждого ключа
создать новые элементы для нового словаря


Как разделить несколько строк в одном столбце?
Не получается отделить первые строки от столбца, как будто они заменяют индекс строк.
Моя цель избавиться в столбце от строчек с датами, и оставить только строки с числами, но разделитель игнорирует условие:
Данные CSV
<code>
import pandas as pd
fp='C:/Users/CodeMaker/Downloads/multiTimeline.csv'
data=pd.read_csv(fp)
new = data['Category: All categories'].str.split(',', n = 1, expand = True)
data["First Name"]= new[0]
exs=data.iloc[0:900,1:4]
print(exs)
</code>

Воспользуйтесь параметром “skiprows”:
<code>
df = pd.read_csv(fp, skiprows=1)
</code>


Как получить значение столбца с максимальным значением в другом столце?

df = pd.read_csv("out.csv", parse_dates=["Date"])
d = df.loc[df["Date"].dt.month == 1].groupby(df["Date"].dt.day).max()

Часть вывода:

14   2014-01-14     418
15   2014-01-15     468
16   2014-01-16     509

Нужно получить день 16 т.к значение максимальное.

воспользуйтесь DataFrame.nlargest():

res = d.nlargest(1, columns=["Berri1"])

если нужно получить значение индекса (
16):

res = d["Berri1"].idxmax()


Определить какое кол-во людей было в январе и в какой день
Есть CSV файл с данными даты в форматe год-месяц-день (1 столбец) и второй столбец это кол-во человек.
Как определить какое кол-во людей было в январе и в какой день?

Date       Per
2014-01-01   0
2014-01-02   3
2014-01-03   5
2014-01-10   10

Попытка решения:

ss = pd.read_csv('out.csv')
ss['Date'].value_counts()

df = pd.read_csv("out.csv", parse_dates=["Date"])
d = df.loc[df["Date"].dt.month == 1].groupby(df["Date"].dt.day).sum()


как сделать уникальный префикс для сервера discord.py?
Подскажите, пожалуйста, как сделать уникальный префикс для каждого сервера на котором находится бот. Допустим чтобы на одном сервере пользователь мог поставить для бота тот префикс, который хочет и это бы не влияло на префиксы на других серверах. Необходимо чтобы работало с декоратором
@bot.command(). Возможно ли обойтись без
on_message?

В аргумент
command_prefix конструктора бота можно передавать функцию, которая будет возвращать необходимый префикс в зависимости от сообщения: Bot.command_prefix

GUILD_PREFIXES = {840938031829325150: "?"}

def guild_based_prefix(bot, message):
    return GUILD_PREFIXES.get(message.guild.id, "!")

bot = commands.Bot(prefix=guild_based_prefix)

Таким образом, на сервере с ID
840938031829325150 все команды будут выполняться с префиксом
?, а на остальных серверах - с префиксом
!


Как разложить JSON структуру в плоскую таблицу (CSV)?
Есть такая JSON структура (упрощенный вариант):

[
    {
        "Код": "p12",
        "Название": "HN088",
        "Экстра": {
            "Ширина": "360 мм",
            "Глубина": "175 мм",
            "Толщина": "22.8 мм",
            "Вес": "2100 г",
            "Цвет": "Серый"
        }
    },
    {
        "Код": "p14",
        "Название": "HN092",
        "Экстра": {
            "Ширина": "300 мм",
            "Глубина": "270 мм",
            "Толщина": "19.4 мм",
            "Вес": "2330 г"
        }
    }
]

Такой JSON на раз раскладывается в Pandas/tablib итп. И все бы ничего, да в итоге нужна плоская таблица именно такого формата:

|-----------------------------------------------------------------------------------------------------------------|
| Код | Название |  Тип   | Значение |   Тип   | Значение |   Тип   | Значение | Тип | Значение | Тип  | Значение |
|-----------------------------------------------------------------------------------------------------------------|
| p12 |  HN088   | Ширина | 360 мм   | Глубина |  175 мм  | Толщина | 22.8 мм  | Вес |  2100 г  | Цвет |  Серый   |
| p14 |  HN092   | Ширина | 300 мм   | Глубина |  270 мм  | Толщина | 19.4 мм  | Вес |  2330 г  | Цвет |          |
|-----------------------------------------------------------------------------------------------------------------|

Т.е. каждый ключ у
"Экстра" (вложенного словаря) становится значением в столбце
Тип на всю высоту самой таблицы (даже если ключ встречается хотя бы один раз, как здесь
"Цвет"), которая зависит от количества корневых словарей в корневом списке JSON, а значение ключа должно соотносится только к своему ключу. Как-то запутанно звучит, извините.
Примеры выглядят понятнее, чем моя попытка объяснить.
В общем, с Pandas мне удается разложить только вида:

------------------
Код | Название | Экстра.Ширина | Экстра.Глубина | Экстра.Толщина | Экстра.Вес | Экстра.Цвет
p12 |  HN088   |    360 мм     |    175 мм      |     22.8 мм    |    2100 г  |    Серый
p14 |  HN092   |    300 мм     |    270 мм      |     19.4 мм    |    2330 г  |

Может, кто-то сталкивался с похожим или знает, как такое сделать на том же Pandas?
Или, что было бы лучше, на чистом Python, чтобы увидеть сам алгоритм и быстрее понять, а не подкапотную магию Pandas.

Решение с минимальным количеством "костылей":

df = (pd
      .json_normalize(data)
      .set_index(["Код", "Название"])
      .rename(columns=lambda c: c.replace("Экстра.", "")))
res = pd.DataFrame(index=df.index)
for i, col in enumerate(df.columns[::-1]):
    res.insert(0, f"Значение.{i}", df[col])
    res.insert(0, f"Тип.{i}", [col] * len(df))
res = res.rename(columns=lambda c: c.split(".")[0]).reset_index()

результат:

In [409]: res
Out[409]:
   Код Название     Тип Значение      Тип Значение      Тип Значение  Тип Значение   Тип Значение
0  p12    HN088  Ширина   360 мм  Глубина   175 мм  Толщина  22.8 мм  Вес   2100 г  Цвет    Серый
1  p14    HN092  Ширина   300 мм  Глубина   270 мм  Толщина  19.4 мм  Вес   2330 г  Цвет      NaN


Узнать название кнопки
Имею файл
index.html следующего вида:

...
<body>
  <a href={{ url_for('on_create_model') }}><button>+RandomForest</button></a>
  <a href={{ url_for('on_create_model') }}><button>+GradientBoosting</button></a>
</body>
...

Как видно, при нажатии на кнопки вызывается функция
on_create_model. Однако по моей задумке, поведение этой функции должно меняться в зависимости от текста под
button (RandomForest или GradientBoosting). Могу ли я как-то передать текст кнопки в мою функцию, чтобы, например, банально напечатать этот текст в консоли.

@app.route('/model_creation')
def on_create_model():
    # model_name это как раз либо RandomForest либо GradientBoosting
    print(model_name)
    return render_template(
        'something.html',
        model_name=model_name,
    )

Или возможен другой подход для решения моей задачи? Желательно не выходить за пределы Flask. (т.е. без использования javascript и тому подобное)
Спасибо

Можно передать название модели через url-параметр:

...
<body>
  <a href={{ url_for('on_create_model', model_name='RandomForest') }}><button>+RandomForest</button></a>
  <a href={{ url_for('on_create_model', model_name='GradientBoosting') }}><button>+GradientBoosting</button></a>
</body>
...

При этом аннотация обработчика должна включать новый параметр:

@app.route('/model_creation/<string:model_name>')
def on_create_model(model_name):
    print(model_name)
    ...


Как можно ввести три команды в CMD друг за другом?
Как можно ввести три команды друг за другом, чтобы не открывалась CMD, вводилась команда, закрывалась и открывалась следущяя CMD, в которую вводилась вторая команда, а чтобы все три команды вводились в один CMD.
Мне надо, чтобы вводилась команда
cd /, после нее
cd C:\Sherik, а после нее команда
"pyinstaller -F -w " + name + ".py".

Для Windows CMD - можно использовать
& как разделитель комманд:

cd /d C:\Sherik & "pyinstaller -F -w ..."

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

cd /d C:\Sherik && "pyinstaller -F -w ..."


Как при запросе чисел в генераторе списка реализовать "счетчик" j-го элемента?

a = [i for i in (int(input('Введите число', j)) for j in range(5)) if i % 10 == 0]

суть в том, чтобы при запросе числа было выведено текстом, какое число по счету мы запрашиваем, например

Введите число 1:
23
Введите число 2:
.....

но при выше показанном коде выдает ошибку

input принимает только один аргумент поэтому строку надо объединить с числом. Это возможно сделать так:

input('Введите число ' + str(j) +": ")

либо используя
f-строки

input(f'Введите число {j}: ")

но будет выводиться не с
1, а с
0.Это можно исправить заменив
j на
j + 1 либо изменив
range на
range(1, 6)


Как в генератор списка добавить условие?
пытался сделать так, но не работает
<code>
a = [int(input()) for i in range(5) if i % 10 == 0]
</code>
то есть нужно добавить условие, чтобы в список добавлялись только числа делящиеся на 10 без остатка

Разделите чтение и фильтрацию:

a = [i for i in (int(input()) for _ in range(5)) if i % 10 == 0]
#    ---------- ================================ --------------
#        ^          читаем пять целых чисел            ^
#        |                                             |
#        -----------------------------------------------
#                   отбираем кратные десяти

Тоже самое по частям:

# читаем пять целых чисел
# важное: мы их не читаем. Генератор ничего не читает пока его не попросят.
g = (int(input()) for _ in range(5))

# просим генератор прочитать числа и фильтруем их
a = [i for i in g if i % 10 == 0]


Процесс не может получить доступ к файлу: файл занят другим процессом
Хотел создать что-то по типу builder на python, у меня была такая задумка: создать текстовый документ в него вписать код после чего переиминовать файл txt в py и ввести в cmd с помощью subprocess команду cd и директорию файла, после чего командой pyinstaller откомпилировать файл в exe, но когда я запустил builder возникла вот такая ошибка:

        Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\epicb\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in
    __call__
        return self.func(*args)
      File "C:\Users\epicb\Desktop\Sherat\Sherik.py", line 243, in <lambda>
        b = tk.Button(self, text='build', command=lambda: buildsettings(self))
      File "C:\Users\epicb\Desktop\Sherat\Sherik.py", line 191, in buildsettings
            os.rename("C://Sherik/" + name + ".txt", "C://Sherik" + name + ".py")
        PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят
        другим процессом: 'C://Sherik/name.txt' -> 'C://Sherikname.py'

вот код отвечающий за создание билда:

file = open("C:\Sherik/" + name + ".txt", "w", encoding="utf-8")
file.write("import subprocess\n")
file.write("")
file.write("try:\n")
file.write("text = subprocess.check_output(\n")
file.write("['ipconfig'],\n")
file.write("stderr=subprocess.STDOUT,\n")
file.write(").decode('cp866')\n")
file.write("except subprocess.CalledProcessError as e:\n")
file.write("text = str(e)\n")
file.write("text = text.splitlines()[18][39:]")
os.rename("C://Sherik/" + name + ".txt", "C://Sherik" + name + ".py")

file.close() перед перемещением


Как удалить все кроме одной строки?
Если есть переменная text как можно из этой переменной удалить все строки кроме 19 строки (всего 54 строки) и в оставшийся 19 строке удалить первые 36 символов? ничего в интернете не нашел


Можно ли задать в функцию параметр по умолчанию без создания класса?
Пример кода:
<code>
def how_many_light_sabers_do_you_own (name):

    if name == "Zach":
        return 18
    else:
        return 0
</code>
Нужно чтобы при вызове функции без аргумента, функция возвращала ноль обратно.

def how_many_light_sabers_do_you_own(name=None):
    if name is None:
        return 0
    if name == "Zach":
        return 18
    else:
        return 0


Как вызвать cmd команды и записывать данные ответа от cmd?
У меня вопрос: Как можно вызвать консольную команду и записать НЕ ВСЕ данные в консоль
пробовал через file.write os.system('ipconfig')` но не понял как можно в таком случае записать данные в переменную

os.system для этой задачи не подойдет, используйте
subprocess
Примерно так:

import subprocess

try:
    text = subprocess.check_output(
        ["ipconfig"],
        stderr=subprocess.STDOUT,
    ).decode('cp866')

except subprocess.CalledProcessError as e:
    text = str(e)

print(text)


Алгоритм для игрового автомата в Python [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 2 года назад.

                        Улучшить вопрос

Есть 3 столбца и 3 строки в самом автомате. Задача следующая: Если из возможных символов (А, 7, Wild) в одну строку выпадают одинаковые символы (Также нужно учитывать, что комбинации могут выпасть сразу и на 1-ой, на 2-ой и на 3-ей строке), то нужно добавить к балансу 10, а также в самом автомате с помощью модуля
Colorama выделить зелёным цветом символы, которые "вошли" в комбинацию.

import random
import colorama
from colorama import *

colorama.init()

symbols = ["A", "7", "Wild"]
balance = 0
leave = False

def menu():
    print(Fore.GREEN + "\nБаланс: " + str(balance))
    print(Fore.CYAN + "1 - Играть")
    print(Fore.CYAN + "2 - Выход")

def roll():
    symb = []
    print(Style.RESET_ALL)
    for i in range(9):
        symb.append(random.choice(symbols))

    for x in range(len(symb)):
        print(symb[x] + " | ", end=" ")
        if x == 2 or x == 5 or x == 8:
            print("\n")

def casino():
    roll()

menu()

while not leave:
    cmd = int(input(Fore.YELLOW + "Команда: "))
    if cmd == 1:
        casino()
    elif cmd == 2:
        print(Fore.RED + "Пока :(")
        exit()

Я для каждого ряда col сделал список символов(col_1, col_2, col_3) по 3 штуки. И после принта всего автомата проверил что бы все элементы списка второго ряда(col_2) были одинаковыми. Глобализировал balance что бы его редактировать внутри метода. Если хотите проверять другие колонки, скопируйте проверку и поменяйте переменную col_2 на col_3 или col_1 для 3 или 1 рядка соответственно. Исправил возможную ошибку если в инпут нечего не ввести или ввести не число(с помощю try)
<code>
import colorama
from colorama import *

colorama.init()

symbols = ["A", "7", "Wild"]
balance = 0
leave = False

def menu():
    print(Fore.GREEN + "\nБаланс: " + str(balance))
    print(Fore.CYAN + "1 - Играть")
    print(Fore.CYAN + "2 - Выход")

def roll():
    global balance
    col_1 = []
    col_2 = []
    col_3 = []
    print('balance', balance)
    print(Style.RESET_ALL)
    for i in range(3):
        col_1.append(random.choice(symbols))
        col_2.append(random.choice(symbols))
        col_3.append(random.choice(symbols))

    symb = col_1 + col_2 + col_3
    for x in range(len(symb)):
        print(symb[x] + " | ", end=" ")
        if x in (2, 5, 8):
            print("\n")
    if col_2[0] == col_2[1] and col_2[1] == col_2[2]:
        print(Back.GREEN + 'Вы выиграли')
        print(Back.BLACK)
        balance += 10
    else:
        print(Back.RED + 'Вы проиграли')
        print(Back.BLACK)

def casino():
    roll()

menu()

while not leave:
    try:
        cmd = int(input(Fore.YELLOW + "Команда: "))
        if cmd == 1:
            casino()
        elif cmd == 2:
            print(Fore.RED + "Пока :(")
            exit()
    except ValueError:
        print('введите число')
</code>


Python - как обратиться к классу в классе
Нужно получить table_name, но при
ClassName.Meta.table_name возникает ошибка.

class ClassName(BaseModel):
    rows = ..
    class Meta:
        table_name = 'abv'

Как правильно это сделать?
Это peewee.

Попробуйте работать через
_meta:

print(ClassName._meta.table_name)
# abv


Не могу передать значения Combobox и Entry в функцию. Python tkinter GUI
В Python, тем более в tkinter я новичок, пишу калькулятор калорий в качестве семестровой работы. Возникла проблема передачи значений dishes_box.get() и grams.get() из дочернего окна, которое вызвано функцией, в функцию add_a_dish(), которая является командой для кнопки. Пробовал использовать и lambda выражения и функцию partial, но результата не добился.
<code>
def choose_dish(name, massa):
    name = dishes_box.get()
    base_of_dishes = open('dishes.txt', encoding= 'UTF-8')
    for line in base_of_dishes:
        line = line.split(',')
        if line[0] == str(name):
            bilok_now = float(line[1]) * (float(massa)/100)
            jir_now = float(line[2]) * (float(massa)/100)
            vyg_now = float(line[3]) * (float(massa)/100)
            calories_now = float(line[4]) * (float(massa)/100)
            break
            base_of_dishes.close()

def add_a_dish():

    a = []
    base_of_dishes = open('dishes.txt', encoding= 'UTF-8')
    for line in base_of_dishes:
        line = line.split(',')
        a.append(str(line[0]))
    base_of_dishes.close()

    grams = tk.IntVar()

    window = tk.Toplevel(master=calculator_window)
    window.geometry('300x200')
    window.title('Додати страву')

    tk.Label(window ,text='Оберіть страву з списку введіть її приблизну вагу:', font = 'Arial 8').pack()

    dishes_box = tk.ttk.Combobox(window, values=a)
    dishes_box.pack()
    x = dishes_box.get()
    tk.Label(window, text='Вага в грамах:').pack()
    tk.Entry(window, textvariable=grams).pack()
    tk.Button(window, text='ОК', command = partial(choose_dish, x, grams.get())).pack(pady=10)
</code>
Заранее благодарен)

Вместо
partial нужно использовать лямбду, т.к. у вас методы
.get от полей вызываются сразу при создании кнопки, а нужно чтобы вызывались только после нажатия на кнопку:

tk.Button(window, text='ОК', command=lambda: choose_dish(dishes_box.get(), grams.get())).pack(pady=10)

Ну и в
choose_dish убрать строку
name = dishes_box.get(), т.к. название уже передается через параметр
name.


tkinter .bind не получается получить адрес
При наведении мыши на один из созданных прямоугольников, выводится не верно какой он по номеру
<code>
from tkinter import *
tek_k = 0
id_k_new = 0
id_k_posl = 0
spisok_k = {}
class Glavn_okno(Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x500+200+0")
        self.resizable(0, 0)

        self.canvas = Canvas(self, width=573, height=561, highlightthickness=0)
        self.canvas.place(x=0, y=0)
        self.button = Button(self.canvas, text="Нажми", command=self.cikl_knop).place(x=400, y=450)
        self.bind('<Motion>', self.mouse_wheel_knop)

    def mouse_wheel_knop(self, event):
        global id_k_posl
        global spisok_k
        global id_k_new
        global tek_k
        for i in range(id_k_posl):
            tek_k = i + 1
            spisok_k["knop{}".format(i + 1)].bind("<Enter>", self.fun_nag)

        # Ф-я создания к
    def cikl_knop(self):
        global spisok_k
        global id_k_new
        global id_k_posl
        global tek_k
        id_k_new += 1
        for i in range(id_k_posl, id_k_new):
            spisok_k["knop{}".format(i + 1)] = Canvas(self.canvas, width=556, height=46, highlightthickness=0)
            spisok_k["knop{}".format(i + 1)].place(x=50, y=50 + 50 * i)
            spisok_k["knop{}".format(i + 1)].create_rectangle(0, 0, 150, 60,outline="#fb0", fill="#fb0")
            id_k_posl += 1

    def fun_nag(self, event):
        global tek_k
        global id_k_posl
        print("Текущая к", tek_k)

if __name__ == "__main__":
    osn = Glavn_okno()
    osn.mainloop()
</code>

Несколько комментариев к вашему коду:

Если перешли к ООП, то не используйте
global - используйте поля объекта
Не понятно зачем при нажатии кнопки создается новый холст. Получается куча холстов по одному прямоугольнику в каждом. Если вам просто нужен аналог кнопок, но без "рельефа" - используйте просто
Label.
Не понятен смысл цикла при нажатии кнопки. Нужно просто создать один прямоугольник без цикла.
Привязку обработчиков к событиям нужно делать один раз - при создании объекта, а не в цикле при каждом движении мыши
Давайте функциям и переменным понятные имена, не сокращайте слишком сильно

Ниже в примере создается один холст, при нажатии на кнопку создается один прямоугольник, каждый следующий смещен вниз от предыдущего. Для привязки события к фигуре (прямоугольнику) используется метод холста
tag_bind, в качестве обработчика передается лямбда, через которую передается номер прямоугольника, который при срабатывании события передается уже внутрь настоящего обработчика (таким образом, обработчик "помнит", к какому объекту он привязан).

import tkinter as tk

class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()

        self.canvas = tk.Canvas(self)
        self.canvas.pack()
        tk.Button(self, text="Создать прямоугольник", command=self.new_rectangle).pack()

        self.rect_counter = 0
        self.rect_y = 0

    def new_rectangle(self):
        rectangle_id = self.canvas.create_rectangle(0, self.rect_y, 150, self.rect_y+60, outline="#fb0", fill="#fb0")
        self.rect_counter += 1
        self.canvas.tag_bind(rectangle_id, '<Enter>',
            lambda event, rect_number=self.rect_counter: self.on_hover(event, rect_number))

        self.rect_y += 70  # (высота прямоугольника + 10, чтобы был зазор)

    def on_hover(self, event, rect_number):
        print("Мышь над прямоугольником", rect_number)

if __name__ == "__main__":
    root = MainWindow()
    root.mainloop()


Вторичное окно tkinter отказываеться закрываться
Я столкнулся с проблемой: при открытии вторичного окна по нажатию кнопки оно должно создавать папку на диске с и закрываться но после создания папки оно не закрываеться, у меня Python 3.8 работаю в Python Idle
вот часть кода:
<code>
def setup():
    setup = Toplevel()
    setup.geometry("300x300")
    setup.title("setup")
    setup["bg"] = "white"
    setup.resizable(width=False, height=False)
    setup.iconbitmap('setup.ico')
    b = tk.Button(setup, text='setup', command= lambda: startsetup())
    b.place(x=260, y=274)

def startsetup():
    os.mkdir("c://TEST")
    setup.destroy()
</code>

Переменная
setup в функции
setup - локальная (кстати, называть разные вещи одинаковыми именами - это отличный способ запутать самого себя, поэтому лучше так не делать). Функция
startsetup эту переменную не видит, а видит только функцию
setup под этим именем (при запуске кода из консоли после нажатия на кнопку у вас пишет что у функции
setup нет метода
destroy).
Один из вариантов решения - расположить функцию
startsetup внутри функции
setup, тогда функция
startsetup будет видеть локальные переменные внешней функции:

def setup():
    setup = Toplevel()
    setup.geometry("300x300")
    setup.title("setup")
    setup["bg"] = "white"
    setup.resizable(width=False, height=False)
    setup.iconbitmap('setup.ico')

    def startsetup():
        os.mkdir("c:/TEST")  # Прямые слеши не нужно экранировать - только обратные
        setup.destroy()

    b = tk.Button(setup, text='setup', command=startsetup)  # вместо лямбды без параметров можно передавать саму функцию
    b.place(x=260, y=274)


Как в cmd скрипте запустить сначала окружение, а потом сам скрипт(python)
Нужен батник который за раз зайдёт в окружение и запустит скрипт.
Вот так просто не получается:
<code>
@.\venv\Scripts\activate.bat
@.\bot_main.py
@pause
</code>

в bot_main.py первой строчкой (для запуска через
py(двойным кликом по файлу)):

#!полныйпуть\venv\bin\python.exe

или пропиши путь к site-packages в sys.path в самом скрипте
или пропиши переменные окружения PYTHONHOME
или просто копирни батник activate.bat и там в конце допиши старт скрипта - что, пожалуй, самый простой вариант.


Как можно отфильтровать по первой букве строкового столбца?
У меня есть DataFrame
dat, состоящий из нескольких столбцов, в том числе
OS и
Type. Нужно создать новый DataFrame (или отфильтровать исходный), чтобы в столбце
OS (в нем перечислены разные операционные системы) была только "Windows", а в столбце
Type - только архитектуры, название которых начинается на "i". Первую задачу я выполняю:

da = dat[dat.OS == 'Windows']

Вторую часть пытаюсь выполнить разными способами, но не получается. Например:

df = da[da.Type[0] == 'i']

Как можно отсортировать DataFrame по первой букве элементов столбца? Или как удалить все строки, у которых элементы столбца "Type" начинаются не с "i"?

Небольшое отступление - судя по деталям и по коду из вопроса, вопрос о том, как фильтровать данные, а не о сортировке (упорядочивание порядка записей, не меняя их количества).
Кроме варианта решения, предоставленного @CrazyElf, можно использовать следующие варианты:
вариант 1

da.loc[da['Type'].str.match('i')]

вариант 2

da.loc[da['Type'].str.contains('^i')]

вариант 3

da.loc[da['Type'].str[0] == 'i']

вариант 4

da.loc[da['Type'].str[:1] == 'i']

вариант 5

da.loc[da['Type'].str.slice(0, 1) == 'i']


Почему словарь ключ:список заполняется в цикле одним последним списком, хотя ключи и списки уникальные?
Надо создать словарь ключом в котором будет имя, а значением список строк, в котором присутствует это имя и индекс от 0 до 2:

{name : [url1+name+url2+0, url1+name+url2+1, url1+name+url2+2]}

Вот мой код:

def get_urls():
    """
        Returns a dictionary with each element being:
        {name : [url1+name+url2+0, url1+name+url2+1, url1+name+url2+2]}
    """
    url1 = "string1-"
    url2 = "-string2-"
    temp_l = [''] * 3
    names = ['alex', 'john', 'max', 'yen']
    main_dict = {}

    for name in names:
        for i in range(3):
            temp_l[i] = url1 + name + url2 + str(i)
        main_dict[name] = temp_l
        print(temp_l)
    return main_dict

dic = get_urls()
for d in dic:
    print(d, dic[d])

Если выводить список в каждой итерации цикла, получается:

['string1-alex-string2-0', 'string1-alex-string2-1', 'string1-alex-string2-2']
['string1-john-string2-0', 'string1-john-string2-1', 'string1-john-string2-2']
['string1-max-string2-0', 'string1-max-string2-1', 'string1-max-string2-2']
['string1-yen-string2-0', 'string1-yen-string2-1', 'string1-yen-string2-2']

Как и должно быть, но конечный словарь весь заполняется последним списком:

alex ['string1-yen-string2-0', 'string1-yen-string2-1', 'string1-yen-string2-2']
john ['string1-yen-string2-0', 'string1-yen-string2-1', 'string1-yen-string2-2']
max ['string1-yen-string2-0', 'string1-yen-string2-1', 'string1-yen-string2-2']
yen ['string1-yen-string2-0', 'string1-yen-string2-1', 'string1-yen-string2-2']

Так же  пробовал через 'main_dict.update' - результат такой же. Значения всех ключей заполняются последним списком.

Ключевая ошибка в этой строке (в теле цикла
for name in names):

main_dict[name] = temp_l

Вы до этого выделили в памяти список, обозначили его
temp_l.
Потом чему-то присвоили, а потом ссылку на него присвоили элементу словаря.
В следующей итерации вы изменили список... В этот момент уже что-то идет не так.
Элемент словаря из прошлой итерации тоже поменялся. А в конечном итоге, все элементы словаря смотрят на одну и ту же область памяти.
Решение:
Делать копию списка, например, так:

main_dict[name] = temp_l[:]

Или любым другим способом, который можно найти в поисковике.


При создании бота в телеграмме для пересылки сообщения по ключевому слову

import telebot

bot = telebot.TeleBot('token')

my_id = int('1047621278')

@bot.message_handler(commands=['start'])
def start(message):
    print(message)

@bot.message_handler(func=lambda message: 'ключевое слово' in message.text.lower(), content_types=['text'])
def repeat_all_messages(message):
    bot.forward_message(my_id, message.chat.id, message.id)

bot.polling(none_stop=True)

ошибка:

Traceback (most recent call last):
  File "C:\Users\sharafutdinovbd\PycharmProjects\bottelegramm\bot telega2.py", line 18, in <module>
    bot.polling(none_stop=True)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 455, in polling
    self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 513, in __threaded_polling
    raise e
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 478, in __threaded_polling
    polling_thread.raise_exceptions()
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\util.py", line 88, in raise_exceptions
    raise self.exception_info
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\util.py", line 69, in run
    task(*args, **kwargs)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 296, in __retrieve_updates
    self.process_new_updates(updates)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 357, in process_new_updates
    self.process_new_messages(new_messages)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 383, in process_new_messages
    self._notify_command_handlers(self.message_handlers, new_messages)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 2127, in _notify_command_handlers
    if self._test_message_handler(message_handler, message):
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 2093, in _test_message_handler
    if not self._test_filter(message_filter, filter_value, message):
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 2114, in _test_filter
    return test_cases.get(message_filter, lambda msg: False)(message)
  File "C:\Users\sharafutdinovbd\AppData\Local\Programs\Python\Python39\lib\site-packages\telebot\__init__.py", line 2111, in <lambda>
    'func': lambda msg: filter_value(msg)
  File "C:\Users\sharafutdinovbd\PycharmProjects\bottelegramm\bot telega2.py", line 13, in <lambda>
    @bot.message_handler(func=lambda message: '@temamorg' in message.text.lower())
AttributeError: 'NoneType' object has no attribute 'lower'

Process finished with exit code 1

Ошибка
'NoneType' object has no attribute 'lower' значит что ваш
message.text.lower() ничего не возвращает, как можно что то делать с пустотой?)
¯\_( ͡° ͜ʖ ͡°)_/¯¯\_(ツ)_/¯
Правильное построение бота -

import telebot

bot = telebot.TeleBot('token')

my_id = 1047621278

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, "Привeт")

@bot.message_handler(content_types=['text'])
def repeat_all_messages(message):
    if 'ключевое слово' in message.text.lower():
        bot.forward_message(my_id, message.chat.id, message.id)

bot.polling(none_stop=True)


Как записывать обновляющийся словарь в CSV?
Есть словарь, который нужно записать в CSV.
Сам словарь:
<code>
{'custom': False, 'chart_mode': 1, 'select': True, 'visible': True, 'session_deals': 0, 'session_buy_orders': 0, 'session_sell_orders': 0, 'volume': 1, 'volumehigh': 16, 'volumelow': 1, 'time': 1608611959, 'digits': 2, 'spread': 1, 'spread_float': True, 'ticks_bookdepth': 32, 'trade_calc_mode': 33, 'trade_mode': 4, 'start_time': 0, 'expiration_time': 0, 'trade_stops_level': 0, 'trade_freeze_level': 0, 'trade_exemode': 2, 'swap_mode': 0, 'swap_rollover3days': 3, 'margin_hedged_use_leg': False, 'expiration_mode': 15, 'filling_mode': 3, 'order_mode': 127, 'order_gtc_mode': 0, 'option_mode': 0, 'option_right': 0, 'bid': 47.66, 'bidhigh': 47.87, 'bidlow': 47.59, 'ask': 47.67, 'askhigh': 47.88, 'asklow': 47.6, 'last': 47.67, 'lasthigh': 47.88, 'lastlow': 47.59, 'volume_real': 1.0, 'volumehigh_real': 16.0, 'volumelow_real': 1.0, 'option_strike': 0.0, 'point': 0.01, 'trade_tick_value': 10.0, 'trade_tick_value_profit': 10.0, 'trade_tick_value_loss': 10.0, 'trade_tick_size': 0.01, 'trade_contract_size': 1.0, 'trade_accrued_interest': 0.0, 'trade_face_value': 0.0, 'trade_liquidity_rate': 0.0, 'volume_min': 1.0, 'volume_max': 1000.0, 'volume_step': 1.0, 'volume_limit': 0.0, 'swap_long': 0.0, 'swap_short': 0.0, 'margin_initial': 1000.0, 'margin_maintenance': 1000.0, 'session_volume': 0.0, 'session_turnover': 0.0, 'session_interest': 0.0, 'session_buy_orders_volume': 0.0, 'session_sell_orders_volume': 0.0, 'session_open': 0.0, 'session_close': 0.0, 'session_aw': 0.0, 'session_price_settlement': 0.0, 'session_price_limit_min': 0.0, 'session_price_limit_max': 0.0, 'margin_hedged': 0.0, 'price_change': 0.0, 'price_volatility': 0.0, 'price_theoretical': 0.0, 'price_greeks_delta': 0.0, 'price_greeks_theta': 0.0, 'price_greeks_gamma': 0.0, 'price_greeks_vega': 0.0, 'price_greeks_rho': 0.0, 'price_greeks_omega': 0.0, 'price_sensitivity': 0.0, 'basis': 'CLE', 'category': '', 'currency_base': 'USD', 'currency_profit': 'USD', 'currency_margin': 'USD', 'bank': '', 'description': 'Crude Light (Globex)', 'exchange': '', 'formula': '', 'isin': '', 'name': '@CLE', 'page': '', 'path': 'Exchange-Futures\\@CLE'}
</code>
На выходе хочу получить таблицу, где ключи - это заголовок столбца, а значения - это строка столбца. При каждом запросе значения словаря меняются.
Как реализовать запись так, чтобы ключи были заголовками столбца, а значения строками, и далее, добавлять новые строки с теми же значениями ключей?

Судя по вашим предыдущим вопросам, вы читаете данные в цикле из WEB API по одной строке (строка данных приходит в виде словаря).
В таких условиях эффективнее всего накапливать словари (строки данных) в список и сохранять накопленные данные в БД пакетами по N записей. Другие ответы не учитывают особенности получения данных. Добавление записей в Pandas DataFrame по одной - очень медленная и неэффективная операция. Добавление DataFrame (
df1.append(df2)) - работает еще медленнее и делать это в цикле крайне неэффективно.
Я бы решал вашу задачу так:

import sqlite3
import pandas as pd

db_filename = "/tmp/db.sqlite"

row_count = 0
batch_size = 10000
data = []

db_conn = sqlite3.connect(db_filename)

while time.time() < tempo:
    symbol_info = mt5.symbol_info('@CLE')
    if symbol_info:
        data.append(symbol_info._asdict())
        row_count += 1
        if row_count == batch_size:
            df = pd.DataFrame(data)
            df.to_sql("data", db_conn, if_exists="append")
            row_count = 0
            data = []

чтение данных из БД

db_filename = "/tmp/db.sqlite"
db_conn = sqlite3.connect(db_filename)
d = pd.read_sql("select * from data", db_conn)
print(d.head())


Таймер на Python, с возможностью его обнуления
Как реализовать таймер, который можно было бы сбросить до нулевых значений. Т.е. у нас есть код, который начинает отсчет таймера, и цикл с условиями, в случае которых они бы сбрасывались.
Пример программного кода ниже:
<code>
timer1 = time.monotonic()
timer2 = time.monotonic()
timer3 = time.monotonic()
while True:
    LEFTANDPRESSBUTTON(0x45, 12)
    time.sleep(8)
    if timer1 > 30:
        LEFTANDPRESSBUTTON(0x45, 12)
        print('Клавиша E', timer1)
        timer1 = time.monotonic()
    else:
        break
    if timer2 > 60:
        LEFTANDPRESSBUTTON(0x45, 12)
        print('Клавиша e', timer2)
        timer2 = time.monotonic()
    else:
        break
    if timer3 > 120:
        LEFTANDPRESSBUTTON(0x45, 12)
        print('Клавиша У', timer3)
        timer3 = time.monotonic()
    else:
        break
</code>
Возможно логика программного кода не совсем верная, но это пока то что мне пришло в голову.

Можно реализовать простейший класс
Timer для подобных целей, пример реализации и использования ниже:
Попробовать онлайн!

class Timer:
    import time
    def __init__(self):
        self.start()
    def start(self):
        self.t = Timer.time.time()
    def __call__(self):
        return Timer.time.time() - self.t

# Usage
import time
t0, t1, t2 = Timer(), Timer(), Timer()
while True:
    time.sleep(0.01) # Some work
    if t0() >= 0.5:
        print('A', end = '', flush = True)
        t0.start()
    if t1() >= 0.75:
        print('B', end = '', flush = True)
        t1.start()
    if t2() >= 5:
        break

Вывод:

ABABAABABAABABA


Отличие инициализации атрибута в методе __init__ и вне его
Объясните, пожалуйста, почему, когда я пишу:

class CustomerList():
    def __init__(self):
        self.names = []
    def add_customer(self, customer):
        self.names.append(customer)
        print(self.names)
a, b = CustomerList(), CustomerList()
a.add_customer('Ben')
b.add_customer('Joe')

выводятся списки
['Ben'],
['Joe'].
А если написать без
__init__:

class CustomerList():
    names = []
    def add_customer(self, customer):
        self.names.append(customer)
        print(self.names)
a, b = CustomerList(), CustomerList()
a.add_customer('Ben')
b.add_customer('Joe')

то выведутся списки
['Ben'],
['Ben', 'Joe']? В чем суть метода
__init__? Почему в первом случае при добавлении
'Joe' он понимает, что объект
b - новый объект и для него заново создается пустой список, в который мы потом добавляем
'Joe', а во втором случае при добавлении
'Joe' он считает, что уже до этого был добавлен
'Ben'? Как именно на все это влияет
__init__? Заранее спасибо за ответ!

Во втором случае:

class CustomerList():
    names = []

    def add_customer(self, customer):
        self.names.append(customer)
        print(self.names)

a, b = CustomerList(), CustomerList()
a.add_customer('Ben')
b.add_customer('Joe')

Создаётся
names как переменная класса, то есть, общая для всех объектов класса. В итоге, при добавлении значений в список этой переменной, они добавляются сразу для всех. А в методе
__init__ мы создаём переменную экземпляра, отдельную новую переменную для каждого нового объекта, что позволяет хранить в них разные значения, и что вероятно будет правильным в данном случае.
При этом, в случае с переменной класса, мы можем обращаться к самому классу, например:
print(CustomerList.names). Более того, когда в коде экземпляра класса происходит обращение
self.names и переменная не обнаруживается среди переменных экземпляра, она ищется как раз среди переменных класса (а также среди классов-родителей). Это работает через особую встроенную переменную
__dict__, которая есть и у объектов-экземпляров, и у классов (которые тоже являются объектами), и она рекурсивно просматривается при обращении через точку.
Почитать по теме:

medium.com: Class vs Instance Variables
www.digitalocean.com: Understanding Class and Instance Variables in Python
Переменные класса и экземпляра в Питоне на русском
habr.com: Пользовательские атрибуты в Python, переменная
__dict__


Как использовать введённое в консоли число в качестве индекса массива?

import random
mas = []
for x in range(10):
    a = random.randrange(0, 10)
   #mas.append(a)
print('Полученный массив',mas)
print("подсказка:Индексы элемента начинаються с 0.")
num1 = input('Введите индекс 1 элемента: ')
num2 = input('Введите индекс 2 элемента: ')
summ = mas[num1]+mas[num2]
print(summ)

Как добавить введенный индекс из input в скобки массива
summ = mas[num1]+mas[num2]

input возвращает строку, а чтобы взять элемент списка нужно использовать число. Чтобы строке превратить в число используйте
int:

num1 = int(input('Введите индекс 1 элемента: '))
num2 = int(input('Введите индекс 2 элемента: '))


Преобразовать из списка в словарь
Как из списка сделать словарь?
из

['a 1', 'b 2', 'c 3']

сделать

{'a': 1, 'b': 2, 'c': 3}

Как именно сделать, чтобы ключом была буква?

попробуйте так:

arr = ['a 1', 'b 2', 'c 3']
res = {}
for el in arr:
    key, value = el.split()
    res[key] = int(value)

либо так в одну строку:

res = {key: int(value) for key, value in map(str.split, arr)}


Не могу понять почему не решается на 100%

Два минимума
Найдите два различных наименьших элемента в числовой последовательности.
Входные данные
В первой строке находится количество элементов
n (
3 ≤ n ≤ 1000) последовательности. Далее заданы
n чисел, каждое из которых не превышает
2 * 109 по абсолютному значению.
Выходные данные
Выведите в возрастающем порядке два различных наименьших элемента последовательности. Известно, что они всегда существуют.

Решаю на Python, но не пойму что не так (31%)
код:

b = int(input())
a = [int(i) for i in input().split()]
a = list(set(a))
a.sort()
print(a[0], a[1])

пробовал также:

b = int(input())
a = [int(i) for i in input().split()]
print(min(a), end = ' ')
m = min(a)
while m in a:
    a.remove(min(a))
print(min(a))

но результат не меняется.
Вопрос как сделать чтобы было 100%

по каким-то причинам вход иногда бывает в две строки поэтому результат не верен. Данный код может принимать вход в несколько строк
<code>
n = int(input())
arr = []
while len(arr) < n:
    arr += map(int, input().split())

sort = sorted(set(arr))
print(*sort[:2])
</code>


Вывод символа через промежуток времени
Есть код, который должен выводить каждый новый символ через N секунд(допустим 5 символов в секунду). Есть код пример(так мало, потому - что всё остальное - базовые блоки), так вот, каким лучше образом написать на экране любой текст: с помощью последовательного добавления символа или есть встроенный способ в модуле?
<code>
for i in range(text):
            time.sleep(0.5)
            screen.blit(text, place)
</code>

попробуйте так:

import time

pygame.init()
win = pygame.display.set_mode((720, 720))

font = pygame.font.SysFont("Arial", 32)

def f(text, time_, font, x, y):
    tick = time_ / len(text)

    for i, char in enumerate(text):
        win.blit(font.render(text[:i + 1], 1, (200, 200, 200)), (x, y))
        pygame.display.update()
        time.sleep(tick)

f("Hello, World", 1, font, 0, 0)

принимает 5 параметров:

text это что мы будем отрисовывать

time_ в течении сколько времени будем отрисовывать

font шрифт для отрисовки

x и
y это координаты для отрисовки

вот пример программы которая будет писать
"Hello, World!!! при каждом нажатии на экран

import pygame
import time

pygame.init()
win = pygame.display.set_mode((720, 720))

font = pygame.font.SysFont("Arial", 32)

def f(text, time_, font, x, y):
    tick = time_ / len(text)

    for i, char in enumerate(text):
        win.blit(font.render(text[:i + 1], 1, (200, 200, 200)), (x, y))
        pygame.display.update()
        time.sleep(tick)

y = 0
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

        elif event.type == pygame.MOUSEBUTTONDOWN:
            y += 25
            f("Hello, World!!!", .5, font, 0, y)


python Как получить имени переменной в виде строки?
Избитый вопрос, мне нужно получить имя переменной в виде строки. Понимаю, что у переменных нет функции name - она в коде только для того, чтобы было понятней, что я хочу получить. Суть в том, что мне нужно только ИМЯ переменной чтобы получить доступ к базе данных по словарю. Мне глубоко фиолетово на что эта переменная ссылается, это совершенно не важно, только имя и всё. Нужно получить аналог W = F['spisok'] используя "x".
<code>
import shelve

spisok = 12345

def ABC(x):
    F = shelve.open('База данных')
    W = F[x.__name__]

Q = ABC(spisok)
</code>

Чем плох такой вариант?

def DEF(x_name):
    F = shelve.open('База данных')
    W = F[x_name]
    return ...

Q = DEF('spisok')

Сравните с оригинальным вариантом:

def ABC(x):
    F = shelve.open('База данных')
    W = F[x.__name__]
    return ...

Q = ABC(spisok)

Замена в вызывающем коде
ABC(spisok) ->
DEF('spisok'). Какие могут быть недостатки у второго вызова в сравнении с первым?
Шутки ради
ABC можно кривовато реализовать так:

def ABC(x):
    for k, v in inspect.currentframe().f_back.f_locals.items():
        if v == x:
            F = shelve.open('База данных')
            W = F[k]
            return ...

spisok = 12345
Q = ABC(spisok)

Это работает но зачем? И что делать с
ABC(a + b)?