Нужна функция, сокращающая большие числа в python до int 4 байта
Всем привет. Я портирую необходимый мне ГПСЧ с языка C++ на python. Всё бы ничего, но там вся математика построена на том, что переменные не могут выйти за предел заданного размера. Вот так например выглядит инициализация объекта:

    void Generate( unsigned int seed )
    {
        rndNumbers[ 0 ] = seed;
        for( int i = 1; i < periodN; i++ )
            rndNumbers[ i ] = ( 1812433253 * ( rndNumbers[ i - 1 ] ^ ( rndNumbers[ i - 1 ] >> 30 ) ) + i );
        GenerateState();
    }

/*
результат
1812433254
3713160357
3109174145
64984499
*/

На C++ эта функция возвращает числа не превышающие ~4.2 миллиарда. На питоне же она растёт экспоненциально:

    def Generate(self, seed):
        # Randomizer.rndNumbers[0] = seed
        Randomizer.rndNumbers.insert(0, seed)
        i = 1
        for i in range(i, Randomizer.periodN):
            buf = 1812433253 * (Randomizer.rndNumbers[i - 1] ^ (Randomizer.rndNumbers[i - 1] >> 30)) + i
           # convert = Randomizer.sign32neg(self, buf)
            Randomizer.rndNumbers.insert(i, buf)
            print(buf)
        Randomizer.GenerateState(self)

# результат
# 1812433254
# 3284914300205028517
# 5953687907471897995228510841
# 10790661948188992052692469723994213968

Я весь интернет перерыл, но так и не нашёл подходящую функцию. Самое близкое что я нашёл была функция

def sign32neg(self, value):
    value &= 0x7FFFFFFF
    value = int(value)
    value = ~value
    value ^= 0x7FFFFFFF
    value += 2**32
    return value

, но она срабатывает только в половине случаев. Подскажите пожалуйста, как исправить это.

Для unsigned просто обрезаете. Для signed чутка посложнее.
<code>
unsigned_int32 = lambda value: value & 0xffffffff
signed_int32   = lambda value: ((value & 0xffffffff) ^ 0x80000000) - 0x80000000

print(unsigned_int32(0xFFFFFFFF))  # == 4294967295
print(  signed_int32(0xFFFFFFFF))  # == -1
</code>


Как добавить к каждому повторяющемуся элементу списка вводимый элемент?
У меня есть список и к каждому элементу
nan необходимо дублировать этот же самый
nan рядом с ним.

['nan', 'nan', 'nan', 'Физ', 'Б', 'АлгП', 'Кир', 'ИЯ', 'Ник', 'nan', 'Кин', 'nan']

И мне необходимо получить:

['nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'Физ', 'Б', 'АлгП', 'Кир', 'ИЯ', 'Ник', 'nan', 'nan', 'Кин', 'nan', 'nan']

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

if ['nan'][0] in b:
    b.insert(1,'nan')
elif ['nan'][1] in b:
    b.insert(2, 'nan')

Надо не вставлять в имеющийся список (изменять список, по которому идет проход, в большинстве случаев очень плохая идея), а создать новый
<code>
a = []
for el in b:
    a.append(el)
    if el == "nan":
        a.append("nan")
</code>


Запрос GQL в WebApp2
Есть таблицы:

class Table1(webapp2_extras.appengine.auth.models.User, ndb.Model):
    is_admin = ndb.BooleanProperty(default=False)
    created = ndb.DateTimeProperty(auto_now_add=True)
    email = ndb.StringProperty(default='')

    def __dict__(self):
        return {
            'id': self.get_id(),
            'email': self.email,
        }

class Table2(ndb.Model):
    name = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
    gcs_file = ndb.StringProperty()
    owner = ndb.KeyProperty(kind=Table1)

Могу получить все id пользователей с
[email protected]:

emailUser = '[email protected]'
data_request = Table1.query(Table1.email == emailUser)
self.emailUser = emailUser
all_obj_table1 = []
for data in data_request:
            all_obj_table1.append({
                'id': data.__dict__()['id'],
                'is_admin': is_admin,
                '_obj_': data
            })
for data in all_obj_table1:
    print(data['id'])

А вот получить данные из 2ой таблицы, по данным из 1ой - не получается.
Кто работал с
webApp2, как получить все
name из
Table2 по
emailUser?

Во-общем, я решил эту проблему следующим образом (конечно, код адаптирован для понимания):

from google.appengine.ext import ndb

class Table3(object):
    def __init__(self, emailUser, dbTable1):
        data_request = dbTable1.query(dbTable1.email == emailUser)
        self.emailUser = emailUser
        self.dbTable1 = dbTable1

        all_obj_table1= []
        for data in data_request:
            all_obj_tableUSER.append({
                'id': data.__dict__()['id']
            })

        self.all_obj_table1 = all_obj_table1
        self.idUser = int(all_obj_table1[0]['id'])

    def get_Key(self):
        return ndb.Key(self.dbTable1, self.idUser)

    def getData(self, _Table2):
        user_key = self.get_Key()
        request_table2 = _Table2.query(_Table2.owner == user_key)
        all_lst_nameTable1 = []
        for data in reverse_request_SliderPresentation:
            all_lst_nameTable1.append(data.name)
        return all_lst_nameTable1

Самая важная функция здесь - это
get_Key(), т.к. она получает нужный тип данных и значение, который надо использовать в запросе для первичного ключа.


Сортировка списка с вложенными словарями. Python [закрыт]

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

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

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

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

У меня есть список с данными о студентах:
<code>
students = [
    {'name': 'Maxim', 'age': 23, 'course': 'excel', 'gender': 'Male'},
    {'name': 'Anna', 'age': 19, 'course': 'word', 'gender': 'Female'},
    {'name': 'Bogdan', 'age': 21, 'course': 'powerpoint', 'gender': 'Male'}
]
</code>
Мне нужно отсортировать этот список отдельно по именам, возрасту и курсу студентов с помощью sorted() и lambda.

Так и хочется на хамство ответить хамством: "Мне нужно...." -  "Вам нужно -  вы и сортируйте". Но учитывая, что вы новичок (а новичков тут стараются не обижать), и судя по всем - школьного возраста, дам ответ:
Сортировка отдельно, по именам, возрасту и курсу студентов:
<code>
sorted(students, key=lambda x: x['name'])
sorted(students, key=lambda x: x['age'])
sorted(students, key=lambda x: x['course'])
</code>
Впредь учтите, что тут коллектив взрослых людей, а не школьников средних классов. И нормы поведения тут соответствующие.


Нахождение суммы элементов и длины вложенных списков в двумерном массиве. Python
У меня есть двумерный список с произвольным количеством и значением чисел (элементы каждый раз разные):

arr = [
[2, 4, 6],
[10, 21, 5, 4],
[1, 2]
]

Мне нужно найти количество и сумму элементов каждого вложенного списка по отдельности, не используя функции
len() и
sum().

Для этого Вы можете использовать вложенные циклы(код даже не запускал, доделывайте)

arr = [
[2, 4, 6],
[10, 21, 5, 4],
[1, 2]
]

result_count = []
result_sum = []

for el in arr:
    # Перебираем список
    sum = 0
    count = 0
    for i in el:
        # Перебираем вложенный список
        sum += i
        count += 1
        # Здесь забирайте Ваши значения, как Вам надо

        # Пример:
    result_count.append(count)
    result_sum.append(sum)

Важно!
Я очень надеюсь, что Ваше решение не использовать
sum() и
len() полностью оправданно. Если же у Вас просто затруднения с ними, я советую их использовать
Вот намного упрощенный код, рекомендую делать так:

arr = [
[2, 4, 6],
[10, 21, 5, 4],
[1, 2]
]

result_count = []
result_sum = []

for el in arr:
    # Перебираем список
    result_count.append(len(el)) # Просто забираем длину
    result_sum.append(sum(el)) # Забираем сумму


Отображения графика кластеризации методом k-средних
Есть датасет, по двум выборочным столбцам которого я хочу провести кластеризацию с помощью метода k-средних, но получаю ошибку:

x and y must have same first dimension, but have shapes (10,) and (1,)

Код:
<code>
from sklearn.cluster import KMeans
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df=pd.read_csv('train.csv')
wcss=[]

x=df.iloc[:,[4,80]].values
for i in range(1,11):
   kmeans=KMeans(n_clusters=i, init='k-means++', random_state=42)
   kmeans.fit(x)
   wcss.append(kmeans.inertia_)
   plt.plot(range(1, 11), wcss)
   plt.xlabel('Number of clusters')
   plt.ylabel('WCSS')
   plt.show()
</code>

У вас лишний отступ в коде. Отрисовку нужно делать после того, как вы собрали данные по всем вариантам кластеризации. На каждой итерации цикла у вас получается одно значение, нужно собрать их все для отрисовки:
<code>
for i in range(1,11):
    kmeans=KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(x)
    wcss.append(kmeans.inertia_)

# отрисовка после того, как собраны все данные
plt.plot(range(1, 11), wcss)
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
</code>
Кстати, не уверен, что с одним кластером не будет ругаться, мне кажется нужно от 2-х кластеров начинать пробовать.


При решении задачи в PyCharm все отлично но на платформе Stepik выдает ошибку
Подсписки списка 🌶🌶
Подсписок — часть другого списка. Подсписок может содержать один элемент, несколько, и даже ни одного. Например, [1], [2], [3] и [4] — подсписки списка [1, 2, 3, 4]. Список [2, 3] — подсписок списка [1, 2, 3, 4], но список [2, 4] не подсписок списка [1, 2, 3, 4], так как элементы 22 и 44 во втором списке не смежные. Пустой список — подсписок любого списка. Сам список — подсписок самого себя, то есть список [1, 2, 3, 4] подсписок списка [1, 2, 3, 4].
На вход программе подается строка текста, содержащая символы. Из данной строки формируется список. Напишите программу, которая выводит список, содержащий все возможные подсписки списка, включая пустой список.
Формат входных данных
На вход программе подается строка текста, содержащая символы, отделенные символом пробела.
Формат выходных данных
Программа должна вывести указанный список, содержащий все возможные подсписки, включая пустой список в соответствии с примерами.
Примечание. Порядок списков одинаковой длины должен соответствовать порядку их вхождения в основной список.
Тест
Входные данные: a b
Выходные данные: [[], ['a'], ['b'], ['a', 'b']]
Мое решение

y = [[]]
v = []
counter = 0

while True:
    x = input().split()
    if x:
        for i in range(0, len(x)):
            v = []
            for j in x:
                v.append(j)
                if i+1 == len(v):
                    y.append(v)
                    c = v[1:]
                    v = c
        print(y)
    else:
        break

ОШИБКА

Failed test #1 of 9. Runtime error

This is a sample test from the problem statement!

Test input:
a b
Correct output:
[[], ['a'], ['b'], ['a', 'b']]

Your code output:
[[], ['a'], ['b'], ['a', 'b']]

Error:
Traceback (most recent call last):
  File "jailed_code", line 7, in <module>
    x = input().split()
EOFError: EOF when reading a line

Вам нужно читать только одну строку из стандартного ввода:
<code>
y = [[]]
v = []
counter = 0

x = input().split()

for i in range(0, len(x)):
    v = []
    for j in x:
        v.append(j)
        if i+1 == len(v):
            y.append(v)
            c = v[1:]
            v = c
print(y)
</code>


Как через input() ввести данные в одну строку вместе с задаваемым текстом python
Требуется написать так, чтобы выводилось "Введите число часов (ввод) и минут (ввод) для сна"
Как это сделать? Возможно ли?
Не хочется вводить данные в две строки. Видела реализацию с использованием slpit(), но там не требовалось выводить текст для пользователя

hours_minutes = input('Введите число часов и минут для сна:').split(":")
print(hours_minutes)

Вводим:
10:20
Результат:
['10', '20']


Как реверснуть список?

first = [0, 1, 0, 3, 0, 3, 0]
second = first.reverse()
print(first, second)

Выводит "
[0, 3, 0, 3, 0, 1, 0] None", а не "
[0, 1, 0, 3, 0 , 3, 0], [0, 3, 0, 3, 0, 1, 0]". Как исправить и почему так происходит?

метод
reverse изменяет оригинальный список, поэтому результат сохранять не надо

arr = [0, 1, 0, 3, 0, 3, 0]
arr.reverse()
print(arr)

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

reversed_arr = list(reversed(arr))


Почему не работает условие на input?
На языке Python я столкнулся с проблемой условий. Что я делаю не так? Почему если прописать в input(переменная reason) w в нижнем или верхнем регистре то ничего не выведется.
<code>
if reason == ["w", "W"]:
    print("true")
</code>

Вот так должно сработать

if reason in ["w", "W"]:
    print("true")

Вы пытаетесь сравнить строку и лист. Это не верно. Вам нужно спросить "есть ли строка(символ) в данном списке"
Чтобы избежать сравнивание строчной и прописной буквы, то можно сделать так:

if reason.lower() == "w":
    print("true")


Как закрыть доступ к голосовому каналу? Discord.py
у меня есть код, который создает голосовой канал:

@client.event
async def on_voice_state_update(member, before, after):
    if after.channel != None:
       if after.channel.id == 929392137135611984:
           category = after.channel.category

           channel2 = await member.guild.create_voice_channel(
               name = f'│🔒│войс { member.display_name }',
               category = category,
           )

           role = member.guild.get_role(role_id = 929388475160096769)
           await member.add_roles(role)

           await channel2.set_permissions(member, connect = True)
           await member.move_to(channel2)

           def check(x, y, z): return len(channel2.members) == 0

           await client.wait_for('voice_state_update', check = check)
           await channel2.delete()

           await member.remove_roles(role)

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

@client.command()
@commands.has_role(929388475160096769)
async def lock(ctx):
    role = "@everyone"
    if ctx.author.voice and ctx.author.voice.channel:
        channel = ctx.author.voice.channel
        await channel.set_permissions(role, connect = False)
    else:
        await ctx.send("Вы не находитесь в голосовом канале")
        return

Нужно передать объект роли
<code>
@client.command()
@commands.has_role(929388475160096769)
async def lock(ctx):
    if ctx.author.voice and ctx.author.voice.channel:
        channel = ctx.author.voice.channel
        await channel.set_permissions(discord.utils.get(ctx.guild.roles, id='айди роли'), connect = False)
    else:
        await ctx.send("Вы не находитесь в голосовом канале")
        return
</code>


Как присвоить жанрам музыки вес в виде 0 или 1 на каждый жанр(присутствует или отсутствует)
У меня проект по машинному обучению, на классификацию жанров музыки и добавление их в БД, машину я уже обучил, и она уже предсказывает жанры, но только в массиве, поэтому я хочу присвоить жанрам вес в виде 0 или 1, чтобы по массиву программа мне выводила отсутствует или присутствует. На пример [0,1,0,0,0,0,0,0...,0]

genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
file = open('data2.csv', 'w', newline='')
with file:
    writer = csv.writer(file)
    writer.writerow(header)
for filename in os.listdir(f'/content/drive/MyDrive/music'):
    songname = f'/content/drive/MyDrive/music/{filename}'
    y, sr = librosa.load(songname, mono=True, duration=30)
    chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
    rmse = librosa.feature.rms(y=y)
    spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
    spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
    rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
    zcr = librosa.feature.zero_crossing_rate(y)
    mfcc = librosa.feature.mfcc(y=y, sr=sr)
    to_append = f'{filename} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'
    for e in mfcc:
        to_append += f' {np.mean(e)}'
    file = open('data2.csv', 'a', newline='')
    with file:
        writer = csv.writer(file)
        writer.writerow(to_append.split())
new_data.shape
new_data = new_data.drop(['filename'],axis=1)
genre_list = new_data.iloc[:, -1]
encoder = LabelEncoder()
y = encoder.fit_transform(genre_list)
X_new = scaler.fit_transform(np.array(new_data, dtype = float))
ynew = softmax(X_new)
print(ynew)

это то что оно выводит

[[0.0026979  0.00919354 0.00297058 0.00202884 0.00236537 0.00417573
  0.00427148 0.02581489 0.02394866 0.00905851 0.01048179 0.00299542
  0.00631784 0.01860214 0.00377617 0.00204791 0.00208164 0.00215192
  0.00219006 0.00226448 0.00250438 0.00199827 0.00558735 0.00240505
  0.00497674 0.00677883]
 [0.03046013 0.00227962 0.03192484 0.01345833 0.02737673 0.03365876
  0.00382085 0.00225602 0.00215641 0.00229429 0.00216659 0.00572082
  0.00279603 0.00200335 0.00432507 0.01282093 0.02204453 0.01069332
  0.01016923 0.00933927 0.00758227 0.01513128 0.00304784 0.00819185
  0.00333723 0.002673  ]
 [0.00667839 0.02618689 0.00578708 0.02009972 0.00847519 0.00390481
  0.0336273  0.0094236  0.01062719 0.02640737 0.02416675 0.03202684
  0.03106844 0.01472684 0.03360354 0.02090257 0.01195979 0.02385014
  0.02464251 0.0259507  0.0289022  0.01815095 0.03222784 0.02785633
  0.0330445  0.03028845]]

<code>
def absolute(x):
    if x > 0.5: return 1
    else: return 0
def mapper(lis):
    return list(map(absolute, lis))
ynew_new = list(map(mapper, ynew))
</code>
Ну пожалуй как-нибудь так.


Проблема с Zlib inflate на python (есть рабочий код на c++)
Всем привет. Я разрабатываю пакетного бота на онлайн игру. В игре используется tcp протокол с xor шифрованием и запаковкой методом Zlib deflate. Первый пакет от сервера начинается вот так: "78 9C 0A 9D 1F B5 37 EE 11 73 50 B3 C9 1A 25 00 00 00 00 FF FF 32 6E 8B DA 2B 9A 73 24 E4 FF FF FD 52 66 4C 47 BC 5E 24 7D 7F FD 67 D5 75 00 00 00 00 FF FF".
У меня уже есть рабочий алгоритм на C++, но мне понадобилось портировать код на python чтобы установить бота на веб сайт. Я перепробовал все примеры с первых трех страниц поисковика google, но мне во всех выдавало ошибку -3 с разным содержанием.
Аргументы для deflate с сервера игры выглядят так:
<code>
 cl->Zstrm.zalloc = zlib_alloc;
 cl->Zstrm.zfree = zlib_free;
 cl->Zstrm.opaque = NULL;
 int result = deflateInit( &cl->Zstrm, Z_DEFAULT_COMPRESSION );
 deflate( &cl->Zstrm, Z_SYNC_FLUSH )
</code>
Подскажите как сделать распаковку на Python, zlib.decompress и zlib.decompressobj выдают мне ошибку. В случае с примером результат распаковки должен выглядеть так: "55D19F5AD08567C2B6375372D093D08F
5FD0A0E280A05AD08509D0BE0408D18F
D18FD0BFE2809A3B02D094D0B33862D1
87D197D0ACD084D0A7".

"Первый пакет от сервера..." - А остальные? ;)
Ну, ок, поработаем с тем, что есть...

