Как из строки удалить подстроку?
Есть строка:

str = 'Hello, my name Bil' \
      '\nHello, my name Tim' \
      '\nHello, my name Mila' \
      '\nHello, my name Den' \
      '\nHello, my name Loki'

Как удалить из этой строки подстроку, где содержится определенное имя? Например,
name = 'Mila'?
и чтобы ptint вывел:

Hello, my name Bil
Hello, my name Tim
Hello, my name Den
Hello, my name Loki

Смотря что нужно в результате, если просто print

str = 'Hello, my name Bil' \
      '\nHello, my name Tim' \
      '\nHello, my name Mila' \
      '\nHello, my name Den' \
      '\nHello, my name Loki'

name = "Bil"

for i in str.split("\n"):
  if not name in i:
    print(i)

вывод будет

Hello, my name Tim
Hello, my name Mila
Hello, my name Den
Hello, my name Loki

Вообще
split() метод создаст вот такой лист

['Hello, my name Bil', 'Hello, my name Tim', 'Hello, my name Mila', 'Hello, my name Den', 'Hello, my name Loki']

и вот уже с ним можно делать все что угодно. Он итерируемый, изменяемый, его можно бросить в отдельную переменную и крутить вертеть как хочется
UPD для входного значения со списком. Решение не оптимальное, но будет легко понимаемое для ТС.
положим список в отдельную переменную и создадим список с именем и один пустой где будем хранить индексы для совпадений

l = str.split("\n")
names = ['Bil', 'Tim']
indexes =[]

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

for i in l:
  for n in names:
    if n in i:
      indexes.append(l.index(i))

Теперь посмотри, что у нас хранит переменная
indexes

>>> indexes
[0, 1]

то есть нулевой и первый элементы не должны выводится. Можно скопировать в итоговый лист

res = []
for i in range(0, len(l)):
  if i not in indexes:
    res.append(l[i])

посмотрим, что содержит
res

>>> res
['Hello, my name Mila', 'Hello, my name Den', 'Hello, my name Loki']

Манипуляции с индексами можно опустить и сразу обрабатывать/копировать. Здесь это больше для ясности


Как получить id канала и отправить туда сообщение
у меня есть команда
\createC - она создаёт 5 каналов, но как получить id этих каналов и отправить туда сообщение после создания

@botm.command()
async def createC(ctx):
    guild = ctx.message.guild
    n=0
    while(n<=int(botsettings["CreateChannels"])):
        await guild.create_text_channel(f'channel n {n}')
        #как в этот канал, который только что создался отправить сообщение?
        n = n+1

Функция
await guild.create_text_channel(f'channel n {n}')  возращает созданный канал, так что канал можно получить, поместив функцию в переменную. Код будет выглядеть так:

@botm.command()
async def createC(ctx):
    guild = ctx.guild
    n = 0
    while (n <= int(botsettings["CreateChannels"])):
        channel = await guild.create_text_channel(f'channel n {n}')
        await channel.send("сообщение")
        n += 1

И ещё, на будущее) От
ctx можно напрямую получить и гильдию, и канал и всё что хочешь, через сообщение это делать не надо. Вместо
guild = ctx.message.guild используй
guild = ctx.guild. И вместо
n = n + 1, можно использовать
n += 1, это работает и с другими действиями. Например:

n *= 2,
n /= 3 и тд.


Как остановить поток в python
Помогите решить задачу: есть кнопка
Play, при нажатии она меняет значение на
Stop, и создается поток, в котором происходит цикл. Как сделать так, чтобы при клике по кнопке со значением
Stop поток останавливался? А при клике по кнопке со значением
Play  - начинался?

import tkinter as tk
import threading
import time
import sys

def main():
    if button_1['text'] == 'Play':
        button_1['text'] = 'Stop'
        thread = threading.Thread(target=run)
        thread.start()
    else:
        button_1['text'] = 'Play'
        sys.exit()

def run():
    counter = 1
    while counter <= 5:
        print(counter)
        counter += 1
        time.sleep(0.5)

window = tk.Tk()

button_1 = tk.Button(window, text='Play', command=main)
button_1.pack()

window.mainloop()

Метод
sys.exit() не подходит, так как он ждет пока завершится цикл и только потом срабатывает.

Поток остановить невозможно. Но можно передать так называемый сигнал потоку что ему нужно остановиться. Этим сигналом может быть простая глобальная переменная, котороя будет проверяться в цикле
while True.
Вот как это может выглядить:

import tkinter as tk
import threading
import time
import sys

def main():
    global thread_stop

    if button_1['text'] == 'Play':
        button_1['text'] = 'Stop'
        thread_stop = False #Что-бы поток не остановился присваеваем False
        thread = threading.Thread(target=run)
        thread.start()
    else:
        button_1['text'] = 'Play'
        thread_stop = True #Присваеваем значение True и завершаем поток

thread_stop = False

def run():
    counter = 1
    while counter <= 5:
        if thread_stop == True: return #Останавливаем цикл
        print(counter)
        counter += 1
        time.sleep(0.5)

window = tk.Tk()

button_1 = tk.Button(window, text='Play', command=main)
button_1.pack()

window.mainloop()

Таким образом при нажати на кнопку "Стоп", вам нужно будет присвоить переменной
thread_stop значение
True и поток остановиться, а при включении потока присвоить значение
False.


Django дополнительная валидация в serializer
Есть модель Books

class Books(models.Model):
    name = models.TextField(blank=False, null=False)
    price = models.FloatField(blank=True, null=True)
    is_available = models.BoleanField(blank=False, null=False, default=True)
    is_selling = models.IntegerField(blank=False, null=False)

Сериалайзер

class BooksSerializers(serializers.ModelSerializer):
    class Meta:
        model = Books
        fields = [
            'name',
            'price',
            'is_available',
            'is_selling',
        ]
        validators = [
            RequiredValidator(
                fields=('price')
            )
        ]

Подскажите, а как сделать так, что бы validators на цену срабатывал только тогда, когда is_selling = 1.

Не проверено, но если верить докам, то примерно так

class BooksSerializers(serializers.ModelSerializer):
...
    def validate(self, data):
        if data['is_selling']  != 1:
            raise serializers.ValidationError("Цэ заборонено")
        return data

Добавлю. В доках DRF значится

In DRF, serializer validation is run in a specific, undocumented order

    Field deserialization called (serializer.to_internal_value and field.run_validators)
    serializer.validate_[field] is called for each field.
    Serializer-level validators are called (serializer.run_validation followed by serializer.run_validators)
    Finally, serializer.validate is called to complete validation.

Поэтому валидацию цены придется реализовывать самому в validate() или в validate_price