import zlib
data = "789C0A9D1FB537EE117350B3C91A2500000000FFFF326E8BDA2B9A7324E4FFFFFD52664C47BC5E247D7FFD67D57500000000FFFF"
res = zlib.decompress(bytes.fromhex(data))

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

error: Error -5 while decompressing data: incomplete or truncated stream

Если распаковывать как stream, то ошибок нет (но всё равно, данные таки не все, статус показывает, что конец стрима не достигнут).

import zlib
data = "789C0A9D1FB537EE117350B3C91A2500000000FFFF326E8BDA2B9A7324E4FFFFFD52664C47BC5E247D7FFD67D57500000000FFFF"
z = zlib.decompressobj()
res = z.decompress(bytes.fromhex(data))
print(res.hex())
print(f"EOF={z.eof}  unused={len(z.unused_data)}  unconsumed={len(z.unconsumed_tail)}")

559f5abd5ee203528334ac2233865abd156cc454ffffbf1a3602c44ae862f7ebfcaad7
EOF=False  unused=0  unconsumed=0


Почему kivy ScrollView постоянно возвращает вверх, не давая прокрутить вниз
Делаю простенький блокнот для смартфонов, сделал по сути всё - можно что-нибудь добавить, написать, и удалить, осталось сделать только отображение кнопки перехода на каждый отдельный блокнот в столбик, чтобы можно было прокручивать вниз и вверх в поисках нужной заметки.
Для этого я добавил все кнопки в GridLayout, а его в ScrollView, и выглядит всё нормально, да вот только если я пытаюсь прокрутить вниз, то он банально возвращает к началу, как будто я пытаюсь листать куда-то за края, но это не так, там снизу есть ещё кнопки, к которым у меня нет доступа, так как он просто не даёт до них долистать.
Вот код в kv файле:

ChoiceWindow:
    Crutch1:
    ChoiceMenu1:
    TextWindow1:
    TextWindow2:
    TextWindow3:
    TextWindow4:
    TextWindow5:
    TextWindow6:
    TextWindow7:
    TextWindow8:
    TextWindow9:
    TextWindow10:
    TextWindow11:
    TextWindow12:
    TextWindow13:

<Crutch1>:
    name: "crutch"
    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height
        Button:
            text: "Блокнот с подвохом"
            font_size: 40
            background_color: (0.2, 0.2, 0.4, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'up'
<ChoiceMenu1>:
    name: "choice_menu"
    on_pre_enter:
        root.title_on_menu(notebook_1, 1)
        root.title_on_menu(notebook_2, 2)
        root.title_on_menu(notebook_3, 3)
        root.title_on_menu(notebook_4, 4)
        root.title_on_menu(notebook_5, 5)
        root.title_on_menu(notebook_6, 6)
        root.title_on_menu(notebook_7, 7)
        root.title_on_menu(notebook_8, 8)
        root.title_on_menu(notebook_9, 9)
        root.title_on_menu(notebook_10, 10)
        root.title_on_menu(notebook_11, 11)
        root.title_on_menu(notebook_12, 12)
        root.title_on_menu(notebook_13, 13)
        #oelpfb66koojhhfikckckkck

вот в нём ScrollView

    ScrollView:
        pos_hint: {'top': 0.9}
        GridLayout:
            size_hint_y: None
            cols: 1
            padding: 5
            spacing: 5
            Button: #1
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_1
                on_release:
                    app.root.current = '1 notebook'
                    root.manager.transition.direction = 'left'
            Button: #2
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_2
                on_release:
                    app.root.current = '2 notebook'
                    root.manager.transition.direction = 'left'
            Button: #3
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_3
                on_release:
                    app.root.current = '3 notebook'
                    root.manager.transition.direction = 'left'
            Button: #4
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_4
                on_release:
                    app.root.current = '4 notebook'
                    root.manager.transition.direction = 'left'
            Button: #5
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_5
                on_release:
                    app.root.current = '5 notebook'
                    root.manager.transition.direction = 'left'
            Button: #6
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_6
                on_release:
                    app.root.current = '6 notebook'
                    root.manager.transition.direction = 'left'
            Button: #7
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_7
                on_release:
                    app.root.current = '7 notebook'
                    root.manager.transition.direction = 'left'
            Button: #8
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_8
                on_release:
                    app.root.current = '8 notebook'
                    root.manager.transition.direction = 'left'
            Button: #9
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_9
                on_release:
                    app.root.current = '9 notebook'
                    root.manager.transition.direction = 'left'
            Button: #10
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_10
                on_release:
                    app.root.current = '10 notebook'
                    root.manager.transition.direction = 'left'
            Button: #11
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_11
                on_release:
                    app.root.current = '11 notebook'
                    root.manager.transition.direction = 'left'
            Button: #12
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_12
                on_release:
                    app.root.current = '12 notebook'
                    root.manager.transition.direction = 'left'
            Button: #13
                size_hint: 1, None
                size: 0, 60
                font_size: 20
                background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
                id: notebook_13
                on_release:
                    app.root.current = '13 notebook'
                    root.manager.transition.direction = 'left'

           #lgplveiok3203kov0303vojIJVO

остальное:

    FloatLayout:
        orientation: "vertical"
        size: root.width, root.height
        padding: 5
        spacing: 5
        Button:
            size_hint: 1, 0.1
            pos_hint: {'top': 1}
            text: "+ Добавить новый блокнот"
            font_size: 25
            background_color: (0.7,0.8,0.1,1) if self.state == 'normal' else (0.3,0.5,0.9,1)
            on_release:
                root.create_notebook()
<TextWindow1>:
    name: '1 notebook'
    on_pre_enter:
        root.load_text(text_input, 1)
    BoxLayout:
        pos_hint: {'top': 1}
        size_hint: 1, 0.1
        orientation: 'horizontal'
        size: root.width, root.height
        Button:
            size_hint: 1, 1
            text: 'Сохранить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.save_text(text_input, 1)
        Button:
            size_hint: 1, 1
            text: 'Удалить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.delete_text(1)
    BoxLayout:
        pos_hint: {'top': 0.9}
        size_hint: 1, 0.9
        orientation: 'vertical'
        size: root.width, root.height
        TextInput:
            font_size: 20
            id: text_input
<TextWindow2>:
    name: '2 notebook'
    on_pre_enter:
        root.load_text(text_input, 2)
    BoxLayout:
        pos_hint: {'top': 1}
        size_hint: 1, 0.1
        orientation: 'horizontal'
        size: root.width, root.height
        Button:
            size_hint: 1, 1
            text: 'Сохранить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.save_text(text_input, 2)
        Button:
            size_hint: 1, 1
            text: 'Удалить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.delete_text(2)
    BoxLayout:
        pos_hint: {'top': 0.9}
        size_hint: 1, 0.9
        orientation: 'vertical'
        size: root.width, root.height
        TextInput:
            font_size: 20
            id: text_input

 ***

<TextWindow12>:
    name: '12 notebook'
    on_pre_enter:
        root.load_text(text_input, 12)
    BoxLayout:
        pos_hint: {'top': 1}
        size_hint: 1, 0.1
        orientation: 'horizontal'
        size: root.width, root.height
        Button:
            size_hint: 1, 1
            text: 'Сохранить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.save_text(text_input, 12)
        Button:
            size_hint: 1, 1
            text: 'Удалить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.delete_text(12)
    BoxLayout:
        pos_hint: {'top': 0.9}
        size_hint: 1, 0.9
        orientation: 'vertical'
        size: root.width, root.height
        TextInput:
            font_size: 20
            id: text_input
<TextWindow13>:
    name: '13 notebook'
    on_pre_enter:
        root.load_text(text_input, 13)
    BoxLayout:
        pos_hint: {'top': 1}
        size_hint: 1, 0.1
        orientation: 'horizontal'
        size: root.width, root.height
        Button:
            size_hint: 1, 1
            text: 'Сохранить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.save_text(text_input, 13)
        Button:
            size_hint: 1, 1
            text: 'Удалить'
            font_size: 20
            background_color: (0.5, 0.8, 0.91, 1) if self.state == 'normal' else (0.3, 0.5, 0.9, 1)
            on_release:
                app.root.current = 'choice_menu'
                root.manager.transition.direction = 'right'
            on_press:
                root.delete_text(13)
    BoxLayout:
        pos_hint: {'top': 0.9}
        size_hint: 1, 0.9
        orientation: 'vertical'
        size: root.width, root.height
        TextInput:
            font_size: 20
            id: text_input

#krmbfgrlp45-lh5-hkogkr94jg94gpoekfp309

Вот main.py:

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.lang import Builder
import sys
import os
import re

Window.size = (500, 750)
Window.clearcolor = (12/255, 12/255, 12/255, 1)
Window.title = "Блокнот с подвохом"

***

class ChoiceMenu1(Screen):
    def title_on_menu(self, input, nu):
        standard_title_on_menu(self, input, nu)

class Crutch1(Screen):
    pass

***

class TextWindow1(Screen):
   def load_text(self, input, nu):
       standard_load_text(self, input, nu)
   def save_text(self, input, nu):
       standard_save_text(self, input, nu)
   def delete_text(self, nu):
       standard_delete_text(self, nu)

class TextWindow2(Screen):
   def load_text(self, input, nu):
       standard_load_text(self, input, nu)
   def save_text(self, input, nu):
       standard_save_text(self, input, nu)
   def delete_text(self, nu):
       standard_delete_text(self, nu)

 ***

class TextWindow12(Screen):
   def load_text(self, input, nu):
       standard_load_text(self, input, nu)
   def save_text(self, input, nu):
       standard_save_text(self, input, nu)
   def delete_text(self, nu):
       standard_delete_text(self, nu)

class TextWindow13(Screen):
   def load_text(self, input, nu):
       standard_load_text(self, input, nu)
   def save_text(self, input, nu):
       standard_save_text(self, input, nu)
   def delete_text(self, nu):
       standard_delete_text(self, nu)

# ormhldmbrlgpfbk5bdf4bpvbps

***

class ChoiceWindow(ScreenManager):
    pass

kv = Builder.load_file("new_windows.kv")

class GayApp1(App):
    def build(self):

        return kv

if __name__ == "__main__":
    GayApp1().run()

не могу понять, в чём причина такого повидения при прокрутке, думаю, что забыл указать какой-нибудь параметр, но какой не знаю.

Оказалось, что я забыл выставить высоту в GridLayout, из-за чего он и считал что я листаю за край.
так-что я дописал в GridLayout:
<code>
height:self.minimum_height
</code>
и он начал нормально себя вести.


Что такое import sys и sys.exit?
Друг помог с исправлением кода, но так и не понял что это за функции.
Что такое
import sys и
sys.exit?

import sys
print("Привет! Это программа создана для перевода из десятичной сисетмы в любые другие системы счисления")
print("")
while True:

    a = int(input("Введите число которое хотите конвертировать: "))

    n = int(input("Введите систему в которую хотите перевести число: "))

    s = ""

    while a > 0:

            s = str(a % n) + s

            a //= n
    print(s)
    cnt = int(input(('Введите 1, что бы продолжить или 0 для завершения работы: ')))
    if cnt == 0:
          break
sys.exit()

Библиотека - sys предназначена для операций над системой и порядком исполнения программы. Строка sys.exit предназначена для выхода из приложения и завершения его работы, то-есть не придётся в ручную закрывать приложение через кнопки сверху, за это вас сделает код. Это очень нужно для всяких игр в полноэкранном режиме.
Библиотека sys так же предоставляет возможность задавать параметры программы во время запуска её через командную строку.
Пример -
Программа по выводу чисел -
Ввод:cmd.exe - python main.py
Вывод: Введите число!(вы ввели число 5)
Вывод: Вы ввели число 5!
Программа по выводу чисел, пример 2 -
Ввод: cmd.exe - python main.py 6
Вывод: Вы ввели число 6!
Это очень примерно и допущено много условностей, но я думаю вы поняли.
Помните! Программирование это легко, это лишь набор инструкций. Как план военного наступления, тоже набор инструкций. Тоже слова переведённые в инструкции которые должны быть понимаемы как для составителя инструкций(программиста) как и для исполнителя(компилятора). Удачи с изучением! Надеюсь из вас получится отличный специалист!


Python почему внутри неизменяемых типов можно менять значения изменяемых типов?
<code>
d = {'a': 1, 'b': 2, 'c': 3}
t = (1, 2, d)

t[2]['b'] = 555

t  #вызов кортежа, в итоге изменения будут видны
</code>
Я немного запутался, кортеж это неизменяемый тип, а словарь изменяемый. Но каким образом в неизменяемом типе отображаются изменения, и почему вообще кортеж поддерживает изменяемые типы если его фишка это неизменяемость.

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

t[2]['b'] = 555

Неизменяемым будет только содержание самого кортежа, который состоит из ссылок на объекты
эксперимент:
есть кортеж
t:

d = {'a': 1, 'b': 2, 'c': 3}
t = (1, 2, d)

спросим какой у него идентификатор и идентификатор одного из членов:

print(id(t))
#out 1721653392256
print(id(t[2]))
#out 1721654101568

а также идентификатор для одного из членов словаря по ключу
b

print(id(t[2]['b']))
#out 1721654045232

изменим это значение и посмотрим на изменения идентификаторов:

t[2]['b'] = 555
print(id(t[2]['b']))
#out 1721654045264

то есть теперь есть новый объект с новым идентификатором. Или другими словами существует новый объект в памяти на который ведет ссылка, которая хранится в словаре под ключом
b. Предыдущая ссылка на объект под ключом
b, то есть  целочиселенная двойка, заменена ссылкой на целочисленое 555. А сам объект в памяти с целочисленной двойкой уничтожен, поскольку нет ни одной действующей ссылки на него.
Вопрос: изменились ли объекты кортежа и члена [2] кортежа?

print(id(t))
#out 1721653392256
print(id(t[2]))
#out 1721654101568

Конечно, же, нет!!
И еще одно важное замечание:
У кортежа нет способа предотвратить изменение значений его элементов, которые являются независимыми объектами и могут быть доступны через ссылки вне кортежа. Словари и другие изменяемые объекты внутри кортежей могут изменяться, но их идентификаторы всегда будут одинаковыми.


Как убрать перезаписывание файла Excel
Я обучаюсь библиотеке pandas. Возникает вопрос с работой в Excel:
Как сделать так, чтобы файл не перезаписывался, а продолжался - Если прописать следующие строки:

#Сохранение в Ексель
writer = pd.ExcelWriter("questions.xlsx")
df.to_excel(writer)
writer.save()

то всё сохранится. Но если запустить скипт во второй раз, результат, занесённый ранее перезапишется. Я много смотрел в интернете решение, но найти ничего не могу, точнее, не понимаю. Вопрос закрывали и давали ссылку на этот вопрос, но даже в том вопросе, я ничего не понял.
Вот мой код:

import numpy as np
import pandas as pd

question = int(input("Введите цифру. Она будет использоваться первым числом: "))
ones = np.ones(1)
result = ones + question

df = pd.DataFrame ({ #Содаём таблицу
     "question": question,
     "answer": result
})

#Сохранение в Ексель
writer = pd.ExcelWriter("questions.xlsx")
df.to_excel(writer, index= False)
writer.save()

#Вывод таблицы
print(df)

questionTotal = pd.read_excel('questions.xlsx')
questionTotal.head()
print(questionTotal)

На данный момент (версия 1.3.5) Pandas "из коробки" не позволяет дозаписывать (без перезаписи) DataFrame в существующий лист Excel файла.
Вы можете воспользоваться функцией append_df_to_excel(), которая как раз создана для того, чтобы дозаписывать DataFrame в существующий лист Excel файла, сохраняя прежнюю информацию (без перезаписи).
PS в Pandas 1.4.0 параметр
if_sheet_exists в классе ExcelWriter() планируют расширить таким образом, чтобы он принимал значение
'overlay', которое будет позволять дозаписывать DataFrame в существующий лист Excel файла, не перезаписывая его содержимого. Таким образом в будущих версиях Pandas эта функциональность будет поддерживаться "из коробки".


Python Как добавить запятую в строке
У меня есть число в строке, к которому нужно добавить запятую через 3 знака (с конца).

Например
Исходная строка:

122236055
Нужно:

122236,055

Исходная строка:

123456789

Нужно:

123456,789

Как это сделать?


Получить глобальную переменную после проверки в Python
Проверяю description на отсутствие пустых строк, что бы не было ответа, как [ ]:

[ ]
[ ]
[ ]
-=VPNs=-
Internet

Как проверку description при условии совпадения приравнять к глобальной переменной? То есть после проверки я хочу работать с этими непустыми переменными...
Если
print(description) сделать слева без отступа, то появляется ответ от
description = re.findall(r"description\s+(\S[\s\S]*\S)", line).
Мне необходимо в глобальном print(description) получить -=VPNs=- и Internet. И только их, а не с пустыми данными [ ]
То есть необходимо в будущем работать с проверенной переменной. Смог описать проблему?)