Помогите решить логическую задачу [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

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

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

Санта-Клаус решил разобрать свою клавиатуру, чтобы её почистить. После того, как он поставил все клавиши обратно, он с ужасом понял, что что-то не так: некоторые пары клавиш перепутаны между собой! Таким образом, Санта-Клаус подозревает, что каждая клавиша либо стоит на своём месте, либо заняла место другой, а та другая — на месте первой.
Для того, чтобы убедиться в этом, найти ошибку и восстановить верное расположение, Санта-Клаус набрал текст своей любимой скороговорки, смотря только на надписи на клавиатуре.
Вам даны любимая скороговорка Санта-Клауса и строка, которая получилась в результате набора. Определите, какие пары клавиш Санта-Клаус мог перепутать. Каждая клавиша должна принадлежать не более чем одной паре перепутанных клавиш.

Например, так - делаете словарь, и для каждой пары символов на соответствующих позициях записываете в словарь
(a:b), где
a - меньший по алфавиту символ, если данный ключ ещё не использован.
Если по ключу а найдено другое значение -всё, приехали, здравствуйте, бабушка, выводим
-1
Если такое же - ничего не делаем.
В конце вывести пары из словаря, кроме содержащих одинаковые элементы
(a:a)
Ввиду ограниченности алфавита можно просто массив на 26 элементов использовать.

def keyboard(s, u):
    dict = {}
    for i in range(len(s)):
        cs = s[i]
        cu = u[i]
        if cs > cu:
            cs, cu = cu, cs
        if cs in dict.keys():
            t = dict[cs]
            if t != cu:
                print(-1)
                return
        else:
            dict[cs] = cu
    # здесь  можно очистить словарь от дубликатов, чтобы счётчик вывести
    for cs, cu in dict.items():
        if cs != cu:
            print(cs, cu)

keyboard("helloworld", "ehoolwlroz")
keyboard("helloworld", "ehoolwlrzz")
keyboard("helloworld", "ehoolwlrlz")
keyboard("gndggadlmdefgejidmmcglbjdcmglncfmbjjndjcibnjbabfab", "fihffahlmhogfojnhmmcflkjhcmflicgmkjjihjcnkijkakgak")


Как разрешить вводить только цифры/буквы с if elif else [закрыт]

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

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

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

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

<code>
name = input("Введи свое имя: ")
age = input("Укажите свой возраст: ")
</code>
Я хочу что-бы в 1 варианте нельзя было вводить цифры, а во втором буквы. Как это сделать с if elif else ???

Можно так
<code>
def main():
    name = input("Введи свое имя: ")
    for i in name:
        if i.isdigit():
            raise ValueError("Имя не должно содержать цифр!")
    age = input("Укажите свой возраст: ")

    for i in age:
        if i.isdigit() is not True:
            raise ValueError("Возраст должен быть из цифр!")

if __name__ == '__main__':
    main()
</code>


Не работает исключение ValueError
я хочу узнать почему у меня не работает исключение. Судя по примеру из книги у меня должно вывести "Ошибка ввода :(", но вместо этого ошибка. Простите если вопрос глупый, просто я не смог найти ответ.

Traceback (most recent call last):
  File "C:\Users\dtita\PycharmProjects\pythonProject\venv\My successes.py", line 4, in <module>
    b = int(b)
ValueError: invalid literal for int() with base 10: 'два'

a = input("Введите число: ")
b = input("Введите ещё одно: ")
a = int(a)
b = int(b)
try:
    print(a/b)
except (ZeroDivisionError, ValueError):
    print("Ошибка ввода :(")
print(a/b)

Надо было просто убрать последнюю строчку с
print(). Не забывай, что всё, что может не получиться, нужно записывать в блок
try except. У тебя может не получиться не только деление(делить на 0 нельзя), но и конвертация из строки в число(строку "два" не очень получается конвертировать в число, верно? :D ), поэтому блок с конвертацией строки в число тоже нужно перенести в блок
try except. Удачи!

a = input("Введите число: ")
b = input("Введите ещё одно: ")
try:
    a = int(a)
    b = int(b)
    print(a/b)
except (ZeroDivisionError, ValueError):
    print("Ошибка ввода :(")


Как через python на Android позвонить (как это делает google ассистент)
Мне надо позвонить на номер из скрипта python который будет запущен на Android.(Проект мини голосового ассистента как google ассистент )
<code>
import json
import pyttsx3
import speech_recognition as sr

lvlofrun = 1
while lvlofrun == 1:
    r = sr.Recognizer()
    with sr.Microphone(device_index = 1) as source:
        print('Настраиваюсь.')
        r.adjust_for_ambient_noise(source, duration=0.5)
        print('Слушаю...')
        audio = r.listen(source)
    print('Услышала.')
    try:
        query = r.recognize_google(audio, language = 'ru-RU')
        text = query.lower()
        print(f'Вы сказали: {query.lower()}')
        if text == "протокол 0":
            print("Выполняется 0 протокол...")

        elif text == "стоп":
            lvlofrun += 1
    except Exception as e:
            print('Ошибка:\n', traceback.format_exc())

def talk(text):
    tts.say(text)
    tts.runAndWait()
</code>

Если через интерфейсы java, то pyjnius
<code>
from jnius import cast
from jnius import autoclass

Intent = autoclass('android.content.Intent')
Uri = autoclass('android.net.Uri')

intent = Intent()
intent.setAction(Intent.ACTION_DIAL)
intent.setData(Uri.parse("tel:" + phoneNumber))

PythonService = autoclass("org.renpy.android.PythonService") #тут надо поставить то приложение которое запускает питон скипты

activity = cast("android.app.Service", PythonService.mService)
activity.startActivity(intent)
</code>


Как выбирать данные исходя из заданного аргумента?
Есть некий аргумент, и хочу выбирать данные исходя из этого аргумента:
<code>
    import sqlite3

    connection = sqlite3.connect('car_model.db')
    cursor = connection.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS cars (
           car_id VARCHAR,
           model VARCHAR,
           price VARCHAR
           )""")

    model = 'Hundai'
    price = 12000

    cursor.execute('''
    select * from cars where model is(?, ?)

''', (model))

cursor.execute('''
select * from cars where model = %s, (model)''')

connection.commit()
connection.close()
</code>
Никак не получается добавить аргумент в  комманду вставки.

cursor.execute('''
select * from cars where model = %s, (model)''')

Данный вариант не работает по двум причинам

у вас ошибка в запросе. Должно быть так:
cursor.execute('''                   select * from cars where model = %s''', (model, ))
вы передаете в качестве параметров одну переменную
(model) вместо ожидаемого кортежа
(model, ).

In [123]: print(type( (model) ))
<class 'str'>

In [124]: print(type( (model,) ))
<class 'tuple'>

Обратите внимание на запятую...

Пример использования параметризированных запросов:

qry = "insert into cars(car_id, model, price) values(?, ?, ?)"
records = [[1, "Hundai", 12000], [2, "BMW", 25000]]
cursor.executemany(qry, records)
connection.commit()

далее выбираем данные в запросе:

qry2 = "select * from cars where model = ?"
cursor.execute(qry2, (model, ))
res = list(cursor.fetchall())

результат:

In [122]: res
Out[122]: [('1', 'Hundai', '12000')]


Разбитие строки на Python
Я хочу разделить строку по пробелам, но не разделять между (), "" и [].
Пример строки:

set 1 test "favorite text" get (user get "li 1 0") [0, 1, "po"]

Ожидаемый результат:

['set', '1', 'test', '"favorite text"', 'get', '(user get "li 1 0")', '[0, 1, "po"]']

Это нужно для обработки команд.

Если нет вложенности одного типа (например, круглых скобок внутри круглых скобок), то можно и регуляркой.

import re
s = 'set 1 test "favorite text" get (user get "li 1 0") [0, 1, "po"]'
lst = re.findall(r'".*?"|\(.*?\)|\[.*?\]|\S+', s)

Регулярка ищет по "или":

".*?" - любую последовательность обрамлённую кавычками

\(.*?\) - любую последовательность обрамлённую круглыми скобками

\[.*?\] -  любую последовательность обрамлённую квадратными скобками

\S+ - последовательность символов без пробелов

*? - означат "не жадный" вариант соответствия, т.е. ищется последовательность как можно короче.

Вариант разбора строки с вложенными скобочками:

def parse(text):
    lst   = []     # результат
    stack = []     # стек со встретившимися скобочками и кавычками
    prev_pos = 0   # начальная не добавленная позиция в строке

    for pos, symb in enumerate(text):     # разбираем строку посимвольно
        if symb == ' ':                          # если пробел и
            if not stack:                        # он на "верхнем уровне" (стек со скобочками пуст),
                lst.append(text[prev_pos:pos])   # то добавляем предыдущую последовательность в результат
                prev_pos = pos + 1               # и обновляем начальную позицию
        elif symb in '([':        # если встретилась открывающая скобочка
            stack.append(symb)    # то просто добавляем её в стек
        elif symb in ')]':        # если встретилась закрывающая скобочка
            if stack.pop() != {')':'(', ']':'['}[symb]:  # извлекаем последнюю скобочку из стека и проверяем что она парная нашей
                raise ValueError(f'Не та скобочка или кавычка в позиции {pos}')
        elif symb == '"':                    # если встретилась кавычка
            if stack and stack[-1] == '"':   # и если в стеке последний элемент тоже кавычка
                stack.pop()                  # то наша кавычка закрывающая - извлекаем кавычку из стека
            else:                            # иначе
                stack.append(symb)           # наша кавычка открывающая - добавляем кавычку в стек

    if stack:  # строка закончилась, но в стеке что-то осталось - где-то скобочки/кавычки не правильно стоят
        raise ValueError('Скобочки или кавычки не сбалансированы')

    lst.append(text[prev_pos:])  # остаток строки тоже добавляем в результат
    return lst

parse('set 1 test "favorite text" get (user get "li 1 0") [0, 1, "po"] ("foo ["bar (8 9)" 1]") ([]()("[["[[]1()]"]]")()[])')

Результат:

['set',
 '1',
 'test',
 '"favorite text"',
 'get',
 '(user get "li 1 0")',
 '[0, 1, "po"]',
 '("foo ["bar (8 9)" 1]")',
 '([]()("[["[[]1()]"]]")()[])']


итерация по элементам вложенных списков
Есть список типа:
pd=[[{1,2,3},[5,7,3]],[{2,7,8},[9,8,4]]]. Нужно брать первый элемент вложенного списка и проверять, есть ли этот элемент во множестве слева. Если есть, то поиск прерывается и элемент добавляют в новый список
lst=[]. В данном примере результат должен получиться следующий:

lst=[3,8]

Т.е. 3 добавили из списка
pd[0][1] и 8 добавили из
pd[1][1]. Ожидаемая длина pd, т.е.
len(pd) = 6-9 вложенных пар (множество, список) за одну итерацию цикла. Всего итераций >25 000 000
Мой код представлен ниже, но я ищу более оптимальное решение, возможно, через функцию map, lambda или list comprehension

for i in pd:
    for j in i[1]:
        if j in i[0]:
            lst.append(j)
            break

Добавление первого элемента списка, что присутствует в множестве:

pd = [[{1,2,3},[5,7,3]],[{2,7,8},[9,8,4]]]
lst = []
for sets, lists in pd:
    for x in lists:
        if x in sets:
            lst.append(x)
            break
print(lst)
# [3, 8]

Совмещение перебора и проверки:

lst = []
for sets, lists in pd:
    for x in filter(lambda x: x in sets, lists):
        lst.append(x)
        break
print(lst)

Функциональная магия (если уверены, что хоть один элемент списка есть в множестве):

lst = [
    next(filter(lambda x: x in sets, lists))
    for sets, lists in pd
]

Если не уверены (что-то избыточно получилось...):

lst = [
    next(filter(lambda x: x in sets, lists))
    for sets, lists in pd
    if any(filter(lambda x: x in sets, lists))
]


count '9's from 1 to n
Решаю задачу на codewars.com
Задача: count '9's from 1 to n
Моё решение:
<code>
def count_nines(n):
    list1 = str(list(range(1,n+1)))
    count = 0
    nine = ['9']
    for i in list1:
        if i in nine:
            count = count + 1
    return count
</code>
Ошибка: MemoryError если через сайт запускать, в моем IDE все работает как надо, правда медленно при больших числах
Еще из ограничений самой платформы codewars:

функция должна принимать только 1 аргумент
выполняться за время не более 12000 ms

NB: Я везде ниже немного занижаю оценки, чтобы проще было объяснять.
Исходное решение требует O(n) памяти. Сперва строится список чисел из n чисел. Затем строится строка в которой O(n) символов. Всё это может не поместится в память при больших n. Поправить можно сравнительно просто:

def count_nines(n):
    return sum(str(i).count('9') for i in range(1, n + 1))

Это код использует фиксированное количество памяти, но всё ещё работает за линейное время (то есть медленно), потому что перебирает все числа от единицы до n.
Быстрое решение
Обозначим fn - число девяток в десятичных записях всех чисел [0, n). Обратите внимание, что n исключено.
Обозначим gn - число девяток в десятичной записи числа n.
Как связаны fn и f10n?
f10n = 10fn + n.
Чтобы понять почему это так выпишем все числа [0, 10n) в таблицу. Вот её кусочек (последний разряд отделен пробелом только для читабельности):

...
987 0   # '987' входил в f_n один раз
987 1   # он же входит в f_10n десять раз
987 2   # таким образом первое слагаемое 10f_n
987 3   # перечисляет все девятки со второго разряда и выше
987 4
987 5
987 6
987 7
987 8
987 9   # девяток в первом разряде ровно n штук
...     # это второе слагаемое

Усложним формулу. Появилась добавка d. Лишние числа добавляем в сумму в ручном режиме:
f10n+d = 10fn + n + ∑i=0d-1 (g10n+i)
Используя эту формулу можно решить задачу так:

def g(n):
    return str(n).count('9')

def f(n):
    if n == 0:
        return 0
    d = n % 10
    m = n // 10
    return 10 * f(m) + m + sum(g(10 * m + i) for i in range(d))

def count_nines(n):
    return f(n + 1)

Время работы этой программы пропорционально количеству разрядов в числе n.


Как остановить основной поток?
Есть в программе
keyboard.wait(), который блокирует основной поток. Мне нужно, чтобы при нажатии на Ctrl + Q совершался выход из основого потока. Как это реализовать?

import keyboard
import sys

def quit_prog():
    sys.exit()

keyboard.add_hotkey('Ctrl + Q', quit_prog)
keyboard.wait()

Вот сам код. Пытаюсь выйти из программы полностью нажав Ctrl + Q, но это не даёт никакого результата, т.к.
keyboard.wait() полностью блокнул основной поток

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

import keyboard
import sys

def quit_prog():
    print("вы вышли из программы")
    sys.exit()

print("Выйти из программы: Ctrl + Q")
keyboard.wait('Ctrl + Q')
quit_prog()

или вот еще вариант, я так понимаю именно управлять надо.

import keyboard
def foo():
    print('hi')

def foo2():
    print('Привет')

def foo3():
    print('Привет еще раз')

keyboard.add_hotkey('space + 1', foo)
keyboard.add_hotkey('space + 2', foo2)
keyboard.add_hotkey('space + 3', foo3)

keyboard.wait("Ctrl + q")
print('Любой код, в том числе и выход')


Как исправить условие?
<code>
import pygame as pg
import sys

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

WIDTH = 650
HEIGHT = 350
FPS = 60

sc = pg.display.set_mode((WIDTH, HEIGHT))

y_left = HEIGHT//2 - 30
pg.draw.rect(sc, WHITE, (0, y_left, 15, 60))

clock = pg.time.Clock()

while True:
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()

    sc.fill(BLACK)
    pg.draw.rect(sc, WHITE, (0, y_left, 15, 60))

    keys = pg.key.get_pressed()

*******
    if 0 <= y_left <= HEIGHT - 60:
        if keys[pg.K_w]:
            y_left -= 3
        elif keys[pg.K_s]:
            y_left += 3
*******

    pg.display.update()
    clock.tick(FPS)
</code>
Этот код создает rect и его можно двигать. Хочу сделать пинг-понг, нужно чтобы rect не выходил за пределы, но когда он только касается, перестает двигаться как исправить. Выделил * нужный код

Измените выделенный фрагмент на этот
<code>
    if keys[pg.K_w]:
    if y_left>=3:
        y_left -= 3
elif keys[pg.K_s]:
    if y_left<=HEIGHT - 63:
        y_left += 3
</code>


Как удалить дубликаты по условию?
Есть DataFrame

city
year

0
Лодзь
990

1
Краков
990

2
NaN
990

3
Перм
1826

4
NaN
1826

5
NaN
1827

Нужно удалить дубликаты по колонке
year, но в случае если поле
city не пусто, то такие значения не удалять.
Ожидаю увидеть:

city
year

0
Лодзь
990

1
Краков
990

3
Перм
1826

5
NaN
1827

Я думала над таким вариантом, но тогда я удаляю дубликаты и среди значений где колонка
city не пуста:

df=df.sort_values(by=['city'])
df=df.drop_duplicates(subset=['year'])
f=df.sort_values(by=['year'])

решение по описанию уважаемого CrazyElf:

res = (df
       .assign(x=df.groupby("year")["city"].transform("nunique"))
       .query("""city == city or x == 0""")
       .drop(columns="x"))

результат:

In [37]: res
Out[37]:
     city  year
0   Лодзь   990
1  Краков   990
3    Перм  1826
5     NaN  1827


не работает код {discord.py}

import discord
import os
import datetime
from discord.ext import commands, tasks
from discord.ext.commands import Bot
from discord import Embed
from discord_components import DiscordComponents, Button
import time
import re
import json
from urllib import parse, request
import random
import sys
import traceback
from discord import Game
from asyncio import sleep
import asyncio
from discord.ext import commands
from config import settings
import requests

bot = commands.Bot(command_prefix='.')
bot.remove_command('help')

os.system('clear')

@bot.event
async def on_message(message):
    if message.content == "Всем привет":
        await message.channel.send("привет!")
        await bot.process_commands(message)`введите сюда код`

@bot.command()
async def ping(ctx):
    await ctx.channel.send("pong")

ban_words = ['ука', 'бя', 'ебть', 'науй', 'иди нуй', 'бдь', 'бть', 'пола науй', 'суа', 'шха', 'тпа', 'хй', 'чен']

def simplify_word(word):
    last_letter = ''
    result = ''
    for letter in word:
        if letter != last_letter:
            last_letter = letter
            result += letter

    return result

@bot.event
async def on_message(message):
    if message.author.bot:
        return

    msg_words = [simplify_word(word) for word in message.content.split()]

    for word in msg_words:
        if word in ban_words:
            try:
                await message.delete()
            except:
                print('Ошибка при удалении сообщения')
            await message.channel.send(f'{message.author.mention} **маты не писать!**')
            return
    await bot.process_commands(message)

@bot.event
async def on_ready():
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name='PonHub'))

    print('Бот Love<3 онлайн')
    print(bot.user.name)
    print('-----------')
    name = input("Введите ваше имя: ")
    print(f" Приветик папочка~ мурр)")
    print('-----------')
    print ("""\

██╗░░░░░░█████╗░██╗░░░██╗███████╗
██║░░░░░██╔══██╗██║░░░██║██╔════╝
██║░░░░░██║░░██║╚██╗░██╔╝█████╗░░
██║░░░░░██║░░██║░╚████╔╝░██╔══╝░░
███████╗╚█████╔╝░░╚██╔╝░░███████╗
╚══════╝░╚════╝░░░░╚═╝░░░╚══════╝

""")

bot.run(settings['token'])

Перестаёт работать весь код когда я добавляю сверху:

@bot.event
async def on_message(message):
    if message.content == "Всем привет":
        await message.channel.send("привет!")
        await bot.process_commands(message)

У вас повторяется функция
on_message, нужно объединить их

import discord
import os
import datetime
from discord.ext import commands, tasks
from discord.ext.commands import Bot
from discord import Embed
from discord_components import DiscordComponents, Button
import time
import re
import json
from urllib import parse, request
import random
import sys
import traceback
from discord import Game
from asyncio import sleep
import asyncio
from discord.ext import commands
from config import settings
import requests

bot = commands.Bot(command_prefix='.')
bot.remove_command('help')

os.system('clear')

@bot.command()
async def ping(ctx):
    await ctx.channel.send("pong")

ban_words = ['ука', 'бя', 'ебть', 'науй', 'иди нуй', 'бдь', 'бть', 'пола науй', 'суа', 'шха', 'тпа', 'хй', 'чен']

def simplify_word(word):
    last_letter = ''
    result = ''
    for letter in word:
        if letter != last_letter:
            last_letter = letter
            result += letter

    return result

@bot.event
async def on_message(message):
    if message.author.bot:
        return

    if message.content == "Всем привет":
        await message.channel.send("привет!")

    msg_words = [simplify_word(word) for word in message.content.split()]

    for word in msg_words:
        if word in ban_words:
            try:
                await message.delete()
            except:
                print('Ошибка при удалении сообщения')
            await message.channel.send(f'{message.author.mention} **маты не писать!**')
            return
    await bot.process_commands(message)

@bot.event
async def on_ready():
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name='PonHub'))

    print('Бот Love<3 онлайн')
    print(bot.user.name)
    print('-----------')
    name = input("Введите ваше имя: ")
    print(f" Приветик папочка~ мурр)")
    print('-----------')
    print ("""\

██╗░░░░░░█████╗░██╗░░░██╗███████╗
██║░░░░░██╔══██╗██║░░░██║██╔════╝
██║░░░░░██║░░██║╚██╗░██╔╝█████╗░░
██║░░░░░██║░░██║░╚████╔╝░██╔══╝░░
███████╗╚█████╔╝░░╚██╔╝░░███████╗
╚══════╝░╚════╝░░░░╚═╝░░░╚══════╝

""")

bot.run(settings['token'])


проблемы с русскими буквами в excel python
код:
<code>
import csv

final = ['CS', 'Maxim Mernes', 'Crypto-Крипта | Новости криптовалют. Инвестиции и трейдинг | Биткоин и альткойны']

with open('data.csv', 'w',  encoding='utf-8')as file:
    writer = csv.writer(file)
    writer.writerow(['channel name'])

for objects in final:
    with open('data.csv', 'a',  encoding='utf-8')as file:
        writer = csv.writer(file)
        writer.writerow([objects])

</code>
А по итогу в таблице где на звания с Русским языком во так:

Ethereum, ��������������, ����������������

Что делать, как добиться правильной кодировки?

Заменил кодировку c
utf-8 на
cp1251

import csv

final = ['CS', 'Maxim Mernes', 'Crypto-Крипта | Новости криптовалют. Инвестиции и трейдинг | Биткоин и альткойны']

with open('data.csv', 'w',  encoding='cp1251')as file:
    writer = csv.writer(file)
    writer.writerow(['channel name'])

for objects in final:
    with open('data.csv', 'a',  encoding='cp1251')as file:
        writer = csv.writer(file)
        writer.writerow([objects])


Как понять на какое слово я навел в тексте tkinter Python?
Мне нужно, чтобы при наведении курсора на какое-либо слово, оно переключалось на курсив. При убирании курсора - обратно в обычный текст. Также нужно, чтобы значение этого слова сохранялось в какую-то переменную.
Сейчас есть идея вешать ка каждое слово в Text свой тег и что-то с этим потом делать.

Ну, вот примерно так это делается:

import tkinter as tk
import tkinter.font as tkFont

root = tk.Tk()

def on_mouse_move(event):
    text.tag_remove("highlight", "1.0", tk.END)
    word = text.get(f"@{event.x},{event.y} wordstart", f"@{event.x},{event.y} wordend")
    if word.isalpha():
        text.tag_add("highlight", f"@{event.x},{event.y} wordstart", f"@{event.x},{event.y} wordend")

text = tk.Text(root)
italic_font = tkFont.nametofont(text.cget("font")).copy()
italic_font.config(slant=tkFont.ITALIC)
text.tag_config("highlight", font=italic_font, foreground="yellow", background="#a00")
text.bind("<Motion>", on_mouse_move)
text.grid()

text.insert(tk.END, """Давеча Витька сказал, что идет в одну компанию, а в лаборатории оставляет работать дубля.
Дубль – это очень интересная штука. Как правило, это довольно точная копия своего творца.
Не хватает, скажем, человеку рук – он создает себе дубля, безмозглого, безответного, только и умеющего, что паять контакты, или таскать тяжести, или писать под диктовку, но зато уж умеющего это делать хорошо.
Или нужна человеку модель-антропоид для какого-нибудь эксперимента – он создает себе дубля, безмозглого, безответного, только и умеющего, что ходить по потолку или принимать телепатемы, но зато уж умеющего хорошо.
Или самый простой случай. Собирается, скажем, человек получить зарплату, а времени терять ему не хочется, и он посылает вместо себя своего дубля, только и умеющего, что никого без очереди не пропускать, расписываться в ведомости и сосчитать деньги, не отходя от кассы.
Конечно, творить дублей умеют не все. Я, например, еще не умел. То, что у меня пока получалось, ничего не умело – даже ходить.
И вот стоишь, бывало, в очереди, вроде бы тут и Витька, и Роман, и Володя Почкин, а поговорить не с кем.
Стоят как каменные, не мигают, не дышат, с ноги на ногу не переминаются, и сигарету спросить не у кого.""")

root.mainloop()

Только из-за курсива текст может подёргиваться, т.к. курсивный шрифт может иметь высоту несколько отличную от нормального написания.
Лучше, как мне кажется, использовать для выделения подчёркнутый шрифт (
italic_font.config(underline=True))или выделять цветом.


Векторный поиск элемента в значении - списке?
Как получить список планет по критериям отбора?

DataFrame.isin для поиска значения в списке как здесь не подходит.
Очень желательно векторный способ Panadas, потому что тесты на большой базе данных.

import pandas as pd

df = pd.DataFrame({
    'name': ['Earth', 'Jupiter', 'Mars'],
    'mass_to_earth': [1.0, 317.8, 0.1],
    'kind': ['planet', 'planet', 'planet'],
    'colors': [['red','blue', 'green'], ['blue', 'green'], ['red','blue']]
})

print(df)

choice = df['name'][
    (df['mass_to_earth'] > 0.2) &
    (df['kind'].str.contains('planet', case=True, regex=False, na=False)) &
    (df['colors'].isin(['green'])) #это не работает как итератор
].tolist()

print(type(choice),choice)

И как вариант поиск в set пожалуйста для теста скорости:

'colors': [{'red','blue', 'green'}, {'blue', 'green'}, {'red','blue'}]

Вариант 1 - преобразовать список в CSV строку и искать при помощи регулярного выражения:

In [169]: df.loc[df["colors"].str.join(sep="|").str.contains(r"\bgreen\b")]
Out[169]:
      name  mass_to_earth    kind              colors
0    Earth            1.0  planet  [red, blue, green]
1  Jupiter          317.8  planet       [blue, green]

PS В микроязыке RegEx
\b обозначает границу слова
Вариант 2: сначала преобразуем списки в множества (операция "element in set" - имеет асимптотическую сложность
O(1), а для списков это
O(n)), потом поиск "в лоб":

df["colors"] = df["colors"].map(set)

In [176]: df.loc[["green" in x for x in df["colors"]]]
Out[176]:
      name  mass_to_earth    kind              colors
0    Earth            1.0  planet  {red, green, blue}
1  Jupiter          317.8  planet       {green, blue}

PS на первый взгляд этот вариант может показаться медленным из-за использования цикла, но на практике, такой вариант часто оказывается быстрее остальных для строковых типов данных. Нужно тестировать и сравнивать время выполнения на реальных данных...


Как найти индекс равенства суммы левых и правых элементов?
Задача: дан список чисел
[4, 1, 7, 9, 3, 9], необходимо найти индекс элемента, в котором сумма левых и сумма правых элементов будет равна: 4 + 1 + 7 = 12 и 3 + 9 = 12.
Ничего кроме этого не пришло на ум:

def midpoint_sum(a):
    ans = []
    sum_a = 0
    for i in a:
        sum_a += i
        ans.append(sum_a)
    ans2 = []
    sum_a2 = 0
    for i in a[::-1]:
        sum_a2 += i
        ans2.append(sum_a2)
    ans3 = [i for i in range(len(ans[1:])) if ans[i] in ans2[1:]]
    return (ans3[-1])

А в итоге еще и ответы не правильные получается.

здесь удобнее всего использовать срезы и встроенную функцию sum():

lst = [4, 1, 7, 9, 3, 9]

res = 0
for i in range(1, len(lst)):
    if sum(lst[:i]) == sum(lst[i+1:]):
        res = i
        break
print(res)

PS если
res == 0 - это значит условие равенства не выполняется для любого индекса списка.


sqlite ошибка near "(": syntax error
Готовя функцию для более простой работой с sqlite, встретил не особо понятную мне ошибку

Traceback (most recent call last):
  File "C:\python\py\bot2.py", line 46, in <module>
    update_database(set_name = "coin", value_name = "123", where_name = "294627349")
  File "C:\python\py\bot2.py", line 32, in update_database
    cursor.execute("UPDATE (?) SET (?) = (?) WHERE (?) = (?)", (table_name, set_name, value_name, where_who, where_name) )
sqlite3.OperationalError: near "(": syntax error

Вот сама функция и то, что я на неё подаю:

def update_database(set_name, value_name, where_name, table_name = "num", where_who = "id"):
    cursor.execute("UPDATE (?) SET (?) = (?) WHERE (?) = (?)", (table_name, set_name, value_name, where_who, where_name) )
    sqlite_connection.commit()

update_database(set_name = "coin", value_name = "123", where_name = "294627349")

Почему так происходит? Хотя оно работает в более простых вариантах, по типу таких:

cursor.execute("UPDATE num SET coin = (?) WHERE id = ?", (coin_value, id_value))

Кажется нашёл костыль, который работает - передавать значение с помощью списка, а названия через f-строку. Выглядит это примерно так:
<code>
def update_database(set_name, value_name, where_name, table_name = "num", where_who = "id"):
    cursor.execute(f"UPDATE {table_name} SET {set_name} = (?) WHERE {where_who} = (?)", (value_name, where_name))
    sqlite_connection.commit()
</code>
Хоть выглядит довольно странно, но работает


Сопоставление ключей вложенного словаря с ключом исходного словаря
Существует 2 словаря:

dict1={'proxyid':nvps} содержащий в себе данные {'10444': 1.7722, '10441': 0.01666}
и

dict2={'hostid':proxyid} с данными {'10084': 10445, '10443': 10441}.
Вопрос - как сделать сопоставление ключа из первого словаря с аргументом второго словаря, чтобы в дальнейшем произвести объединение двух данных словарей в один новый составной с сортировкой по ключу (proxyid) из dict1, чтобы получился вот такой вот вывод:
{'10444': {'10443': 10444},
'10441': {'10084': 10441}}


Vk Api: ошибка с if [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

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

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

Вечер добрый!
Недавно начала работу с VkApi, для того, чтобы написать бота для своей студии.
Так вот в чём заключилась моя проблема сегодня. Если я создаю if внутри if'a, происходит такой прикол, в общем чего я тут говорю, лучше кодом покажу!
<code>
# -*- coding: utf8 -*-

import vk_api
import time
import random2
from config import config_pass
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.keyboard import VkKeyboard, VkKeyboardColor

token = config_pass

bh = vk_api.VkApi(token = token)

give = bh.get_api()
longpoll = VkLongPoll(bh)

vk_session = vk_api.VkApi(token=token)

vk = vk_session.get_api()

def blasthack(id, text):
    bh.method('messages.send', {'user_id' : id, 'message' : text, 'random_id': 0})

for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
   if event.to_me:

      message = event.text.lower()
      id = event.user_id

                message = event.text.lower()
                id = event.user_id

                if message == 'начать':
                          blasthack(id, 'Тестовое сообщение')
                          if message == 'привет':
                                    blasthack(id, 'Тестовое сообщение 2')
                else:
                   blasthack(id, 'Чёт не то ты сделал')
</code>
Собственно, что тут происходит. У нас есть блок кода: if message == 'начать' и if message == 'привет', message == 'привет' находится внутри message == 'начать', потому при вводе первой команды ( Начать ) для активации первого блока message == 'начать', сообщение пользователя ( Начать ) проверяется также и в блоке message == 'привет' и т.к. Начать != Привет на экран будет выведено: Чёт не то ты сделал. В этом и заключается моя проблема. Python 1 сообщение проверяет в if'ах и не даёт времени для ввода сообщения Привет, он сразу проверяет Начать и в 1 и во 2 блоке кода. Мне же нужно, чтобы после ввода команды Начать у меня было время, чтобы ввести ещё и команду привет. Надеюсь объяснил понятно и максимально надеюсь на помощь. Вроде изучаю пайтон уже несколько лет, а сейчас сижу тут как затупок не могу рядовую проблему решить :)

Можно организовать state machine, например. Чтобы после обработки одного сообщения возвращаться в цикл. Для этого, как вариант, хранить где-то этап, на котором находится обработка сообщений.
Что-то вроде этого:
<code>
wait_for = 'начать'

for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW:
        if event.to_me:
            message = event.text.lower()
            id = event.user_id
            if wait_for == 'начать':
                if message == 'начать':
                    blasthack(id, 'Тестовое сообщение')
                    wait_for = 'привет'
                else:
                    blasthack(id, 'Чёт не то ты сделал')
            elif wait_for == 'привет':
                if message == 'привет':
                    blasthack(id, 'Тестовое сообщение 2')
                else:
                    blasthack(id, 'Чёт не то ты сделал')
                wait_for = 'начать'  # где на самом деле возвращаться на предыдущий этап зависит от логики вашей программы
</code>


Как можно добавить Имя автора поста в таблицу Django?
Я разрабатываю сайт на Django где есть возможность выкладывать посты.
Как я могу внести в БД автора поста?
<code>
'''views.py'''
def create_post(request):
    error = ''
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('crypto')
        else:
            error = 'Invalid Form!!!'

    form = PostForm()
    context = {
        'form': form,
        'error': error,
    }
    return render(request, 'crypto/create-post.html', context)

#models.py
class Post(models.Model, ):
    author = models.TextField()
    title = models.CharField('Название поста', max_length=125)
    text = models.TextField('Описание')
    created_date = models.DateTimeField(default=timezone.now)
</code>

Я так понимаю, что посты выкладывают авторизованные пользователи.
Поэтому текущего пользователя можно найти в
request.user, и при создании поста сохранить в
Post:

if form.is_valid():
   new_post = form.save(commit=False)
   new_post.author = request.user.username
   new_post.save()

PS - но обычно вместо текстового поля для автора, создают
ForeignKey с моделью
User.


Через VS code работает, а через стандартный интерпретатор выдает ошибку
Всем добра! Написал программу. Через VS code все работает, а через стандартный интерпретатор выдает ошибку "Указанное устройство не открыто или не опознается интерфейсом MCI." Что может быть не так? Помогите, пожалуйста.
<code>
    from tkinter import *
    from playsound import playsound
    import random

    ALPHABET = {'A': "EnglishAlphabet/letter-a.wav",
        'B': "EnglishAlphabet/letter-b.mp3",
        'C': "EnglishAlphabet/letter-c.mp3",
        'D': "EnglishAlphabet/letter-d.mp3",
        'E': "EnglishAlphabet/letter-e.mp3",
        'F': "EnglishAlphabet/letter-f.mp3",
        'G': "EnglishAlphabet/letter-g.mp3",
        'H': "EnglishAlphabet/letter-h.mp3",
        'I': "EnglishAlphabet/letter-i.mp3",
        'J': "EnglishAlphabet/letter-j.mp3",
        'K': "EnglishAlphabet/letter-k.mp3",
        'L': "EnglishAlphabet/letter-l.mp3",
        'M': "EnglishAlphabet/letter-m.mp3",
        'N': "EnglishAlphabet/letter-n.mp3",
        'O': "EnglishAlphabet/letter-o.mp3",
        'P': "EnglishAlphabet/letter-p.mp3",
        'Q': "EnglishAlphabet/letter-q.mp3",
        'R': "EnglishAlphabet/letter-r.mp3",
        'S': "EnglishAlphabet/letter-s.mp3",
        'T': "EnglishAlphabet/letter-t.mp3",
        'U': "EnglishAlphabet/letter-u.mp3",
        'V': "EnglishAlphabet/letter-v.mp3",
        'W': "EnglishAlphabet/letter-w.mp3",
        'X': "EnglishAlphabet/letter-x.mp3",
        'Y': "EnglishAlphabet/letter-y.mp3",
        'Z': "EnglishAlphabet/letter-z.mp3"}
    keys = []
    values = []
    for i, j in ALPHABET.items():
        keys.append(i)
        values.append(j)

    class Word():
        def __init__(self):
            self.word = ALPHABET[random.choice(list(ALPHABET))]
            self.answer = ''

        def newWord(self):
            self.word = ALPHABET[random.choice(list(ALPHABET))]
            return self.word

        def playWord(self):
            playsound(self.word)

        def checkAnswer(self):
            self.answer = txtAnswer.get()
            if ALPHABET[self.answer.upper()] == self.word:
                result.configure(text = "Верно!")
            else:
                result.configure(text = "Ошибка!")

    word = Word()

    window = Tk()
    window.geometry("640x480")
    btnPlay = Button(window, text = "Играть", command = word.playWord)
    txtAnswer = Entry(window, width = 5)
    btnCheckAnswer = Button(window, text = "Проверить", command = word.checkAnswer)
    result = Label(window, text = '')
    btnNewWord = Button(window, text = "Новая буква", command = word.newWord)

    btnPlay.grid(column = 1, row = 0)
    txtAnswer.grid(column = 2, row = 0)
    btnCheckAnswer.grid(column = 3, row = 0)
    result.grid(column = 4, row = 0)
    btnNewWord.grid(column = 1, row = 1)
    window.mainloop()
</code>

Дело музыке, точнее в самом модуле. Нужна версия 1.2.2.
<code>
pip uninstall playsound
pip install playsound==1.2.2
</code>


Почему Python выводит другое значение?
подскажите, пожалуйста, почему в 7 строчке моего кода выводится значение "2", а не "5". Хотелось бы услышать развернутый ответ. Заранее большое спасибо!
<code>
def func_outer():
    x = 2
    def func_inner():
        global x
        x = 5
    func_inner()
    print(x)
func_outer()
</code>

Я добавил ещё одну переменную и сделал больше печати. Всегда добавляйте отладочную печать, когда что-то не очень понятно:

def func_outer():
    x = 2
    y = 2
    def func_inner():
        global x
        x = 5
        nonlocal y
        y = 5
    func_inner()
    print('внутри функции')
    print('x =', x)
    print('y =', y)
func_outer()
print('снаружи функции')
print('x =', x)

Вывод:

внутри функции
x = 2
y = 5
снаружи функции
x = 5

Вы меняете глобальную переменную. Если вы хотите поменять переменную внешней функции, используйте не
global, а
nonlocal.


Нужно написать игру Ним с двумя кучами и Двумя игроками (второй игрок это ИИ)
Игра ним для двух игроков с двумя кучами и без ограничения на количество забираемых камней.
Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя.
Алгоритм игры выглядит следующим образом:
Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке).
Затем первый ход делает программа и выводит через пробел четыре числа: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй.
Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять.
Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: <куча> <кол-во камней> и ожидать нового ввода пользователя.
После каждого корректного хода игрока или ИИ нужно выводить четыре числа, как и после первого хода ИИ.
Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл!
Все сообщения программы должны строго соответствовать условию.
Формат ввода
Для старта игры вводятся два натуральных числа.
Пример диалога игры:
10
10
2 1 10 9
1
15
Некорректный ход: 1 15
2
10
Некорректный ход: 2 10
2
7
2 7 10 2
1 8 2 2
2
1
2 1 2 1
1 1 1 1
1
1
1 1 0 1
2 1 0 0
ИИ выиграл!
Примечания
Обратите внимание, что ИИ в выводе не показывает получаемые данные от игрока.
<code>
a = int(input())
b = int(input())
while a != 0 or b != 0:

    if a == 0:
        print(1, b, 0, 0)
        b -= b

    elif b == 0:
        print(1, a, 0, 0)
        a -= a

    elif a > 0:
        if a != 1:
            print(1, a - 1, a - (a - 1), b)
            a -= (a - 1)
        else:
            print(1, 1, 0, b)
            a -= 1
    elif b > 0:
        if b != 1:
            print(1, b - 1, a, b - (b - 1))
            b -= (b - 1)
        else:
            print(1, 1, a, 0)
            b -= 1

    if a == 0 and b == 0:
        print("ИИ выиграл!")

    while True:
        c = int(input())
        d = int(input())
        if c == 1:
            if 0 < d <= a:
                break
            else:
                print("Некорректный ход:", c, d)
                continue
        elif c == 2:
            if 0 < d <= b:
                break
            else:
                print("Некорректный ход:", c, d)
                continue
        else:
            print("Некорректный ход:", c, d)
            continue

    if c == 1:
        a -= d
    else:
        b -= d
    print(c, d, a, b)
    if a == 0 and b == 0:
        print("Вы выиграли!")
</code>
Я так сделал но проверка пишет что в некоторых случаях "ИИ должен был выиграть, а проиграл". Нужно написать другой алгоритм ИИ. Я дохринилиард раз пробовал переделывать алгоритм но как видите не получилось(

Вроде выигрышная стратегия в данном случае - это на свой ход всегда уравнивать  количество камней в кучках. Таким образом если после игрока в одной из кучек остаётся 1 камень, то ИИ сравняв кучки, в обоих оставит по одному, что означает выигрыш на свой следующий ход. А если игрок опустошит одну из кучек, то выигрыш сразу. Все остальные случаи сводятся к походу на комбинацию 1:1. Единственное, когда с таким ИИ игрок может выиграть - это когда изначально кучки равны, ИИ вынужден их разбалансировать, а игрок станет исполнять стратегию ИИ, т.е. сам будет выравнивать кучки (и не дай бог ему хоть раз ошибиться :)).
Примерно так:
<code>
# функция взятия amount камней из кучки what
def take(what, amount):
    pile[what] -= amount
    print(what, amount, pile[1], pile[2])

# в словаре хранятся кучки под ключами 1 и 2
pile = {1: int(input()),
        2: int(input())}

while True:
    if pile[1] > pile[2]:   # берём из первой кучки чтобы сравнять кучки
        take(1, pile[1] - pile[2])
    elif pile[1] < pile[2]: # берём из второй кучки чтобы сравнять кучки
        take(2, pile[2] - pile[1])
    else: # кучки уже равны - ничего не остаётся как взять камень из одной из них (лучше брать по минимуму, чтобы измотать игрока - вдруг он где ошибётся, и ИИ перехватит инициативу :))
        take(1, 1)

    if pile[1] == 0 and pile[2] == 0:
        print("ИИ выиграл!")
        break

    while True:
        p = int(input())
        n = int(input())
        if (p == 1 or p == 2) and 0 < n <= pile[p]:
            break
        print("Некорректный ход:", p, n)

    take(p, n)
    if pile[1] == 0 and pile[2] == 0:
        print("Вы выиграли!")
        break
</code>


Добавление Django Channels к DRF
Всем привет!
Пытаюсь добавить в свой проект channel, чтобы слать состояние загрузки файла клиенту (процент загрузки).
У меня есть метод
download_file(), который скачивает файл на сервер из некоторых эндпоинтов.
Получилось добавить channels в проект, но проект - это API без фронта.
asgi.py

import os
import django

from django.core.asgi import get_asgi_application

from src.apps import api
from channels.routing import ProtocolTypeRouter, URLRouter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'src.settings')
django.setup()

application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': URLRouter(api.routing.websocket_urlpatterns),
})

settings.py

THIRD_PARTY_APPS = (
    '...' ,
    'channels',
)

# ...

# channels
ASGI_APPLICATION = 'src.asgi.application'

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_rabbitmq.core.RabbitmqChannelLayer",
    },
}

routing.py

from django.urls import path

from src.apps.api.consumers import DownloadStateConsumer

websocket_urlpatterns = [
    path('download_state/', DownloadStateConsumer.as_asgi()),
]

consumers.py

from channels.generic.websocket import AsyncWebsocketConsumer

class DownloadStateConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def receive(self, text_data=None, bytes_data=None, **kwargs):
        await self.send_json({'message': text_data})

file_download.py

def download_file():
    # ...
    response = requests.get(link.link, stream=True)
    total_length = response.headers.get('content-length')
    size = 0
    with response as r:
        r.raise_for_status()
        with open(filename, 'wb') as f:
            state = -1
            for chunk in r.iter_content(chunk_size=8192):
                size += len(chunk)
                f.write(chunk)
                done = int(100 * size / int(total_length))
                sys.stdout.write("\r%s%s" % (str(done), "%"))
                if done != state:
                    async_to_sync(
                        get_channel_layer().group_send(
                            'download_state', {
                                'type': 'send.percent',
                                'message': done,
                            }
                        )
                    )
                    state = done
                sys.stdout.flush()
    # ...

я так понимаю, что на клиенте должен быть скрипт, типа

const webSocket = new WebSocket(
    'ws://'
    + window.location.host
    + '/download_state/'
);

webSocket.onmessage = function(e) {
    const data = JSON.parse(e.data);
    document.querySelector('#download-state').value = data.message;
};

webSocket.onclose = function(e) {
    console.error('Chat socket closed unexpectedly');
};

Вопрос: как правильно из метода
download_file() отправлять на клиент состояние загрузки? То, как сейчас, не работает - клиент не принимает сообщения. Заранее спасибо!

В итоге я поменяла
channels_rabbitmq на
channels_redis:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

Запустила образ Redis через Docker на указанном порту, и теперь всё работает.


WinError2 не удается найти указанный файл
Пытаюсь запустить несколько скриптов с помощью subprocess, но выбивает ошибку, в чем может быть проблема?
Вот код программы:

import os
from subprocess import call
from subprocess import Popen
import subprocess
from subprocess import sys

try:

    subprocess.call(['C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe','C:/Users/К.Бояр (Второй)/source/repos/Rozetka_Parcer/Rozetka_Parcer/Rozetka_Parcer.py'])
except Exception as e:
    print ('Process failed',e)
try:
    subprocess.call(['C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe','C:/Users/К.Бояр (Второй)/source/repos/ALLOParcer/ALLOParcer/ALLOParcer.py'])
except Exception as e:
    print ('Process failed',e)

Traceback:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\site-packages\selenium\webdriver\common\service.py", line 76, in start
    stdin=PIPE)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 800, in __init__
    restore_signals, start_new_session)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 1207, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] Не удается найти указанный файл

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/К.Бояр (Второй)/source/repos/ALLOParcer/ALLOParcer/ALLOParcer.py", line 81, in <module>
    items = parse(url)
  File "C:/Users/К.Бояр (Второй)/source/repos/ALLOParcer/ALLOParcer/ALLOParcer.py", line 32, in parse
    driver = webdriver.Firefox(options=options)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line 164, in __init__
    self.service.start()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\site-packages\selenium\webdriver\common\service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

Путь верный, смотрел через

import sys

print(sys.executable)

Решение было довольно простое, спасибо за это Эникейщику, нужно было перед ссылкой на
python.exe добавить
r
Примерно вот так:

try:

    subprocess.call([r'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe','C:/Users/К.Бояр (Второй)/source/repos/Rozetka_Parcer/Rozetka_Parcer/Rozetka_Parcer.py'])
except Exception as e:
    print ('Process failed',e)


Как сравнивать время в Python? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

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

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

<code>
import datetime

time = datetime.time(2)

def byTime(time):
    ex = datetime.time(0)
    print(ex)
    g = datetime.time(3)
    print(g)
    if ex < time < g:
        print("excellent")
    else:
        print("ok")

print(time)
byTime(n)
</code>
Код выводит ошибку

'<' not supported between instances of 'datetime.time' and 'int'

хотя у всех тип datetime

byTime(n)

А что у вас в
n? Подозреваю, что там некое число. Заменяете на:

byTime(time)

И всё работает:

02:00:00
00:00:00
03:00:00
excellent


Как зациклить меню, имеющее подменю в python?
Я пытаюсь создать Главное меню с подменю. Я хочу сделать так, чтобы независимо от того, какую последовательность пользователь выбирает из главного меню в подменю, он в конечном итоге будет направлен обратно в Главное
Вот тут-то я и застрял. Прямо сейчас пользователь может пройти через последовательность меню только один раз. Как сделать это повторяющимся циклом?
<code>
choice = None
sub_choice = None
while choice != "0":
    print("""
        main menu
        main 0
        main 1
        main 2
          """
          )
    choice = input("\nChoice: ")
    print()
    if choice == "0":
        print("Goodbye!")
    elif choice == "1":
        print("sub-menu:")
        while sub_choice != "0" :
            print("""
            sub-menu
            sub 0
            sub 1
          """
          )
            sub_choice = input("\nSub-choice : ")
            if sub_choice == "0":
                print("Exit sub-menu!")
            elif sub_choice == "1":
                print("What?")
    elif choice == "2":
        print("hi")
    else:
        print("Sorry, but", choice, "isn't a valid choice.")
input("\n\nPress enter to exit.")
</code>

Как выяснилось, подменю должно содержать в цикле
while True, а не
While sub_choice != "0" и оператор
break для прерывания цикла. Решение :

choice = None
sub_choice = None
while choice != "0":
    print("""
        main menu
        main 0
        main 1
        main 2
          """
          )
    choice = input("\nChoice: ")
    print()
    if choice == "0":
        print("Goodbye!")
    elif choice == "1":
        print("sub-menu:")
        while True:
            print("""
            sub-menu
            sub 0
            sub 1
          """
          )
            sub_choice = input("\nSub-choice : ")
            if sub_choice == "0":
                break
            if sub_choice == "1":
                print("What?")
    elif choice == "2":
        print("hi")
    else:
        print("Sorry, but", choice, "isn't a valid choice.")
input("\n\nPress enter to exit.")


subprocess.call не видит программу
Хочу запустить несколько программ с помощью одного скрипта, но выдает ошибку, в чем проблема?

import os
from subprocess import call
from subprocess import Popen
from subprocess import sys

try:
    subprocess.call(['python3','C:/Users/К.Бояр (Второй)/source/repos/Rozetka_Parcer/Rozetka_Parcer/Rozetka_Parcer.py'])
except Exception as e:
    print ('Process failed',e)
try:
    subprocess.call(['python3','C:/Users/К.Бояр (Второй)/source/repos/ALLOParcer/ALLOParcer/ALLOParcer.py'])
except Exception as e:
    print ('Process failed',e)

Process failed name 'subprocess' is not defined
Process failed name 'subprocess' is not defined
Поток 'MainThread' (0x1) завершился с кодом 0 (0x0).
Программа "python.exe" завершилась с кодом 0 (0x0).

Ну тут что-то одно. Либо импортируете саму библиотеку
subprocess и обращаетесь к ней так, как вы это делаете, через имя библиотеки и потом уже имя функции через точку:

import subprocess

...
try:
    subprocess.call(...

Либо импортируете так, как вы это делаете, конкретную функцию
call из библиотеки
subprocess, но тогда и вызывать нужно именно эту конкретную функцию сразу по имени:

from subprocess import call

...
try:
    call(...

В вашем же случае, поскольку вы не импортировали саму библиотеку
subprocess, питон не понимает, что такое
subprocess у вас дальше в коде программы.


Как правильно сравнить два словаря?
У меня есть два словаря такого вида
<code>
old_dict = {'Anton':'454.44', 'Sergey':'345.65','Petr':'7634.88'}
new_dict = {'Anton':'1123.20', 'Sergey':'85.34','Petr':'677.09'}
</code>
Подскажите пожалуйста, как правильно сравнить эти два словаря с условием, если в new_dict значение больше, чем в old_dict = вывести сообщение.
По ключам имеется ввиду, цифры сравнить, если больше, то вывести сообщение и так по каждому
Заранее спасибо!

Как то так
<code>
old_dict = {'Anton':'454.44', 'Sergey':'345.65','Petr':'7634.88'}
new_dict = {'Anton':'1123.20', 'Sergey':'85.34','Petr':'677.09'}

def main():
    for new, old in zip(new_dict.items(), old_dict.items()):
        if float(new[1]) > float(old[1]):
            print(f"{new[0]} заработал")

if __name__ == '__main__':
    main()
</code>


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

a_dict - словарь (14 ключей id), со вложенными словарями, в которых есть пустые значения
value

b_dict - словарь (12 ключей id), со вложенными словарями, в котором есть заполненные значения
value

Нужно:
Заполнить
a_dict значениями из
b_dict по соответствующим ключам id (id не по порядку и в
a_dict останутся пустые значения, так как id в нем 14)
Первый словарь:

a_dict = {
  "tests": [{
    "id": 1,
    "title": "S",
    "value": ""
  }, {
    "id": 2,
    "title": "D",
    "value": ""
  }, {
    "id": 3,
    "title": "P",
    "value": "",
    "values": [{
      "id": 31,
      "title": "M",
      "value": "",
      "values": [ {
        "id": 311,
        "title": "P",
        "values": [{
          "id": 3111,
          "title": "f",
          "value": ""
        }, {
          "id": 3112,
          "title": "f",
          "value": ""
        }]
      }]
    }, {
      "id": 32,
      "title": "S",
      "value": "",
      "values": [ {
        "id": 321,
        "title": "P",
        "values": [{
          "id": 3211,
          "title": "s",
          "value": ""
        }, {
          "id": 3212,
          "title": "h",
          "value": ""
        }]
      }]
    }]
  }, {
    "id": 4,
    "title": "S",
    "value": "",
    "values": [{
      "id": 41,
      "title": "C",
      "value": ""
    }, {
      "id": 42,
      "title": "I",
      "value": ""
    }]
  }]
}

Второй словарь:

b_dict = {
  "values": [{
    "id": 42,
    "value": "passed"
  }, {
    "id": 1,
    "value": "passed"
  }, {
    "id": 31,
    "value": "passed"
  }, {
    "id": 3,
    "value": "failed"
  }, {
    "id": 2,
    "value": "failed"
  }, {
    "id": 311,
    "value": "passed"
  }, {
    "id": 3111,
    "value": "passed"
  }, {
    "id": 3212,
    "value": "passed"
  }, {
    "id": 4,
    "value": "passed"
  }, {
    "id": 41,
    "value": "failed"
  }, {
    "id": 3211,
    "value": "passed"
  }, {
    "id": 321,
    "value": "failed"
  }]
}

Перечитал много про вложенные словари, но в итоге даже не могу даже распечатать вложенные словари через цикл из a_dict, чтобы заменить
value.

for t in a_dict["tests"]:
    print(("{} "*len(t)).format(t.get('id'), t.get("value"), t.get('title'), t.get('values')))

Подскажите в какую сторону копать. Ощущение, что я что-то упускаю, и будет в итоге что-то типа:

for i in range(len(b_dict['values'])):
    if a_dict[id] == b_dict[id]:
         a_dict['tests'][i]['value'] = b_dict['values'][i]['value']

Только так меняется только одно значение, а как добраться до остальных
value в
a_dict, если они так неравномерно вложены?

id в
a_dict перебором находятся так:

print(a_dict["tests"][0]['id'])  # 2
print(a_dict["tests"][1]['id'])  # 41
print(a_dict["tests"][2]['id'])  # 73
print(a_dict["tests"][2]["values"][0]['id'])  # 345
print(a_dict["tests"][2]["values"][0]["values"][0]['id'])  # 230
print(a_dict["tests"][2]["values"][0]["values"][0]["values"][0]['id'])  # 234
print(a_dict["tests"][2]["values"][0]["values"][0]["values"][1]['id'])  # 653
print(a_dict["tests"][2]["values"][1]['id'])  # 110
print(a_dict["tests"][2]["values"][1]["values"][0]['id'])  # 261
print(a_dict["tests"][2]["values"][1]["values"][0]["values"][0]['id'])  # 238
print(a_dict["tests"][2]["values"][1]["values"][0]["values"][1]['id'])  # 690
print(a_dict["tests"][3]['id'])  # 122
print(a_dict["tests"][3]["values"][0]['id'])  # 5321
print(a_dict["tests"][3]["values"][1]['id'])  # 5322

Можно воспользоваться рекурсивной функцией:

def set_value(d):
    if not isinstance(d, dict):
        return d
    if d.get("value"):
        return d
    r = [x.get("value") for x in b_dict["values"] if x.get("id") == d.get("id")]
    if r and r[0]:
        d["value"] = r[0]
    return d

def apply_recursive(func, obj):
    if isinstance(obj, list):
        return [apply_recursive(func, elem) for elem in obj]
    elif isinstance(obj, dict):
        obj = func(obj)
        return {k: apply_recursive(func, v) for k, v in obj.items()}
    else:
        return func(obj)

вызов:

_ = apply_recursive(set_value, a_dict)

результат:

In [106]: a_dict
Out[106]:
{'tests': [{'id': 1, 'title': 'S', 'value': 'passed'},
  {'id': 2, 'title': 'D', 'value': 'failed'},
  {'id': 3,
   'title': 'P',
   'value': 'failed',
   'values': [{'id': 31,
     'title': 'M',
     'value': 'passed',
     'values': [{'id': 311,
       'title': 'P',
       'values': [{'id': 3111, 'title': 'f', 'value': 'passed'},
        {'id': 3112, 'title': 'f', 'value': ''}],
       'value': 'passed'}]},
    {'id': 32,
     'title': 'S',
     'value': '',
     'values': [{'id': 321,
       'title': 'P',
       'values': [{'id': 3211, 'title': 's', 'value': 'passed'},
        {'id': 3212, 'title': 'h', 'value': 'passed'}],
       'value': 'failed'}]}]},
  {'id': 4,
   'title': 'S',
   'value': 'passed',
   'values': [{'id': 41, 'title': 'C', 'value': 'failed'},
    {'id': 42, 'title': 'I', 'value': 'passed'}]}]}


Ошибка в двоичном поиске [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

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

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

Понимаю логику программы, но не понимаю ошибку...
По моим размышлениям я считываю размеры списков, сами списки
и просто передвигаю метку, сравнивая что находится слева и справа
от нее. Многого не знаю. поэтому прошу помощи и как можно более разжеванную
Ввожу:

10 10

1 61 126 217 2876 6127 39162 98126 712687 1000000000

100 6127 1 61 200 -10000 1 217 10000 1000000000

a, b = map(int, input().split())
elem = [input().split(), int]
zap = [input().split(), int]

for i in zap:
    le = 0
    r = len(elem)

    while 1 < r - le:
        m = (le + r) // 2

        if elem[m] < i: # TypeError: '<' not supported between instances of 'type' and 'list'
            le = m
        elif elem[m] == zap[i]:
            print("Yes")
            break
        else:
            r = m

a, b = map(int, input().split())

Переменные
a и
b вы никак не используете, поэтому эта строчка вообще не нужна.

elem = [input().split(), int]
zap = [input().split(), int]

Тут вы делаете что-то непонятное - создаёте список, внутри которого первым элементом идёт список, полученный разбиением ввода, а второй элемент - тип
int. Из-за чего у вас потом и выходит ошибка - вы сравниваете тип со списком. Вместо этого нужно разбивать ввод на элементы и приводить их к типу
int вот так:

elem = list(map(int, input().split()))
zap = list(map(int, input().split()))

Далее вы итерируетесь по списку и используете элемент списка в качестве индекса в этом же списке:

for i in zap:
    ^^^^^^^^
    ...
    elif elem[m] == zap[i]:
                    ^^^^^^

Естественно, это приводит к ошибке - у вас же всего 10 элементов в списке, а не
100 и не
6127. Сравнивать надо сам элемент списка в этом случае, так же, как это у вас сделано чуть выше для сравнения
<:

    elif elem[m] == i:

После этого всё работает. Ввод:

1 61 126 217 2876 6127 39162 98126 712687 1000000000
100 6127 1 61 200 -10000 1 217 10000 1000000000

Вывод:

Yes 6127
Yes 61
Yes 217
Yes 1000000000


Добрый день,Я новичок нужна помощь с путем питона к файлу(убунту не находит файл питона)
друзья написал код маленького калькулятора на sublime.text, сохранил файл под названием calculator.py в папке Python, после чего вызываю терминал в нем пытаюсь вызвать сохраненный файл и тут мне выводит вот такое с низу
<code>
python3: can't open file 'calculator.py':
[Errno 2] No such file or directory
</code>
Заранее, спасибо всем кто откликнется

Для того чтобы запустить
calculator.py надо сначала в терминале провалиться в эту папку, например:

cd /root/Python

Затем командой
ls проверь находится ли
calculator.py в этой папке, если да, то запускай скрипт

python3 calculator.py

Есть и более простой способ. Открой папку Python и правой кнопкой мыши выбери
Open Terminal Here. Терминал откроется в нужной папке, можешь запускать скрипт.
Как указать конечный путь: открой необходимую папку и вверху нажми на карандаш или по адресной строке. Это и будет конечным путем.


QCheckBox function connecting
у меня возникла проблема из-за не совершенного знания библеотеки pyqt:
Я хочу менять тему всех виджетов в приложении по нажатию на QCheckbox. У меня есть файл theme.py c кодом:

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *

class themes():
    def light_theme(self):
        if self.btn_bw.isChecked() == True:
        global clr_btn_text, clr_btn_bg, clr_btn_hover, clr_btn_prsd, clr_icon, \
            clr_toggle, clr_page_bg, clr_widgets_bg, clr_widgets_border, clr_page_text

        #LEFT MENU BUTTONS
        clr_btn_text = '#2b2b2b'
        clr_btn_bg = '#c3c3c3'
        clr_btn_hover = '#ececec'
        clr_btn_prsd = '#cccccc'

        #ICON
        clr_icon = '#3e3e3e'

        #TOGGLE
        clr_toggle = '#b4b4b4'

        #PAGES
        clr_page_bg = '#9c9c9c'
        clr_widgets_bg = '#d8d8d8'
        clr_widgets_border = '#4c4c4c'
        clr_page_text = '#090909'
    else:
        clr_btn_text = '#c3ccdf'
        clr_btn_bg = '#44475a'
        clr_btn_hover = '#272832'
        clr_btn_prsd = '#2c313a'

        # ICON
        clr_icon = '#c3ccdf'

        # TOGGLE
        clr_toggle = '#323844'

        # PAGES
        clr_page_bg = '#22252c'
        clr_widgets_bg = '#282c34'
        clr_widgets_border = '#c3ccdf'
        clr_page_text = '#ffffff'

В другом файле у меня код со всем виджетами, в него я импортирую класс themes.
Я хочу к примеру по нажатию на Checkbox
self.btn_bw = QCheckBox(self.frame)
изменить цвет frame

    self.frame_basic = QFrame(self.page_3)
    self.frame_basic.setObjectName(u"frame_basic")
    self.frame_basic.setMinimumSize(QSize(450, 330))
    self.frame_basic.setMaximumSize(QSize(450, 330))
    self.frame_basic.setStyleSheet(u"QFrame {\n"
                                "   background-color: clr_widgets_bg;\n"
                                "   color: rgb(255, 255, 255);\n"
                                "   border-radius: 10px;\n"
                                "}")

через
self.btn_bw.connect(themes.light_theme(self)) с
clr_widgets_bg = '#282c34' на
clr_widgets_bg = '#d8d8d8' но мне выдаёт ошибку

self.btn_bw.connect(themes.light_theme(self))
TypeError: PySide6.QtCore.QObject.connect(): not enough arguments

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

Можно так
<code>
import sys

from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
from PySide6.QtWidgets import QCheckBox
from PySide6.QtCore import QSize, SIGNAL, QObject

dark_theme = """
QWidget#MainWindow {
    background-color: #333333;
    }