import re
from collections import defaultdict

text = """
set security policies from-zone untrust to-zone nprch policy term01 match source-address any
set security policies from-zone untrust to-zone nprch policy term01 then permit
set security policies from-zone untrust to-zone nprch policy term10 match
set security policies from-zone untrust to-zone nprch policy term11 description -=VPNs=-
set security policies from-zone untrust to-zone nprch policy term100 description Internet
"""

policies = defaultdict(lambda: defaultdict(list))
for line in text.strip().splitlines():
    description = re.findall(r"description\s+(\S[\s\S]*\S)", line)
    if description:
      print(*description)

Можете накапливать элементы в дополнительном списке, используя метод
extend, добавляющий в список все элементы другого списка:

all_descriptions = []
for line in text.strip().splitlines():
    description = re.findall(r"description\s+(\S[\s\S]*\S)", line)
    all_descriptions.extend(description)
print(all_descriptions)


Помогите с реализацией асинхроннасти
допустим есть дискорд бот
и в нем есть функция:
<code>
@bot.command()
async def test(ctx):
    while True:
        await ctx.send(f"TEST")
        sleep(30)
</code>
если запустить данный код в 1 канале 1 раз, то все будет хорошо, но если сразу в двух каналах запустить данный код, то ничего работать не будет, бот попросту игнорирует то что во 2 канале я написал точно такую же команду
НУЖНО:
чтоб при написании команды, создавался отдельный поток, в котором будет выполняться данная команда

Вероятно, проблема вовсе не в этом, тем более, что бот все равно не будет работать ни в каком потоке, кроме главного.
Здесь проблема в том, что у вас выставлена большая задержка - 30 секунд. И эта задержка в асинхронной функции реализована через не асинхронную функцию
time.sleep(). Из-за этого, при большом количестве вызовов весь код стопится до тех пор, пока не пройдет последняя задержка из вызванных.

Решением здесь будет переход на асинхронную задержку из модуля
asyncio:

from asyncio import sleep

@bot.command()
async def test(ctx):
    while True:
        await ctx.send(f"TEST")
        await sleep(30)

Некоторые действия, требующие выделения в другую функцию, можно выделить при помощи функции
asyncio.run_coroutine_threadsafe(), которая первым аргументом принимает асинхронную функцию, а вторым текущий поток бота:

async def send_test(context):
    while True:
        await context.send(f"TEST")
        await asyncio.sleep(30)

@bot.command()
async def test(ctx):
    asyncio.run_coroutine_threadsafe(send_test(ctx), bot.loop)


Python 3 - Как просканировать папку /tmp, найти в ней файлы, которые начинаются с "x" и удалить их? [закрыт]

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

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

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

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

Я делаю программу для очистки кеша / мусора.
Она будет удалять всё, что начинается с:
<code>
1) Папки ".com.google.Chrome."
2) Файлы "config-err"
3) Папка "mintUpdate"
4) Файлы-изображения "xapp-tmp-"
5) Папки "ssh-"
</code>
Давайте код только для Linux, у меня нет Windows.

Во-первых ВСЕ нужные функции доступны для поиска в интернете.
Вот код:

import os

tmp_path='/tmp'

os.chdir(tmp_path) # Переходим в tmp
all_dirs_and_files = os.listdir() # Получаем список файлов
patterns = ['.com.goole.Chrome.', 'config-err', 'mintUpdate', 'xapp-tmp-', 'ssh-'] # Здесь список проверяемых паттернов
for f_or_d in all_dirs_and_files: # Перебираем все папки и файлы
    flag = False
    for patt in patterns:
        if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном
            flag = True
    if flag: # Если подошло под паттерн
        if os.path.isfile(f_or_d): # Проверяем файл ли это
            os.remove(f_or_d) # Удаляем файл
        else:
            os.rmdir(f_or_dir) # Иначе удаляем папку

Прочти некоторые списки полезных функций:
Про методы строк
Про модуль os
Про проверку является ли это файлом или директорией
UPDATE
Сразу не заметил что некоторые паттерны под папки, некоторые только под файлы.
Вот улучшенный код

import os

tmp_path='/tmp'

os.chdir(tmp_path) # Переходим в tmp
all_dirs_and_files = os.listdir() # Получаем список файлов
patts_d = ['.com.goole.Chrome.', 'mintUpdate', 'ssh-'] # Здесь список проверяемых паттернов для директорий
patts_f = ['config-err', 'xapp-tmp-']
for f_or_d in all_dirs_and_files: # Перебираем все папки и файлы
    if os.path.isfile(f_or_d): # Проверяем файл ли это
        flag = False
        for patt in patts_f:
            if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном
                 flag = True
        if flag: os.remove(f_or_d)
    else:
        flag = False
        for patt in patts_d:
            if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном
                 flag = True
        if flag: os.rmdir(f_or_d)


Python 3 - Как напечатать строку в той же строке перед input?
Как напечатать строку в той же строке перед input?
Я пробовал так:

input_start = '> '
input_end = ' <'
input(input_start + '' + input_end)

Но это не помогло. Я написал "Привет мир", и вместо этого:

> Привет мир <

появилось вот это:

>  <Привет мир

Кто-нибудь знает,
как это реализовать?

Вызовите
input() внутри
print():

print('> ' + input() + ' <')

Результат:

> Привет мир <

Однако, полностью запретить
input() переносить строку после ввода не получится.
Почитать почему, можно здесь.
Но, если это сильно необходимо, самое простое, что можно сделать - очищать консоль:

import os

def raw_input(start, end):
    inp = input(start)
    os.system('clear || cls || :') #проверка на OS
    print('> ' + inp + ' <')

raw_input('> ', ' <')

Но это действие будет стирать все предыдущие строки.

Или можно использовать модуль
getpass, который будет скрывать ввод, но все равно оставит пустую строку:

import getpass

def raw_input(start, end):
    inp = getpass.getpass('')
    print('> ' + inp + ' <')

raw_input('> ', ' <')

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


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

string_ = "Hello"
result = list() # здесь будет результат

for i in string_:
    letter = do_sth_with_letter(i) # видоизменяем букву
    result.append(letter)

result = "".join(result)

или
2 способ:

string_ = "Hello"
result = str() # здесь будет результат

for i in string_:
   letter = do_sth_with_letter(i) # видоизменяем букву
   result += letter

Второй ваш способ будет тормозить на длинных строках. Первый способ быстрее, там только лишнее копирование данных.
Вот способ быстрый и без лишних копий:
<code>
string_ = "Hello"
result = ''.join(map(do_sth_with_letter, string_))
</code>


bot.wait_for("select_option") ничего не возвращает
<code>

@bot.command()
async def help(ctx):
    b = Select(placeholder = "Выберите раздел",
                options = [
                    SelectOption(label = "Настройка бота", value = "Настройка бота"),
                    SelectOption(label = "Команды", value = "Команды"),
                    SelectOption(label = "Форматирование текста", value = "Форматирование текста")
                ]
            )
    embed = discord.Embed(title="Выберите раздел:", color=int(hex(int("9de300", 16)), 0))
    embed1 = discord.Embed(title="Настройка бота:", color=int(hex(int("9de300", 16)), 0))
    embed2 = discord.Embed(title="Команды:", color=int(hex(int("9de300", 16)), 0))
    embed3 = discord.Embed(title="Форматирование текста:", color=int(hex(int("9de300", 16)), 0))
    choose = {"Настройка бота": embed1, "Команды": embed2, "Форматирование текста": embed3}
    message = await ctx.send(embed=embed, components=[b])
    interaction = await bot.wait_for("select_option")
    await message.edit(embed=choose[interaction])
</code>
Никаких ошибок я не получаю, выбор просто игнорируется

@bot.command()
async def help(ctx):
    b = Select(placeholder = "Выберите раздел",
                options = [
                    SelectOption(label = "Настройка бота", value = "Настройка бота"),
                    SelectOption(label = "Команды", value = "Команды"),
                    SelectOption(label = "Форматирование текста", value = "Форматирование текста")
                ]
            )
    embed = discord.Embed(title="Выберите раздел:", color=int(hex(int("9de300", 16)), 0))
    embed1 = discord.Embed(title="Настройка бота:", color=int(hex(int("9de300", 16)), 0))
    embed2 = discord.Embed(title="Команды:", color=int(hex(int("9de300", 16)), 0))
    embed3 = discord.Embed(title="Форматирование текста:", color=int(hex(int("9de300", 16)), 0))
    choose = {"Настройка бота": embed1, "Команды": embed2, "Форматирование текста": embed3}
    message = await ctx.send(embed=embed, components=[b])
    interaction = await bot.wait_for("select_option")
    await message.edit(embed=choose[interaction.label])


На какую максимальную степень K делится число N! через разложение на простые множители
В интернете увидел способ решения  задачи, но никак не могу понять, как работает разложение на множители. Число k раскладываем на множители вида "число - степень", а после делим простые числа на числа от 2 до N. Но я не понимаю, как работает это "деление". Привожу пример своей программы, не могу увидеть, в чем ошибка. Число K уже разложено на множители моим другим алгоритмом, не вижу смысла занимать этим место :

d = {}
prostye_chisla.sort()  ##Список с простыми множителями K
for i in l:
    d[i]=l.count(i)  ##Словарь типа "Простое число - степень"
dic = [a * 0 for a in range(len(d))]

for i in range(2, n+1):
    a = 0
    for j in d:
        if i%j == 0:
            dic[a] += i // j  ##Деление простых множителей на числа от 2 до N
        a+=1

d = list(d.values())
d.reverse()
ans = []
for i in range(len(d)):
    ans.append(dic[i]//d[i])
print(min(ans))  ##Минимум из отношений суммы степеней при простых числах к значению их степеней в основании.

Пример, найденный мной : N = 12, K = 12.
Раскладываем K на множители : 2^2 * 3^1. Проверяем, сколько раз числа от 2 до N делятся на эти простые числа : 2 делится 1 раз на два
(1,0), 3 делится один раз на 3
(1,1), 4 делится 2 раза на два
(3,1) 5 не делится и т.д...
Должно получится после всех вычислений
(10,4). Затем выбрать минимум из отношений суммы степеней при простых числах к значению их степеней в основании :
min (10/2, 4/1)

В куске вашего кода ниже
i - множитель из
n!,
j - простое число,
dic[a] накапливает степень простого
j. Ожидается что
i! делится на
j^dic[a] и не делится на
j^(dic[a] + 1).

    if i%j == 0:
        dic[a] += i // j  ##Деление простых множителей на числа от 2 до N

Пусть для примера
i = 256,
j = 2. Так как
i делится на
j^8, то значение
dic[a] должно возрасти на
8. Ваш код добавит
128, что намного больше.
Поправить можно так:

    k = i
    while k % j == 0:
        dic[a] += 1   # увеличиваем степень простого `j` на единицу
        k //= j       # убираем один множитель `j` из `k`

P.S. Почитайте про разложение факториала на простые множители чтобы понять как надо было решать задачу.

def prime_factors(n):
    i = 2
    j = n
    while i * i <= j:
        if j % i == 0:
            p = 0
            while j % i == 0:
                j //= i
                p += 1
            yield i, p
        i += 1 if i == 2 else 2
    if j > 1:
        yield j, 1

def factorial_exponent(n, p):
    # assert is_prime(p)
    s = 0
    t = n // p
    while t > 0:
        s += t
        t //= p
    return s

def exponents(k, n):
    for p, e in prime_factors(k):
        yield factorial_exponent(n, p) // e

def main():
    k, n = map(int, input().split())
    assert k > 1
    print(min(exponents(k, n)))

main()


Cохранение каждого файла docx в отдельный файл xlsx (в одной папке), используя цикл for
уважаемые программисты!
Прошу помощи в решении вопроса.
Имеется работающий код для считывания таблиц в одном файле docx (MS Word 2019) и сохранения данных в файле xlsx (MS Excel 2019).

from docx import Document
import pandas as pd

document = Document("D:\путь...\ivanova.docx")
tables = document.tables
df = pd.DataFrame()

for table in document.tables:
    for row in table.rows:
        text = [cell.text for cell in row.cells]
        df = df.append([text], ignore_index=True)
df.to_excel("D:\тот же путь...\ivanova.xlsx")

Попробовал его расширить для обработки каждого файла docx в папке и сохранения их в индивидуальные файлы xlsx поочередно.
В результате, пока, имеется такой код - не работает.

from docx import Document
import pandas as pd
import glob
allfiles = glob.glob("*.docx")
document = Document(allfiles)
tables = document.tables
df = pd.DataFrame()
for document in Document(allfiles):
    for table in document.tables:
        for row in table.rows:
            text = [cell.text for cell in row.cells]
            df = df.append([text], ignore_index=True)
df.to_excel("*.xlsx")

Подскажите, пожалуйста, в чем ошибка?
Возможно, для этого требуется другой путь решения?

Я не запускал твой код, исходил из твоего заявления, что он работает.
Твой код в виде функции convert_docx_to_xlsx. Функция read_folder считывает имена всех файлов в формате docx в папке, где запускается скрипт. Если нужна другая папка, укажи её в path_in. Затем в цикле по всем найденным файлам отрабатывает твоя функция.
Попробуй так:
<code>
import os
import pandas as pd
from docx import Document

def read_folder(path_in):
    list_images = []
    for i in os.listdir(path_in):
        if i[i.rfind(".") + 1:].lower() in ['docx']:
            list_images.append(os.path.join(path_in, i))
    return list_images

def convert_docx_to_xlsx(path):
    document = Document(path)
    tables = document.tables # вот это не работает, попробуй удалить
    df = pd.DataFrame()
    for table in document.tables:
        for row in table.rows:
            text = [cell.text for cell in row.cells]
            df = df.append([text], ignore_index=True)
    new_path = path.rsplit('.', 1)[0] + '.xlsx'
    df.to_excel(new_path)

path_in = os.getcwd() #или указать путь к нужной папке с файлами
for i in read_folder(path_in):
    convert_docx_to_xlsx(i)
</code>


Как записать в переменную сообщение? Варианты telebot и aiogram
Как записать в переменную сообщение которое написал пользователь а затем проверить их? Покажите варианты telebot и aiogram.

Все просто.
Чтобы записать в переменную сообщение которое отправил пользователь и проверить, нужно:
В telebot:

mes = message.text

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

@bot.message_handler(content_types=["text"])
def text_message(message):

    mes = message.text

    if mes == 'Привет':
        bot.send_message(message.chat.id, 'Тебе тоже привет!')

В aiogram:

mes = msg.text

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

@dp.message_handler()
async def echo_message(msg: types.Message):
        mes = msg.text

        if mes == 'Привет':
            await bot.send_message(msg.from_user.id, "Привет тебе тоже!")

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


Discord py | Переотправка фото + текст, в другой канал
Мне нужно что бы бот переотправлял фото и текст в эмбеде в отдельный канал, текст пере отправить легко, нужно просто прописать доп. аргумент и передать его с фото все гораздо сложнее я много чего перепробовал где только не лазил что только не пробовал, сейчас получается только так
<code>
@bot.command(pass_context=True)
async def trans(ctx, *, arg):
    channel = bot.get_channel(ну тут айди)
    embed = discord.Embed(description=f"{arg}", color=0xfcb51d)
    await channel.send(embed=embed)

</code>

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

@commands.command()
async def transfer_(self, ctx: commands.Context, message_url: str):
    new_channel = 862001372114190387
    splited_url = message_url.split("/")
    guild_id = int(splited_url[4])
    channel_id = int(splited_url[5])
    message_id = int(splited_url[6])
    guild = self.bot.get_guild(guild_id)
    msg = await discord.utils.get(guild.text_channels, id=channel_id).fetch_message(message_id)
    attachments = msg.attachments
    if attachments:
        new_channel = discord.utils.get(guild.text_channels, id=new_channel)
        for attachment in attachments:
            await new_channel.send(attachment.url)
    else:
        await ctx.send(f"{ctx.author.mention} ничего не найдено!")


Проверка пользовательского ввода на наличие цифр
Что нужно ввести, чтобы в случае того если пользователь введёт (в оператор input) первым символом цифру, ему выдавало ошибку?
пробовал и так:

text = input("Введите что-нибудь : ")
if text[0] == range(0, 9):
    raise ValueError

и так:

text = input("Введите что-нибудь : ")
if text[0].startswith(range(0, 9)):
    raise ValueError

(да может это и глупо, но так я тоже пробовал :D)

Проще некуда...

if text[0].isdigit():
    raise ValueError

Можно ещё так:

if text[0] in '1234567890':
    raise ValueError

Если очень хочется
range():

if text[0] in map(str, range(10))
    raise ValueError


Есть два списка, из них надо собрать один словарь
Есть два списка, из них надо собрать словарь.
В данном словаре ключом должен быть интерфейс (Например, 'Po1'), а значением должен быть другой словарь с ключами mac-address и description, которые берутся из списков. Значение ключа mac-address должен быть список, потому что их может быть много на одном порту.

Список интерфейсов и дескрипшенов:

 [['Po1', 'Server-001'],
 ['Po2', 'Server-002'],
 ['Po3', 'Server-003'],
 ['Po4', 'Server-004']]

Список маков и интерфейсов:

[['b8ce.f67c.b616', 'Po18'],
 ['b8ce.f67c.b6c6', 'Po21'],
 ['b8ce.f67c.b6d2', 'Po19'],
 ['b8ce.f67c.b812', 'Po22'],
 ['b8ce.f684.27ee', 'Po17']]

Нужно видеть что-то вроде:
{'Po1': {'mac-address': [mac1, mac2, ..., mac20]',
'description': XXXX,
}}
Использую для этого конструкция вида:

result_dict = defaultdict(dict)
for i,j in zip_longest(dict(res_list).items(), dict(res_desc_list).items()):
     result_dict[i[1]]['mac-address'] = [].append(i[0])
     result_dict[i[1]]['descriotion'] = j[1]

Но спотыкаюсь на этапе пополнения списка мак-адресов для каждого из интерфейсов. Как правильно это сделать?

Если уж используете
defaultdict, то можно так:

from collections import defaultdict

servers = [['Po1', 'Server-001'],
           ['Po2', 'Server-002'],
           ['Po3', 'Server-003'],
           ['Po4', 'Server-004']]

macs = [['b8ce.f67c.b616', 'Po18'],
        ['b8ce.f67c.b812', 'Po04'],
        ['b8ce.f67c.b6c6', 'Po21'],
        ['b8ce.f67c.b6d2', 'Po19'],
        ['ffff.dead.beef', 'Po19'],
        ['b8ce.f67c.b812', 'Po22'],
        ['b8ce.f684.27ee', 'Po17']]

result = defaultdict(lambda: {'mac-address': [], 'description': ''})
for intf, srv in servers:
    result[intf]['description'] = srv
for mac, intf in macs:
    result[intf]['mac-address'].append(mac)


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

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

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

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

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

<code>
violator_songs = [
    ['World in My Eyes', 4.86],
    ['Sweetest Perfection', 4.43],
    ['Personal Jesus', 4.56],
    ['Halo', 4.9],
    ['Waiting for the Night', 6.07],
    ['Enjoy the Silence', 4.20],
    ['Policy of Truth', 4.76],
    ['Blue Dress', 4.29],
    ['Clean', 5.83]
]

l = []
summ = 0
n = int(input('Сколько песен выбрать? '))
for i in range(1, n + 1):
  print('Название', i, 'песни:', end=' ')
  song_name = input()
  l.append(song_name)

for k in violator_songs:
  if k[0] in l:
    summ += k[1]

print('\nОбщее время звучания песен', round(summ, 2))
</code>

Проще будет, если вы сконвертируете список песен в словарь.

violator_songs_dict = dict(violator_songs)

(ну, или изначально его забьёте как словарь, где ключ - название, а значение - длительность)
А далее цикл по списку введённых песен. А условие по наличию в  словаре.

for k in l:
  if k in violator_songs_dict:
    summ += violator_songs_dict[k]


Как запустить отдельный кусок кода в питоне бесконечность раз?
Я писал на python простую "угадайку". randint генерирует случайное число и записывает его в переменную.  Дальше просят пользователя записать число. Если число совпадает, то пользователь победил. Как можно сделать так, чтобы если пользователь проиграл, то ему давали попробовать ещё раз без генерации нового числа?
<code>
from random import randint

# Сообщаем пользователю диапазон
print("Угадай число от 1 до 50")

# Генерируем случайное число
a = randint(1, 50)

# Пользователь угадывает
b = input("Угадай число: ")

# Сверяемся
if a==int(b):
    print("Красава!")

else:
    print("Неа! Попробуй снова")
</code>

Это очень просто:
<code>
# .... начало опущено

while True:   # бесконечный цикл
    # Пользователь угадывает
    b = input("Угадай число: ")
    # Сверяемся
    if a==int(b):
        print("Красава!")
        break   # прерываем бесконечный цикл
    else:
        print("Неа! Попробуй снова")
</code>


Как получить имя в модели Django?
Мне нужно, чтобы при заполнении данных, заполнялось поле с именем. К примеру:
<code>
# models.py

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE) # логин, но хотелось бы имя
    title = models.CharField('Заголовок', max_length=50)
    content = models.TextField('Содержимое')
    cover = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Post'
        verbose_name_plural = 'Posts'