QPushButton#ButtonPrintMessage{
    background-color: #555555;
    color: #aaaaaa
}
"""

default_theme = """
QWidget#MainWindow {
    background-color: #ffffff;
    }
"""

class Theme(QObject):
    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent
    def dark(self):
        if self.parent.theme_check.isChecked():
            self.parent.setStyleSheet(dark_theme)
    def default(self):
        if not self.parent.theme_check.isChecked():
            self.parent.setStyleSheet(default_theme)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(QSize(180, 120))

        self.setObjectName("MainWindow")

        box = QHBoxLayout()
        self.setLayout(box)

        self.theme = Theme(self)

        self.theme_check = QCheckBox('Тёмная тема', self)

        self.button_print_message = QPushButton("Напечатать сообщение", objectName="ButtonPrintMessage")

        self.theme_check.stateChanged.connect(self.state_changed)
        self.button_print_message.clicked.connect(self.button_print_message_click_handler)

        box.addWidget(self.button_print_message)

    def button_print_message_click_handler(self):
        print('Hello, World!')

    def state_changed(self):
        if self.theme_check.isChecked():
            self.setStyleSheet(dark_theme)
        else:
            self.setStyleSheet(default_theme)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
</code>


Как удалить полноэкранный режим у главного окна?
Не подскажете, как убрать возможность изменения размера окна с использованием PyQt5?

from PyQt5 import QtWidgets, QtCore

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setWindowFlags(window.windowFlags() & ~QtCore.Qt.WindowMaximizeButtonHint) # Так мы убираем возможность нажать кнопку развернуть окно
    window.setFixedSize(window.size()) # а так устанавливаем фиксированный размер окна, без возможности изменить размер мышкой
    window.show()
    sys.exit(app.exec_())


Создание итератора простых чисел
Нужно реализовать класс PrimesIterator, позволяющий итерироваться по простым числам, начиная с заданного. Примеры использования:

for n in PrimesIterator(42): print(n)

for n in PrimesIterator(): print(n)

Что не так с моим кодом?

from math import sqrt
from itertools import count, islice

def is_prime(n):
    return n > 1 and all(n % i for i in islice(count(2), int(sqrt(n) - 1)))

class PrimesIterator:
    def __init__(self, start=0):
        self.start = start

    def __iter__(self):
        return self

    def __next__(self):
        self.start += 1

        if is_prime(self.start):
            return self.start
        else:
            return self.__next__()

ЯндексКонтест:

test_primes_iterator (__main__.SampleTestSuite) ... FAIL

======================================================================
FAIL: test_primes_iterator (__main__.SampleTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "run_tests.py", line 34, in test_primes_iterator
    self.assertEqual(nums, expected_nums)
AssertionError: Lists differ: [1009, 1013, 1019, 1021, 1031, 1033, 1039,[553 chars]1721] != [997, 1009, 1013, 1019, 1021, 1031, 1033, [552 chars]1709]

First differing element 0:
1009
997

Diff is 956 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)

0.0

Судя по всему, нужно переделать код так, чтобы в случае, если переданное при инициализации число уже простое, оно тоже попало в выдачу. Ну и рекурсию я убрал, в питоне рекурсия не бесконечная, плюс к тому она забивает стек лишними данными, обычно всегда можно обойтись без рекурсии:
<code>
    def __next__(self):
        # ищем простое число, начиная с текущего
        while not is_prime(self.start):
            self.start += 1
        # запомним его, чтобы вернуть
        ret = self.start
        # увеличим, чтобы дальше искать следующее
        self.start += 1
        # возвращаем запомненное
        return ret
</code>


Создание функции в Python c двумя аргументами на расчет суммы элементов списка в зависимости от второго аргумента
Нужно написать тело функции
discount_price, которая рассчитывает суммарную стоимость товаров из списка
items_price со скидкой
discount. На выходе функция должна возвращать два значения:
- Суммарная стоимость товаров до скидки.
- Суммарная стоимость товаров после применения скидки.
Мой код следующий:

def discount_price(items_price, discount):
    items_new = []
    while discount:
        for elem in items_price:
            elem_new = elem - (elem * (discount / 100))
            items_new.append(elem_new)
        print(sum(items_price), sum(items_new))
        return discount_price

items_price_1 = [50, 999, 400, 1000, 1800]

discount_1 = 50

discount_price(items_price_1, discount_1)

Вроде бы, все верно. Но если для
discount на вход дать 0 - код не будет работать. В чем соль?
Второй вопрос:
Как реализовать в функции тип
None на вывод?  Например, при вводе пустого списка.
Данный код возвращает
0, 0:

def discount_price(items_price, discount):
    items_new = []
    while discount:
        for elem in items_price:
            if items_price == []:
                return None
            else:
                elem_new = elem - (elem * (discount / 100))
                items_new.append(elem_new)
        print(sum(items_price), sum(items_new))
        return discount_price

items_price_1 = []

discount_1 = 50

discount_price(items_price_1, discount_1)

какая то у вас странная функция
если вы хотите возвращать несколько значений, то используйте списки или кортежи:

def test(a, b):
    return (a - b, a + b)

print(test(7, 5))
print(test(10, 2)[1])

а вы возвращаете вообще указатель на функцию
почему бы вам код не сделать в таком виде:

def discount_price(items_price, discount = 0):
    items_new = []

    for elem in items_price:
        elem_new = elem - (elem * (discount / 100))
        items_new.append(elem_new)

    return (sum(items_price), sum(items_new))

items_price = [50, 999, 400, 1000, 1800]

discount = 50

print(discount_price(items_price, discount))

ну и сам код можно написать покороче:

def discount_price(items_price, discount = 0):
    items_new = map(lambda elem: elem * (1 - discount / 100), items_price)
    return (sum(items_price), sum(items_new))

items_price = [50, 999, 400, 1000, 1800]
discount = 50

print(discount_price(items_price, discount))
print(discount_price(items_price)) # скидка 0%

P.S.
добавил возможность возвращать
None:

def discount_price(items_price = [], discount = 100):

    if items_price is None or len(items_price) == 0:
        return None

    items_new = map(lambda elem: elem * (1 - 0.01 * discount), items_price)
    return (sum(items_price), sum(items_new))

items_price = [50, 999, 400, 1000, 1800]
discount = 50

res1 = discount_price([], discount)
print(res1)

res2 = discount_price(items_price, discount)
print(res2)


Найти номера и координаты точек, наиболее удалённых друг от друга
На вход подаётся N точек, заданных парой координат x и y. Найти номера и координаты точек, наиболее удалённых друг от друга. Расстояние между точками определять с помощью функции. (2 балла вы получаете за полное соблюдение формата вывода)
У меня была вот такая идея для кода, но дальше немного не понимаю, что сделать, то ли сравнивать каждый элемент массива, то ли что
<code>
import math
def f(x1,y1,x2,y2):
    return math.sqrt(((x2-x1)**2 + (y2-y1)**2))
mas_x = []
mas_y = []
numbers = int(input())
for i in range(numbers):
    x,y = map(int,input().split())
    mas_x.append(x)
    mas_y.append(y)
</code>

В паре вложенных циклов обходите все пары точек.
<code>
for i in range(numbers):
   for j in range(i+1, numbers):
       dist = f(mas_x[i],mas_y[i],mas_x[j],mas_x[j])
</code>
Для более оптимального решения  (я думаю, в вашем случае этого не требуется)- строите выпуклую оболочку (convex hull), проходите по ней с помощью rotating calipers.


Почему логические or и | работают по разному?
Почему логические or и | работают по разному? Вот собственно и весь вопрос.
<code>
In [1]: 5 or 15
Out[1]: 5

In [1]: 5 | 15
Out[2]: 15
</code>
И было бы здорово, чтобы кто-то объяснил смысл такого кодирования этих операций. А то не знаю, что сказать ученикам ))

| — это оператор побитового ИЛИ.
Результат получается путём применения ИЛИ попарно к битам переданных чисел:

0101
1111
____
1111 = 15


Как сделать имя таблицы в sqlite3 с черточкой
Необходимо сделать имя таблицы в sqlite3 с черточкой, хочу её сохранить и назвать так: SHOPPING-CART, но происходит ошибка:

Возникло исключение: OperationalError
near "-": syntax error

Код с помощью которого пытаюсь это сделать:

q = ('''CREATE TABLE IF NOT EXISTS {table} (
        userID INT PRIMARY KEY,
        user-cart TEXT
    )''')

sql.execute(q.format(table='SHOPPING-CART'))

Подскажите в чем проблема, потому что через DB Browser for sqlite3 спокойно можно это сделать.

Это плохая идея и не стоит использовать такие имена.
Но так можно сделать. Надо такие названия заключать в двойные кавычки
<code>
q = ('''CREATE TABLE IF NOT EXISTS {table} (
        userID INT PRIMARY KEY,
        "user-cart" TEXT
    )''')

sql.execute(q.format(table='"SHOPPING-CART"'))
</code>


Как распарсить сложную строку?
Есть строка, которую нужно распарсить:

from typing import List
def parse_str(st:str) -> List[str]:
    return # смотри пример

Пример работы функции:

st = 'op:dsafllksaf cl:lsdfjlal;sdf op:laksdjfljsa op: alsdfjl;ksadjf;l cl:asdflkj'
parse_str(st)
>>> ['op:dsafllksaf','cl:lsdfjlal;sdf', 'op:laksdjfljsa',
     'op: alsdfjl;ksadjf;l', 'cl:asdflkj']

Единственное до чего я дошел - это распарсить его используя регулярки
re.split('op|cl', st). Но это возвращает не то, что нужно.

Рерулярке вполне такое взять под силу.

import re
def parse_str(st):
    return re.findall(r"(.+?:.+?)(?:\s+|$)", st)

Или через тот же
re.split():

def parse_str(st):
    return re.split(r"(?<!:)\s+(?!:)", st)

['op:dsafllksaf',
 'cl:lsdfjlal;sdf',
 'op:laksdjfljsa',
 'op: alsdfjl;ksadjf;l',
 'cl:asdflkj']


хочу удалить последний напечатанный символ и правильно найти интервал
В самом внизу сам код.
Хотел бы, чтобы не выводил последний
| и правильное количество раз выводил
-.
Вот примеры:
ввод:

2
10

вывод:

x|p|x|p|x|p|x|p|x
-----------------
p|x|p|p|x|p|p|x|p
-----------------
x|p|x|p|x|p|x| |x
-----------------
p|p|p|x|p|p|p|p|x
-----------------
x|x|x|p|x|p|x|x|x
-----------------
p|p|p|p|p|x|p|p|p
-----------------
x|p|x|p|x|p|x| |x
-----------------
p|x| |p|x|p| |x|
-----------------
x|p|x|x|x|p|x| |x

Вот еще один пример -
ввод:

11
10

вывод:

x|p
---
p|x

Тут пример как работает мой код
ввод:

2
10

вывод:

x|p|x|p|x|p|x|p|x|
--------
p|x|p|p|x|p|p|x|p|
--------
x|p|x|p|x|p|x| |x|
--------
p|p|p|x|p|p|p|p|x|
--------
x|x|x|p|x|p|x|x|x|
--------
p|p|p|p|p|x|p|p|p|
--------
x|p|x|p|x|p|x| |x|
--------
p|x| |p|x|p| |x| |
--------
x|p|x|x|x|p|x| |x|
--------

пример второй
ввод:

11
10

вывод:

x|p|
-
p|x|
-

Вот сам код:

import math

a = int(input())
b = int(input())

if a<2 or b<2 or a==b:
    print('ERROR')

def gcd(x,y):
    if y==0:
        return x
    else:
        return gcd(y, x%y)

def task(x,y):
    return gcd(x,y)==1

def isPrime(n):
    if n == 2:
        return True
    if n % 2 == 0 or n <= 1:
        return False
    sqr = int(math.sqrt(n)+1)

    for k in range(3, sqr, 2):
        if n % k == 0:
            return False
    return True

for i in range(a, b+1):
    for j in range(a, b+1):
        if task(i,j)==True and (isPrime(i) == True or isPrime(j) == True):
            print("p", end="")
        elif task(i,j)==False:
            print("x", end="")
        else:
            print(" ", end="")
        print("|" , end='')
    print("")
    for k in range(a, b):
        print("-", end="")
    print("")

if a > b:
    for i in range(b, a+1):
        for j in range(b, a+1):
            if task(i,j)==True and (isPrime(i) == True or isPrime(j) == True):
                print("p", end="")
            elif task(i,j)==False:
                print("x", end="")
            else:
                print(" ", end="")
            print("|" ,end='')

        print("")
        for k in range(b, a):
            print("-", end="")
        print("")

Пара советов, но можно игнорировать:

исполняемый код пишите в main функции и вызывайте через
if __name__ == '__main__': main()
названия пишите функций в snake_case
сравнивайте
True или
False через
is, однако если вам нужна правдивость, то просто опустите сравнение, или укажите
not

Собственно решение (немного подчистил, не обессудьте)

from functools import lru_cache

import math

@lru_cache()
def gcd(x, y):
    return x if y == 0 else gcd(y, x % y)

@lru_cache()
def task(x, y):
    return gcd(x, y) == 1

@lru_cache()
def is_prime(n):
    if n == 2:
        return True
    if n % 2 == 0 or n <= 1:
        return False
    sqr = int(math.sqrt(n) + 1)

    for k in range(3, sqr, 2):
        if n % k == 0:
            return False
    return True

def print_table(x, y):
    line = '\n' + '--' * abs(y - x) + '-\n'
    print(line.join([
        '|'.join([
            'x' if not task(i, j) else 'p' if is_prime(i) or is_prime(j) else ' '
            for j in range(x, y + 1)
        ])
        for i in range(x, y + 1)
    ]))

def main():
    a = int(input())
    b = int(input())

    if a < 2 or b < 2 or a == b:
        print('ERROR')

    print_table(a, b)
    if a > b:
        print_table(b, a)

if __name__ == '__main__':
    main()

ОБНОВЛЕНО:

Вместо for -> if -> append использовано list comprehension
Добавлен декоратор
@lru_cache для ускорения работы


Conway's "Game of life" на Python
Заранее спасибо всем кто откликнется. Я в этом деле новичок так что тапками кидать не сильно)
Недавно решил реализовать самую простую модель клеточного автомата в консоли на Python.
Застрял на моменте создания правил.
(Я так подозреваю.Может быть проблема в другом)
Как нулевое поколение прописал самый простой глайдер.
После первого поколения клетки впадают в "статичное" состояние.
результаты вывода прикреплю чуть ниже кода
Сам код:

from copy import deepcopy
Board = [
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, False, True, True, True, True, True, True, True, True, True], # 10 * 10 - Starter
[True, True, True, False, True, True, True, True, True, True, True, True], # 12 * 12 - Edited
[True, False, False, False, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True]]

def CreateNewBoard(board):
    Dead = []
    Alive = []
    for y in range(1,11):
        for x in range(1,11):
            counter = -1
            for i in range(y-1,y+2):
                for j in range(x-1,x+2):
                    if not board[i][j]:
                        counter += 1
            if counter == 2 and not board[y][x]:
                Alive.append([y,x])
            elif counter == 3:
                Alive.append([y,x])
            else:
                Dead.append([y,x])
    NewBoard = [[True]*12 for _ in range(12)]
    for cell in Alive:
        NewBoard[cell[0]][cell[1]] = False
    for cell in Dead:
        NewBoard[cell[0]][cell[1]] = True
    return NewBoard

def printBoard(board):
    board1 = deepcopy(board)
    for y in range(1,11):
        for x in range(1,11):
            if board1[y][x]:
                board1[y][x] = 'O'
            else:
                board1[y][x] = '#'
        print(*board1[y][1:11])

printBoard(Board)
while input() != 'q':
    Board = CreateNewBoard(Board)
    printBoard(Board)

# Нулевое поколение
O # O O O O O O O O
O O # O O O O O O O
# # # O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O

#Первое поколение, последующие точно такие же
O O O O O O O O O O
O O # O O O O O O O
O # # O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O

Честно, сложно было читать, так что просто переписал частично. Сама ваша ошибка заключалась в
counter = -1. Там должно было быть
counter = 0 и
if cell: counter -= 1, т.к. вычитать 1 надо только, если ячейка "жива", а не всегда. Так же подправил названия под PEP-8 и чутка улучшил "рендер" :D
P.S. единицы и ноли не жрут больше памяти, т.к. от -5 до 255 (вроде столько) целые числа заранее зарегистрированы и мы просто копируем указатель на них

from copy import deepcopy

def update_board(board: list[list[int]]) -> list[list[int]]:
    new_board = deepcopy(board)
    for x, row in enumerate(board[1:-1], 1):
        for y, cell in enumerate(row[1:-1], 1):
            neighbours = sum(
                board[i][j]
                for i in range(x - 1, x + 2)
                for j in range(y - 1, y + 2)
            ) - cell
            if cell:
                new_board[x][y] = int(2 <= neighbours <= 3)
            elif neighbours == 3:
                new_board[x][y] = 1
    return new_board

def print_board(board):
    for row in board[1:-1]:
        print(*['■' if cell else '□' for cell in row[1:-1]])

def main():
    # Планер
    board = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ]
    print_board(board)
    while input() != 'q':
        board = update_board(board)
        print_board(board)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print()


перепись с Питона на Си [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

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

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

Пожалуйста, помогите разогнать код или перевести код из Питона в Си:
<code>
numbers = [x, y, z, t]
for a in range(-1000, 1001):
    for b in range(-1000, 1001):
        for c in range(-1000, 1001):
            if a + b in numbers:
                numbers.remove(a+b)
                if a + c in numbers:
                    numbers.remove(a + c)
                    if b + c in numbers:
                        numbers.remove(b + c)
                        if a + b + c in numbers:
                            print(f'a = {a} | b = {b} | c = {c} ')
            numbers = [x, y, z, t]
</code>
проблема в том, что рэндж будет больше для работы с большими числами, но питон это слишком долго обрабатывает, поэтому я подумал, что проще будет все переделать в Си, но я не знаю Си, поэтому прошу о помощи...

если посмотреть на циклы, то тут перебирать много-много. очень много. Но давайте посмотрим внимательней. Очевидно, что
a+b должно быть одним с 4 заданных чисел. Аналогично и с
a+c. А это значит, что если зафиксировать
a, то значения
b и
с входят в небольшой массив на 4 элемента. Всего то. А это сокращает время перебора в
250000 раз! Я не сильно переделывал код, совсем минимально.

numbers = [x, y, z, t]
for a in range(-1000, 1001):
    # это наш новый массив вариантов
    nr = [q - a for q in numbers]
    for b in nr: # и теперь бежим по маленькому списку
        for c in nr:  # аналоично
            if a + b in numbers: # вообще то это условие уже истинно, но мне лень
                numbers.remove(a+b)
                if a + c in numbers: # и это, но что если используем один вариант?
                    numbers.remove(a + c)
                    if b + c in numbers: # а это точно нужно проверить
                        numbers.remove(b + c)
                        if a + b + c in numbers: # надо было бы и это обыграть
                            print(f'a = {a} | b = {b} | c = {c} ')
            numbers = [x, y, z, t]

да, у этого кода есть одна маленькая проблема - в массиве
nr могут быть числа, которые выходят за диапазон
[-1000, 1000], но пусть это будет домашним заданием.
у меня этот код отрабатывает за доли секунды. Я увеличил диапазон до
[-10000,10001] (в 100 раз!) и считало за 2 с половиной секунды на очень стареньком процессоре.


OSError: [WinError 123], как решить?
Пока обучаюсь питону и решил написать простенькую прогу которая создаёт файл в нужном нам пути с текстом внутри, сама прога:
<code>
import os
put=input ("Введите путь до файла")
name=input ("Введите название файла + расширение ")
text=input ("Введите текст")
try:
    os.chdir(put)
except FileNotFoundError:
                         os.mkdir(put)
os.chdir(put)
file=open (name,"w+")
file.write (text)
</code>
Буду рад если объяснят максимально простым языком

OSError: [WinError 123] Неверный синтаксис имени файла, имени каталога или метки тома

Неплохо бы увидеть полный текст ошибки после какого ввода она появляется
Это может возникать здесь:

put=input ("Введите путь до файла")

file=open (name,"w+")

Сразу после ввода добавьте

print(put)
print(name)

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


Как задать все уровни логирования logging python?
Как сохранять в файле не только 1 уровень логирования (в данном примере уровень INFO, т.к. это мы настроили в начале), а вообще все? Здесь уровень debug не записывается в файл. Как записать? Вместе с warning, error и critical?
<code>
import logging

logging.basicConfig(
    filename='test.log',
    format='%(name)s %(message)s',
    level=logging.INFO # как задать все уровень логирования, а не только INFO
)

for i in range(10):
    if i < 5:
        logging.info(i)
    else:
        logging.debug(i) # не записывается
</code>

<code>
>>> import logging
>>> print(logging.CRITICAL, logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG)
50 40 30 20 10
>>>
</code>
Вывод определяется условием больше-меньше. Если задать logging.DEBUG то выдаст всё с уровнем выше 10.


Можно ли заменить бесконечный цикл while на обычный [закрыт]

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

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

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

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

Пытаюсь заменить бесконечный цикл на обычный, но не выходит.

N = 5000
a = 10000000000000000000
b = 99999999999999999999
lst = []

while len(lst) < N:
    arr = [str(randint(a, b))[g:(g+4):] for g in range (0 , 20 , 5)]
    print(arr)

Я создал лист, в котором
N(=5000)
20 разрядные числа.
Эти числа надо разделить на
4-4 группы.
Заменить, но без использования
break и
continue.
Также можно заменить на цикл
for, но и это у меня не выходит.

У вас вообще никак
lst внутри цикла не меняется, получается, что цикл будет действительно бесконечным. Предположу, что в
lst должен добавляться
arr на каждой итерации цикла, т.е. цикл идёт пока в
lst не будет
N элементов. Тогда заменить на
for очень просто:

from random import randint

N = 5000
a = 10000000000000000000
b = 99999999999999999999
lst = []

for _ in range(N):
    arr = [str(randint(a, b))[g:(g+4):] for g in range (0 , 20 , 5)]
    #print(arr)
    lst.append(arr)

Печать я закомментировал, чтобы экран не забивался кучей информации.


near "?" syntax error в sqlite3 python
Пытаюсь понять как работать с базами данных sqlite и надо вытащить из таблицы значение, при этом в where надо подставить перменную
<code>
cursor.execute("""SELECT preds FROM members WHERE memID = ?????????????????? """, (mem))
</code>
переменная mem имеет 18 символов как и количество "?", если это неправильно - это сделано из-за того что он жаловался на количество символов в переменной. Я не знаю почему выходит ошибка. Как это исправить

Знаки вопроса ставятся по числу переменных, соответственно должен быть только 1.
Скорее всего ошибка в этом (источник):

In Python, a tuple containing a single value must include a comma. For example, ('abc') is evaluated as a scalar while ('abc',) is evaluated as a tuple.

Значит должно быть
(mem,)