</code>
Как в строке user указывать не логин, а имя или фамилию зарегистрированного пользователя? Всем спасибо

Просто в шаблоне обращайтесь к
{{ user.first_name }} или
{{ user.last_name }}, чтобы отобразить имя или фамилию пользователя.
Таким образом можете получать и другие поля
user, например и
{{ user.email }}.
Если хотите изменить/разширить/дополнить стандартного User джанго, то почитайте Расширение модели User


Как сообщение пользователя положить в переменную бот aiogram
У меня есть бот на aiogram
Я хочу принимать сообщения отправленные пользователем в переменную, а затем ее проверить.
Как это сделать?
Например в telebot я делаю так:

mes = message.text.lower()

Вот пример простого эхо-бота на aiogram:
<code>
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

from config import TOKEN
# В файле config.py создайте переменную TOKEN
# и присвойте ей свой токен от бота.

bot = Bot(token=TOKEN) #Инициализация бота
dp = Dispatcher(bot)

# Этот декоратор будет реагировать на
# сообщения что вы присылали боту.
@dp.message_handler()
async def echo_message(msg: types.Message):
    # В переменной msg.text
    # содержится текст сообщения
    await bot.send_message(msg.from_user.id, msg.text)

if __name__ == '__main__':
    executor.start_polling(dp) # Запуск основного цикла
</code>


not(0) +1 почему равно False?
Никак не могу понять почему (not(0) +1) даёт False в результате на Python. Ведь not(0) это True.

Потому, что вы неправильно читаете выражение.

not(0) + 1
not (0) + 1
not ((0) + 1)
not (0 + 1)
not 0 + 1
not 1

Эти все выражения эквивалентны. Ибо
not - это не функция, а оператор. И операция "логический не" имеет более низкий приоритет чем сложение.
А вот выражение
(not 0) + 1 даст в результате искомое
2.


В Python при попытке загрузить библиотеку - ошибка "Could not find a version that satisfies the requirement RPi"
Мне нужна библиотека Encoder. И она даже есть среди установленных модулей. Однако когда импортирую
from Encoder.params_data import * получаю ошибку:

ModuleNotFoundError: No module named 'RPi'

Следом пытаюсь установить
RPi, но получаю следующее уведомление:

WARNING: Ignoring invalid distribution -rpcio (c:\users\zlatt\anaconda3\lib\site-packages)
ERROR: Could not find a version that satisfies the requirement RPi (from versions: none)
ERROR: No matching distribution found for RPi

Подумал, что
RPi требует версии Python 3.8 (у меня сейчас 3.7.6, а pip версии 21.3.1), но установить не получилось - многочасовое тестирование конфликтующих зависимостей пришлось остановить. Хотя, возможно, версия Python здесь не при чем.
Следующая команда также не помогла - дает все тот же WARNING про -rpcio и ERROR про requirement RPi:

pip install python3-rpi.gpio

То же предупреждение про игнорирование недопустимого -rpcio, если применить команду:

pip install RPi.GPIO

При установке grpcio, вижу, что он имеется, хотя предупреждение про игнорирования -rpcio снова появляется.
Пока все попытки тщетны. Возможно, коллеги помогут с решением задачи?

Бибилиотеки предназначены для
RaspberryPi и не предназначены для работы с локальной машины. НО можно обойти ваши ваши предупреждения и ошибки. Моя последовательность выглядела вот так. Установил на Win 10, Python 3.9.6.

Первое и важное: создал виртуальное пространство и активировал его

py -m venv env
env\Scripts\activate

Установка нужной нам Encoder

pip install Encoder

Проверим на что ругается

import Encoder
"""
    import RPi.GPIO as GPIO
ModuleNotFoundError: No module named 'RPi'
"""

Рядом с папкой
env создал папку
RPi и положил в него два файла
__init__.py и
GPIO.py.
GPIO.py- пустой, а для
__init__.py нашел содержание у любителей здесь

#__init__.py
BOARD = 1
OUT = 1
IN = 1

def setmode(a):
   print (a)
def setup(a, b):
   print (a)
def output(a, b):
   print (a)
def cleanup():
   print ('a')
def setwarnings(flag):
   print (False)

Запускаем, проверяем

>>> import Encoder
>>> dir(Encoder)
['Encoder', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'encoder']

Я не очень понимаю сценарий использования данной библиотеки, но сразу скажу что
Encoder не содержит метода или поля
params_data


Проверка на наличие в словаре нескольких элементов
У меня есть словарь
mydict, и я хочу выполнять условие только, если в нём присутствуют сразу два элемента. Что-то типа такого не хочу:

if 'el1' in mydict:
  flag += 1
if 'el2' in mydict:
  flag += 1
if flag == 2:
   # My function

Но и вот это не работает:

if 'el1', 'el2' in mydict:
    #myfunction

Работает только:

if 'el1' in mydict and 'el2' in mydict:
    #my function

Существует ли более элегантное решение?

Как вариант. Хотя выглядит тяжеловесно, но зато логично и понятно:
<code>
if all(map(mydict.__contains__, ('el1', 'el2')))):
</code>


Не могу понять почему выводит true данный код
Был бы весьма благодарен за разъяснение, почему вывидит true и покакому принципу.
Условие такое:
Рассмотрим задачу о пересечении двух длительных по времени событий. Оба события характеризуются двумя числами - годами начала и конца. Необходимо определить, пересекались ли события во времени, при этом если одно событие началось в тот год, когда закончилось другое - они считаются пересекающимися.
Вот решение

start1 = int(input())
finish1 = int(input())
start2 = int(input())
finish2 = int(input())
answer = start1 <= finish2 and start2 <= finish1
print(answer)

Почему если ввести значения

start1 = 1(x1)
finish1 = 3(y1)
start2 = 2(x2)
finish2 = 4(y2)

то выводит true, а если поменять значение start2 на 5, то folse(но это понятно почему, т.к условие не выполняется), но хотя эти два отрезка идентичные, но в одном folse, а в другом true
Ведь отрезок 1,3 и 2,4 вообще не пересекаются если их отобразить на координате x и y

Давайте просто подставим значения:

answer = 1 <= 4 and 2 <= 3

Это равно:

answer = True and True
answer = True

Код у вас верный. Программа работает правильно.


Heroku не может установить библиотеку requests
Сделал бота на питоне, который делает запрос на сторонний сайт с помощью библиотеки requests, локально все работает, а при деплое на heroku, когда делаю
git push heroku master , возникает следующая ошибка:

....
remote:        ERROR: Could not find a version that satisfies the requirement time (from versions: none)
remote:        ERROR: No matching distribution found for time
....

Почему может возникать эта ошибка, и как ее исправить?
(Если что, в файле requirements.txt я указал эту библиотеку)

Вероятно не корректно устанавливаете зависимости, проверьте, что устанавливаете зависимости вот так
<code>
pip3 install -r requirements.txt
</code>


Как в помощью Asyncio создать функцию постоянно выполняющуюся на фоне
Необходимо сделать цикл (как вариант библиотека Asyncio) который будет работать в фоне параллельно с работой основного кода. Этакая многопоточность.
Пример:

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

Нужен именно компактный блок кода, который будет работать по такой логике:
<code>
Выполняется код в основной функции (скажем итерация "1" в цикле)
Выполняется код в основной функции (итерация "2" в цикле)
...
Выполняется код в основной функции (итерация "Х" в цикле)

Когда прошло 10 минут код в фоновой функции выводит текущее время (основная функция при этом не останавливается)

Выполняется код в основной функции (итерация "Х+1" в цикле)
Выполняется код в основной функции (итерация "Х+2" в цикле)

Что-то далее...
</code>
Подскажите пожалуйста каким образом можно реализовать? Буду благодарен за кусочек кода.

Вариант с asyncio:
<code>
import asyncio
from contextlib import suppress

async def echo_forever():
    while True:
        await asyncio.sleep(3)
        print("3 seconds passed")

async def main():
    asyncio.create_task(echo_forever())

    for i in range(10):
        print(f'{i}^2 == {i^2}')
        await asyncio.sleep(1)

def stop_all_tasks(loop):
    for task in asyncio.all_tasks(loop):
        task.cancel()
        with suppress(asyncio.CancelledError):
            loop.run_until_complete(task)

if __name__ == '__main__':
    loop = asyncio.new_event_loop()
    loop.run_until_complete(main())
    stop_all_tasks(loop)
</code>


Рекурсия. Таймер обратного отсчета. Как работает этот код в цикле "после", почему i начинает снова увеличиваться?
Не могу понять, почему этот код (строка 8), там где "После" снова начинает выдавать 2, 3, 4, 5? За счет чего i снова начинает расти?
Код:

def countdown(i):
    print(i)

    if i <= 1:
        return
    else:
        print("До i =", i)
        countdown(i - 1)
        print("После i =", i)
countdown(5)

Вывод:

4
До i = 4
3
До i = 3
2
До i = 2
1
После i = 2
После i = 3
После i = 4
После i = 5

Потому что вы возвращаетесь из рекурсии. И каждая функция хранит своё значение 'i' (вы же его не меняете, а только передаёте уменьшенное значение следующей функции).
Аналогия - это как бы у вас есть 5 одинаковых функций
a(),
b(),
c(),
d(),
e() и вы зовёте их друг из друга:

def a(i):
    print("До i =", i)
    b(i - 1)
    print("После i =", i)

def b(i):
    print("До i =", i)
    c(i - 1)
    print("После i =", i)

def c(i):
    print("До i =", i)
    d(i - 1)
    print("После i =", i)

def d(i):
    print("До i =", i)
    e(i - 1)
    print("После i =", i)

def e(i):
    print(i)

a(5)

Выведет:

До i = 5
До i = 4
До i = 3
До i = 2
1
После i = 2
После i = 3
После i = 4
После i = 5


Сортировка строк в файле
Приветствую участников форума. Дана следующая задача: переписать строки файла out1.txt в файл out2.txt, отсортировав их по увеличению длин. Обработку файлов производить построчно, содержимое файла читать в память целиком запрещается. Списки, множества, словари, кортежи для сортировки не использовать.
Я хотела бы, во-первых, узнать, есть ли какие-либо источники информации, где рассказывается, как правильно обрабатывать содержимое текстового файла (как производить сортировку строк без использования массивов, как перезаписать строки в файле в обратном порядке без использования дополнительного файла и т.д.) и попросить оценить написанный мною код для решения поставленной задачи (подскажите, как улучшить, избавиться от "костыльности" и т.д.). Вот, собственно, он:
<code>
with open('out1.txt','r') as file1, open('out2.txt','w') as file2:
    line = file1.readline()
    count = previous_line = 0
    max_line = ''
    while line != '':
        count += 1
        if len(line) >= len(max_line):
            max_line = line
        line = file1.readline()
    line_number = None
    for i in range(count):
        file1.seek(0)
        cur_min_line = max_line
        pos = 0
        for j in range(count):
            next_line = file1.readline()
            if previous_line < len(next_line) < len(cur_min_line) and j != line_number:
                cur_min_line = next_line
                pos = j
            elif len(next_line) == previous_line and j != line_number:
                file2.write(next_line)
        file2.write(cur_min_line)
        line_number = pos
        previous_line = len(cur_min_line)
        if cur_min_line == max_line:
            break
</code>
Заранее прошу прощения, если мои вопросы показались странными или глупыми, но я уже долго пытаюсь найти то, что мне нужно, и, увы, пока тщетно. А это именно то, что требуется уметь делать в моём вузе на текущем этапе обучения.

В принципе почти то же, что и у вас.
Только никакие строчки считать не надо. Сначала за первое чтение находим минимальную длину строк. Потом снова идём по файлу и выписываем строки этой длины в выходной файл одновременно запоминая следующую минимальную длину (которая больше предыдущей). Повторяем сей процесс пока находятся строки большей длины.

with open('out1.txt','r') as input_file:
    min_len = min(map(len, input_file))  # в этой строке используются только генераторы, так что файл целиком не зачитывается
    with open('out2.txt','w') as output_file:
        while min_len != float('inf'):
            input_file.seek(0)
            next_min_len = float('inf')
            for line in input_file:
                line_len = len(line)
                if line_len > min_len and line_len < next_min_len:
                    next_min_len = line_len
                elif line_len == min_len:
                    output_file.write(line)
            min_len = next_min_len

Ну и обратная сортировка до кучи.

with open('out1.txt','r') as input_file:
    max_len = max(map(len, input_file))
    with open('out2.txt','w') as output_file:
        while max_len:
            input_file.seek(0)
            next_max_len = 0
            for line in input_file:
                line_len = len(line)
                if line_len > next_max_len and line_len < max_len:
                    next_max_len = line_len
                elif line_len == max_len:
                    output_file.write(line)
            max_len = next_max_len


При передаче encoding как переменную в open возникает ошибка TypeError: 'str' object cannot be interpreted as an integer
Как можно передать encoding в виде переменной в параметры open?
Этот код выполняется корректно:

open(file, 'r', encoding='utf_8_sig')

Здесь возникает ошибка TypeError: 'str' object cannot be interpreted as an integer

enс = 'utf_8_sig'
open(file, 'r', enс)

А указать атрибут encoding?
Вот как надо делать:
<code>
enс = 'utf_8_sig'
open(file, 'r', encoding=enс)
</code>


Как при сравнении версий 1.10.1>1.9.11 получить True?
Есть ли в питоне функция позволяющие работать со строками версий, сравнивать их на больше меньше и т.п.? Например нужно чтобы здесь результатом было True, а в таком виде получается False
<code>
'1.10.1' > '1.9.11'
</code>

Если не хочется использовать сторонние модули и строки версий состоят только из чисел, то можно их сконвертировать, например, в кортежи чисел, и сравнивать уже их.
<code>
def version(v):
    return tuple(map(int, v.split('.')))

print( version('1.10.1') > version('1.9.11') )   # => True
</code>


Перевести текст к другому виду в Python
Имеется большой файл со строками, строки группируются уникальными начальными данными:

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

и тд, еще 1000 связанных таких строк (дерево)
на выходе я должен получить

Случай 1:
Встретились: кошка, собака
Ели: рыбу, крысу, сыр, кашу, картошку
Делали: играли, дрались, ссорились

Случай 2:
Встретились: собака, птичка
Ели: ряженку, рябину, траву
Делали: танцевали, гуляли

Случай 3:
Встретились: корова, коза
Ели: рябину, траву
Делали: танцевали, гуляли

Необходимо сделать уникальность на основании начала предложения и привести к СлучайX.
Пробовал построчно обработать:

import os
import subprocess
with open("few_animals.txt") as animals:
  uniq_line = "none"
  for set_animals in animals:
    if set_animals.startswith('встретились'):
      set_line = set_animals.split()
      uniq_line_tmp == "".join(set_line[:2]) == "".join(set_line[:4])

      if (uniq_line_tmp != uniq_line):
        animal1 = set_line[2]
        animal2 = set_line[4]
        print('встретились "', animal1, '" "', animal2, '"' sep='')
      uniq_line = uniq_line_tmp

dir = os.path.dirname(os.path.abspath(__file__))
new_dir = os.chdir(dir)
d = input("Нажмите Enter для выхода")

Не могу зациклить.

На самом деле нужно распарсить конфигурационный файл в одном формате и на основе его создать конфигурационный файл в другом формате.
Так выглядит на джунипер:

set security policies from-zone untrust to-zone nprch policy term01 match source-address any
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.0
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.1
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.2
set security policies from-zone untrust to-zone nprch policy term01 match application junos-icmp-all
set security policies from-zone untrust to-zone nprch policy term01 match application junos-https
set security policies from-zone untrust to-zone nprch policy term01 then permit
set security policies from-zone untrust to-zone nprch policy term10 match source-address obj-10.1.74.251
set security policies from-zone untrust to-zone nprch policy term10 match source-address obj-10.1.74.252
set security policies from-zone untrust to-zone nprch policy term10 match source-address obj-10.1.74.253
set security policies from-zone untrust to-zone nprch policy term10 match destination-address obj-10.160.67.146
set security policies from-zone untrust to-zone nprch policy term10 match application tcp-445
set security policies from-zone untrust to-zone nprch policy term10 then permit
set security policies from-zone untrust to-zone nprch policy term11 description -=VPNs=-
set security policies from-zone untrust to-zone nprch policy term11 match source-address obj-10.255.1.7
set security policies from-zone untrust to-zone nprch policy term11 match destination-address obj-10.160.67.10
set security policies from-zone untrust to-zone nprch policy term11 match application junos-icmp-all
set security policies from-zone untrust to-zone nprch policy term11 match application tcp-3389
set security policies from-zone untrust to-zone nprch policy term11 then permit
set security policies from-zone untrust to-zone nprch policy term100 match source-address obj-10.1.0.0/16
set security policies from-zone untrust to-zone nprch policy term100 match destination-address obj-10.160.67.0
set security policies from-zone untrust to-zone nprch policy term100 match application any
set security policies from-zone untrust to-zone nprch policy term100 then deny
set security policies from-zone untrust to-zone nprch policy term100 then log session-init
set security policies from-zone untrust to-zone nprch policy term100 then log session-close
set security policies from-zone untrust_corp to-zone untrust policy term01 description To-Internet
set security policies from-zone untrust_corp to-zone untrust policy term01 match source-address obj-10.0.0.0/8
set security policies from-zone untrust_corp to-zone untrust policy term01 match destination-address internet
set security policies from-zone untrust_corp to-zone untrust policy term01 match application any
set security policies from-zone untrust_corp to-zone untrust policy term01 then permit
set security policies from-zone untrust to-zone untrust_corp policy term01 description from-internet
set security policies from-zone untrust to-zone untrust_corp policy term01 match source-address internet
set security policies from-zone untrust to-zone untrust_corp policy term01 match destination-address obj-10.0.0.0/8
set security policies from-zone untrust to-zone untrust_corp policy term01 match destination-address obj-192.168.0.0/8
set security policies from-zone untrust to-zone untrust_corp policy term01 match application any
set security policies from-zone untrust to-zone untrust_corp policy term01 then deny
set security policies from-zone untrust to-zone untrust_corp policy term01 log session-init
set security policies from-zone untrust to-zone untrust_corp policy term01 log session-close

итд
Вот так должно выглядеть на форигейт

edit 1
set name "untrust_nprch_term01"
set srcintf "untrust"
set dstintf "nprch"
set srcaddr "any"
set dstaddr "obj-10.160.67.0" "obj-10.160.67.1" "obj-10.160.67.2"
set service "junos-icmp-all" "junos-https"
set action accept
set logtraffic disable
next
edit 2
set name "untrust_nprch_term10"
set srcintf "untrust"
set dstintf "nprch"
set srcaddr "obj-10.1.74.251" "obj-10.1.74.252" "obj-10.1.74.253"
set dstaddr "obj-10.160.67.146"
set service "tcp-445"
set action accept
set logtraffic disable
next
edit 3
set name "untrust_nprch_term11"
set srcintf "untrust"
set dstintf "nprch"
set srcaddr "obj-10.1.74.251" "obj-10.1.74.252" "obj-10.1.74.253"
set dstaddr "obj-10.160.67.146"
set service "tcp-445"
set action accept
set comments "-=VPNs=-"
set logtraffic disable
next
edit 4
set name "untrust_nprch_term100"
set srcintf "untrust"
set dstintf "nprch"
set srcaddr "obj-10.1.0.0/16"
set dstaddr "obj-10.160.67.0"
set service "any"
set action deny
set comments "-=VPNs=-"
set logtraffic all
next
edit 5
set name "untrust_corp_untust_term01"
set srcintf "untrust_corp"
set dstintf "unturst"
set srcaddr "obj-10.0.0.0/8"
set dstaddr "internet"
set service "any"
set action permit
set comments "To-Internet"
set logtraffic disable
next
edit 6
set name "untrust_untust_corp_term01"
set srcintf "untrust"
set dstintf "untrust_corp"
set srcaddr "internet"
set dstaddr "obj-10.0.0.0/8" "obj-192.168.0.0/8"
set service "any"
set action deny
set comments "from-internet"
set logtraffic all
next

Чтобы накапливать данные - придумали списки. Чтобы ассоциировать эти данные с чем-то уникальным - придумали словари.

import re
from collections import defaultdict

text = """
встретились кошка и собака они ели рыбу
встретились кошка и собака они ели крысу
встретились кошка и собака они ели сыр
встретились кошка и собака они ели кашу
встретились кошка и собака они ели картошку
встретились кошка и собака они вместе играли
встретились кошка и собака они вместе дрались
встретились кошка и собака они вместе ссорились
встретились собака и птичка они ели ряженку
встретились собака и птичка они ели рябину
встретились собака и птичка они ели траву
встретились собака и птичка они вместе танцевали
встретились собака и птичка они вместе гуляли
встретились корова и коза они ели рябину
встретились корова и коза они ели траву
встретились корова и коза они вместе танцевали
встретились корова и коза они вместе гуляли
"""

animals = defaultdict(lambda: defaultdict(list))
for line in text.strip().splitlines():
    anim1, anim2, do, what = re.findall(r"встретились\s+(\w+)\s+и\s+(\w+)\s+они\s+(\w+)\s+(\w+)", line)[0]
    animals[(anim1, anim2)][do].append(what)

for i,(k,v) in enumerate(animals.items(), 1):
    print("Случаай", i)
    print("Встретились:", ", ".join(k))
    print("Ели:", ", ".join(v["ели"]))
    print("Делали:", ", ".join(v["вместе"]))
    print()

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

for anim1, anim2, do, what in re.findall(r"встретились\s+(\w+)\s+и\s+(\w+)\s+они\s+(\w+)\s+(\w+)", text):
    animals[(anim1, anim2)][do].append(what)

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

import re
from collections import defaultdict

juniper_rules = """
set security policies from-zone untrust to-zone nprch policy term01 match source-address any
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.0
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.1
set security policies from-zone untrust to-zone nprch policy term01 match destination-address obj-10.160.67.2
set security policies from-zone untrust to-zone nprch policy term01 match application junos-icmp-all
set security policies from-zone untrust to-zone nprch policy term01 match application junos-https
set security policies from-zone untrust to-zone nprch policy term01 then permit
...
"""

fortigate_rules = defaultdict(lambda: {"srcintf"    : None,
                                       "dstintf"    : None,
                                       "srcaddr"    : [],
                                       "dstaddr"    : [],
                                       "service"    : [],
                                       "action"     : None,
                                       "comments"   : None,
                                       "logtraffic" : "disable"})

for rule in juniper_rules.splitlines():
    if not rule: continue   # пропуск пустых строк
    parsed = re.match(r"""\s*set\s+security\s+policies\s+
                            from-zone\s+(?P<from_zone>\S+)\s+
                            to-zone\s+(?P<to_zone>\S+)\s+
                            policy\s+(?P<policy>\S+)\s+
                            (match\s+(?P<match>\S+)\s+(?P<match_arg>\S+)
                            |(then\s+)?(?P<log>log)
                            |then\s+(?P<then>\S+)
                            |description\s+(?P<description>\S+))""", rule, re.X)

    if not parsed:
        print("Строка не распознана: ", rule)
    else:
        name = f'{parsed["from_zone"]}_{parsed["to_zone"]}_{parsed["policy"]}'
        for match, to_item in (("from_zone"  , "srcintf" ),
                               ("to_zone"    , "dstintf" ),
                               ("then"       , "action"  ),
                               ("description", "comments"),
                               ):
            if parsed[match]:
                fortigate_rules[name][to_item] = parsed[match]
        for match, to_item in (("source-address"     , "srcaddr"),
                               ("destination-address", "dstaddr"),
                               ("application"        , "service")):
            if parsed["match"] == match:
                fortigate_rules[name][to_item].append(parsed["match_arg"])
        if parsed["log"]:
            fortigate_rules[name]["logtraffic"] = "all"

for i, name in enumerate(fortigate_rules, 1):
    print("edit", i)
    print(f'set name "{name}"')
    for item, q in (("srcintf", '"'), ("dstintf", '"'), ("comments", '"'),
                    ("action", ''), ("logtraffic", '')):
        if fortigate_rules[name][item]:
            print(f'set {item} {q}{fortigate_rules[name][item]}{q}')
    for item in ("srcaddr", "dstaddr", "service"):
        if fortigate_rules[name][item]:
            print(f'''set {item} "{'" "'.join(fortigate_rules[name][item])}"''')
    print("next\n")


Не открывается игра повторно
Есть папка из картинками и 3 файла, база данных(record, в ней 1 таблица,в таблице 2 столбца nicname и score), игра(racce) и меню к игре написанное на tkinter(menu) по замыслу в меню есть кнопка "Играть" по нажатию кнопки меню закрывается, и открывается игра, и аналогичная штука есть в конце игры, что бы игра закрывалась и открывалось меню, но почему-то при открывании меню 1 игра идет нормально, а когда в конце игры открывается меню еще раз, то при нажатии "Играть" меню закрывается и все
Вот код menu:

from tkinter import*
import sqlite3

tk = Tk()
tk.geometry('350x400')
tk.title('menu')
db = sqlite3.connect("record.db")
sql = db.cursor()
db.commit()

lbox = Listbox(bg='RoyalBlue3')
lbox.place(x = 20, y = 100, width = 211, height = 150)

with sqlite3.connect('record.db') as connection:
    cursor = connection.cursor()
    lis = cursor.execute(f'SELECT score, nickname FROM bd ORDER BY score DESC LIMIT 6').fetchall()
def LISTBOX():
    lbox.delete(0,END)
    for i in range(len(lis)):
        lbox.insert(END, lis[i])

def start_game():
    if ent.get() != '':
        name = ent.get()
        sql.execute("INSERT INTO bd VALUES(?, ?)", (name, 0))
        db.commit()
        tk.destroy()
        import racce
    else:
        print("Поле не может быть пустым!")

def exit_in_game():
    tk.destroy()

game = Button(text = 'Играть', bg='DarkGoldenrod1', command = start_game)
game.place(x = 20, y = 270, width =  150, height = 50)
Exit = Button(text = 'Выход', bg='DarkGoldenrod1', command = exit_in_game)
Exit.place(x = 20, y = 340, width = 150, height = 50)

ent = Entry(justify = "right", font = "14", bg='orange red')
ent.place(x = 125, y = 20, width = 215, height = 35)
nickname = Label(text = f'Никнейм:', bg='tomato')
nickname.place(x = 20, y = 22, width = 100, height = 30)

record = Label(text = f'Рекорды:', bg='chartreuse4')
record.place(x = 20, y = 60, width = 100, height = 30)

tk.configure(background='green3')

LISTBOX()
tk.mainloop()

racce:

import pygame
import random
import time
import sqlite3
from os import path

WIDTH = 513
HEIGHT = 480
FPS = 60
db = sqlite3.connect('record.db')
sql = db.cursor()
db.commit()

BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
YELLOW = (255,255,0)

pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
clock = pygame.time.Clock()
score = 0
score_chek = 50
speed_mob = 4
player_lives = 100

font_name = pygame.font.match_font('None')
def draw_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name,size)
    text_surface = font.render(text, True, WHITE)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)
def draw_game_over_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name,size)
    text_surface = font.render(text, True, RED)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

def mob():
    mob = Mob()
    all_sprites.add(mob)
    mobs.add(mob)

def l():
    live = Live()
    all_sprites.add(live)
    liv.add(live)

def walls():
    lin1 = line1()
    all_sprites.add(lin1)
    li1.add(lin1)
    lin2 = line2()
    all_sprites.add(lin2)
    li2.add(lin2)

class line1(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10,480))
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center =  (WIDTH - 310, HEIGHT / 2)

class line2(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10,480))
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH - 150, HEIGHT / 2)

class Car(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(player_skin, (45,55))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2,HEIGHT - 70)
        self.speedx = 0

    def update(self):
        global running, speed_mob
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_ESCAPE]:
            running = False
        if keystate[pygame.K_RIGHT] or keystate[pygame.K_d]:
            self.speedx = 8
        if keystate[pygame.K_LEFT] or keystate[pygame.K_a]:
            self.speedx = -8
        if keystate[pygame.K_UP] or keystate[pygame.K_w]:
            if speed_mob == 15:
                pass
            else:
                speed_mob += 1
        if keystate[pygame.K_DOWN] or keystate[pygame.K_s]:
            if speed_mob == 4:
                pass
            else:
                speed_mob -= 1
        if self.rect.right > WIDTH - 160:
            self.rect.right = WIDTH - 160
        if self.rect.left < WIDTH - 300:
            self.rect.left = WIDTH - 300
        self.rect.x += self.speedx

class MM(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(lives, (25,35))
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH - 481, HEIGHT - 50)

    def update(self):
        global running
        if self.rect.top < WIDTH - 470:
            print('END')
            #running = False
        #self.rect.y += self.speedy

class Live(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        if player_lives <= 0:
            self.image = pygame.Surface((1,20))
            self.image.fill(GREEN)
            self.rect = self.image.get_rect()
            self.rect.center = (WIDTH - 65,HEIGHT - 165)
        else:
            self.image = pygame.Surface((player_lives, 20))
            self.image.fill(GREEN)
            self.rect = self.image.get_rect()
            self.rect.center = (WIDTH - 65,HEIGHT - 165)

    def update(self):
        global pv
        if pv == True:
            pv = False
            self.kill()
            l()

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        a1 = random.randint(1,2)
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(mob_skin, (45, 55))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        if a1 == 1:
            self.rect.center = (WIDTH - 190,HEIGHT - 480)
        elif a1 == 2:
            self.rect.center = (WIDTH - 270, HEIGHT - 480)
        self.speedy = speed_mob

    def update(self):
        global score, speed_mob, score_chek, running
        if self.rect.top > HEIGHT:
            self.kill()
            score += 10
            mob()
        if score == score_chek:
            if speed_mob == 15:
                pass
            else:
                speed_mob += 1
            score_chek += 50
        self.rect.y += self.speedy
        if game_over == True:
            self.kill()

img_dir = path.join(path.dirname(__file__), 'img')
lives = pygame.image.load(path.join(img_dir, 'lives.png')).convert()
player_skin = pygame.image.load(path.join(img_dir, 'player.png')).convert()
mob_skin = pygame.image.load(path.join(img_dir, 'mob.png')).convert()
background = pygame.image.load(path.join(img_dir, 'bg.png')).convert()
background_rect = background.get_rect()

all_sprites = pygame.sprite.Group()
mm = pygame.sprite.Group()
mm = MM()
all_sprites.add(mm)
mobs = pygame.sprite.Group()
liv = pygame.sprite.Group()
l()
mob()
li1 = pygame.sprite.Group()
li2 = pygame.sprite.Group()
walls()
player = pygame.sprite.Group()
player = Car()
all_sprites.add(player)

pv = False
running = True
game_over = False
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    all_sprites.update()

    hits = pygame.sprite.spritecollide(player,mobs,True)
    for hit in hits:
        pv = True
        player_lives -= 50
        speed_mob -= 1
        mob()

    g = pygame.sprite.spritecollide(player, li1, False)
    for j in g:
        pv = True
        player_lives -= 1

    g = pygame.sprite.spritecollide(player, li2, False)
    for j in g:
        pv = True
        player_lives -= 1

    if player_lives <= 0:
        game_over = True

    screen.fill(BLACK)
    screen.blit(background, background_rect)
    all_sprites.draw(screen)
    draw_text(screen, str(player_lives), 18, WIDTH - 100, 335)
    draw_text(screen, str(score), 18, WIDTH - 100, 100)
    draw_text(screen, str(f'{speed_mob}0'), 18, WIDTH - 50, 200)
    if game_over == True:
        draw_game_over_text(screen, 'GAME OVER', 100, WIDTH/2, HEIGHT/2)
        sql.execute(f'UPDATE bd SET score = {score} WHERE score = 0')
        db.commit()
        running = False
    pygame.display.flip()

pygame.quit()

import menu

Вся проблема из-за того что вы импортируете модули несколько раз. Так нельзя делать.
Вот один из вариантов решения проблемы:
<code>
import os
os.system('start ФАЙЛ_КОТОРЫЙ_НУЖНО_ЗАПУСТИТЬ')
</code>
Это даст команду консоли на запуск. (проверено на windows 10)