Ошибка - TypeError: list indices must be integers or slices, not str
Может кто подсказать как исправить?

Cursor.execute(_SQL, (pricelist['name']))
  TypeError: list indices must be integers or slices, not str

<code>
def BB_parse(base_url, headers):
    pricelist = []
    session = requests.Session()
    request = session.get(base_url, headers = headers)
    if request.status_code == 200:
        soup = bs(request.content, 'lxml')
        container_main = soup.find_all('div', {'class': 'content-wrapper'})
        for c1 in container_main:
            try:
                article = c1.find('div', {'class': 'article'}).text.strip().replace("Артикул: ", "")
                name = c1.select('h1')[0].text
                description = c1.find('div', {'class': 'description'}).text.strip()
                available = c1.find('div', {'class': 'avl'}).text.strip()
                price = c1.find('span', {'class': 'catalog-detail-item-price' }).text.replace("Цена:", "").replace("тг.", "").replace("за шт", "").strip()
                oldprice = c1.find('span', {'class': 'catalog-detail-item-price-old' }).text.replace("Цена:", "").replace("тг.", "").replace("за шт", "").replace(" ", "").strip()
                Category1 = c1.find_all('span', {'itemprop': 'title'})[1].text
                Category2 = c1.find_all('span', {'itemprop': 'title'})[2].text
                Category3 = c1.find_all('span', {'itemprop': 'title'})[3].text
                catalog_detail_pictures = c1.find_all('div', {'class': 'catalog-detail-pictures'})
                image1 = c1.find_all('a', {'rel': 'lightbox'})[0]['href']
                image2 = c1.find_all('a', {'rel': 'lightbox'})[1]['href']
                image3 = c1.find_all('a', {'rel': 'lightbox'})[2]['href']
            except:
                pass

            for count, tag in enumerate(soup.find_all(class_='name')):
                try:
                    if tag.text == 'ISBN':
                       code = soup.find_all(class_='val')[count].text
                    if tag.text == 'Издательство':
                       Publish = soup.find_all(class_='val')[count].text
                    if tag.text == 'Авторы':
                       Authors = soup.find_all(class_='val')[count].text
                    if tag.text == 'Серия':
                       Series = soup.find_all(class_='val')[count].text
                    if tag.text == 'Переплет':
                       Blinding = soup.find_all(class_='val')[count].text
                    if tag.text == 'Количество страниц':
                       Count_Page = soup.find_all(class_='val')[count].text
                    if tag.text == 'Ширина':
                       Width = soup.find_all(class_='val')[count].text
                    if tag.text == 'Высота':
                       Height = soup.find_all(class_='val')[count].text
                    if tag.text == 'Дата последнего тиража':
                       Date = soup.find_all(class_='val')[count].text

                except:
                  pass

            pricelist.append({
                     'name': name,
                     'article': article,
                     'price': price,
                     'oldprice': oldprice,
                     'available': available,
                     'code': code,
                     'Publish': Publish,
                     'Authors': Authors,
                     'Series': Series,
                     'Blinding': Blinding,
                     'Count_Page': Count_Page,
                     'Width': Width,
                     'Height': Height,
                     'Date': Date,
                     'Category1': Category1,
                     'Category2': Category2,
                     'Category3': Category3,
                     'image1': image1,
                     'image2': image2,
                     'image3': image3
                })

        write_sql(pricelist)
        print(len(pricelist))

    else:
        print('ERROR or Done. Status_code = ' + str(request.status_code))

    return pricelist

def write_sql(pricelist):
    DB = {'host': '',
         'user': '',
         'password': '',
         'database': ''}

    conn = mysql.connector.connect(**DB)
    Cursor = conn.cursor()

    _SQL = "INSERT INTO products (Наименование, Артикул, Цена, Старая_цена, Наличие, Код, Издательство, Авторы, Серия, Переплет, Количество_страниц, Ширина, Высота, Дата_тиража, Родительская_категория, Категория, Подкатегория, Картикнка_1 Картикнка_2, Картикнка_3) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
    Cursor.execute(_SQL, (pricelist['name'],
        pricelist['article'],
        pricelist['price'],
        pricelist['oldprice'],
        pricelist['available'],
        pricelist['code'],
        pricelist['Publish'],
        pricelist['Authors'],
        pricelist['Series'],
        pricelist['Blinding'],
        pricelist['Count_Page'],
        pricelist['Width'],
        pricelist['Height'],
        pricelist['Date'],
        pricelist['Category1'],
        pricelist['Category2'],
        pricelist['Category3'],
        pricelist['image1'],
        pricelist['image2'],
        pricelist['image3'],
        ))
    DB.commit()
    Cursor.close()
    DB.close()

BB_parse(base_url, headers)
</code>

Переменная
pricelist является списком. Оператор индексирования
[] для объекта типа
list принимает только целые числа (индексы элементов списка) или объект типа
slice в качестве аргумента.
'name' - не является ни целым числом ни
slice'ом.
Поэтому команда:

pricelist['name']

вызывает ошибку:

TypeError: list indices must be integers or slices, not str

Если я правильно понимаю ваш код, переменная
pricelist - список записей-словарей, которые вы хотите вставить в SQL таблицу.
Сделать это можно так:

records = [tuple(x.values()) for x in pricelist]
Cursor.executemany(_SQL, records)


этот код вернет массив с точками, которые распределены с некоторым шагом
<code>
from svg.path import parse_path
from xml.dom import minidom

def extract_path(name, freq, scale=1, x_offset=0, y_offset=0):
    doc = minidom.parse(name)
    path_strings = [path.getAttribute('d') for path in doc.getElementsByTagName('path')]
    doc.unlink()

    path = []

    for path_string in path_strings:
        items = parse_path(path_string)
        for item in items:
            leng = item.length()
            step = round(leng/freq)
            for time in range(step):
                time/=step
                pos = item.point(time)
                path.append([(pos.real+x_offset)*scale, (pos.imag+y_offset)*scale])

    return path
</code>


По какой причине выдаёт ошибку?
Делаю программу с графическим интерфейсом Tkinter. В данном окне должен находится виджет Treeview. Но по какой-то причине, если пытаюсь сделать второй уровень мне выдаёте ошибку. Помогите, пожалуйста.
Код:
<code>
#Таблица
self.table = ttk.Treeview(self, columns=('FIO','DB','Class','litera','adr','phone','book','aut','stat'), height=100, show='headings')

self.table.column('FIO', width=100, anchor=tk.CENTER)
self.table.column('DB', width=100, anchor=tk.CENTER)
self.table.column('Class', width=100, anchor=tk.CENTER)
self.table.column('litera', width=100, anchor=tk.CENTER)
self.table.column('phone', width=100, anchor=tk.CENTER)
self.table.column('adr', width=100, anchor=tk.CENTER)
self.table.column('book', width=100, anchor=tk.CENTER)
self.table.column('aut', width=100, anchor=tk.CENTER)
self.table.column('stat', width=100, anchor=tk.CENTER)

self.table.heading('FIO', text='ФИО')
self.table.heading('DB', text='День рождения')
self.table.heading('Class', text='Класс')
self.table.heading('litera', text='Литера')
self.table.heading('phone', text='Телефон')
self.table.heading('adr', text='Адрес')
self.table.heading('book', text='Книга')
self.table.heading('aut', text='Автор')
self.table.heading('stat', text='Статус')

self.table.pack()
self.table.place(x=0,y=100)

conn = sqlite3.connect(os.path.dirname(os.path.abspath(__file__))+"/LC.db")
cur = conn.cursor()
#Вывовд всех учеников
cur.execute("SELECT * FROM STUD")
rows = cur.fetchall()
for row in rows:
    lvl1 = self.table.insert("" , tk.END , values=row)
    row1 = row[:2]
    cur.execute('SELECT BOOK, AUT, STAT FROM LC WHERE FIO=(?) and DB=(?)',row1)
    books = cur.fetchall()
    for book in books:
        self.table.insert("", lvl1, tk.END, values = book)

#Вывод всех учителей
cur.execute("SELECT * FROM TEACH")
rows = cur.fetchall()
for row in rows:
    self.table.insert("" , tk.END , values=row)

#Вывод других посетителей
cur.execute("SELECT * FROM OTHERS_VISITERS")
rows = cur.fetchall()
for row in rows:
    self.table.insert("" , tk.END , values=row)
</code>
Ошибка: _tkinter.TclError: expected integer but got "I002"

Уже сам нашёл решение проблемы. Я неправильно создавал второй уровень Treeview.
Вот как должно быть:
self.table.insert(lvl1, 'end',text='Книга',values=book)


Поиск индексов повторяющихся элементов списка
Есть список, и мне нужно знать индекс определенного элемента.
Например:
<code>
wordToCheck = "Маша"
list = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша']
</code>
То есть в данном списке, мне нужны индексы - 0, 2, 5

Если нужны индексы именно элементов "Маша":
<code>
s = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша']

x = [i for i, ltr in enumerate(s) if ltr == "Маша"]
print(x)   #  [0, 2, 5]
</code>


tkinter считывать нажатие на фигуру
Программка, где надо кликать на кружочки успеть, и я вообще хз, как сделать так, что бы считывалось нажатие на фигуру, конечно можно именно кружок, но можно и квадрат коодинат кружка
<code>
from tkinter import *
from tkinter import messagebox
import random
import time

#Начало блока окна
root = Tk()
root.geometry('960x540')
root.title("ReacPicker v1.0")
root.iconbitmap(r'D:\python\charm\учуся\venv\gg\ReacPicker v1.0\4.ico')
#Конец блока окна

#Начало блока переменных
colors = ['red','orange','green','blue']
instr = "Ае сасный"
zach = "да не зачем"
#Конец блока переменных

#Начало блока функций
def Instruct():
    messagebox.showinfo("Справка", instr)
def Zachem():
    messagebox.showinfo("Справка", zach)

def Start():
    Krujki()
    button1['state'] = 'disabled'

def f(event):
    print(event.x, event.y)

def Krujki():
    global a,b,r
    holst.delete(ALL)
    a = random.randint(5, 640)
    b = random.randint(5, 480)
    r = 25
    holst.create_oval(a,b,a+r,b+r,fill = random.choice(colors), width=0)
    root.after(1000,Krujki)

def click(event):
    #global i
    for event.x in range(event.x, event.x + 25):
        print (event.x)
    for event.y in range(event.y, event.y + 25):
        print (event.y)

    print(a, b, 111)
    print(event.x, event.y)

def Lose():
    global labelLL
    labelLL = Label(holst, text = 'ReacPicker v1.0', font = ("Ubuntu", 20))
    labelLL.place(x= 50, y= 90)
#Конец блока функций

#Начало блока меню
menu1 = Menu(root)
root.configure(menu=menu1)
menu1.add_command(label = "Инструкция", command=Instruct)
menu1.add_command(label = "О программе", command=Zachem)
#Конец блока меню

holst = Canvas(root, width=670, height=500, bg='white')
label1 = Label(root, text = 'ReacPicker v1.0', font = ("Ubuntu", 14))
button1 = Button(root, text = 'Играть', font = 30,height=5, width=25,  command=Start)

#Начало блока размещения
label1.place(x= 700, y= 20)
button1.place(x= 700, y= 130)
holst.place(x= 10, y= 10)
#Конец блока размещения

holst.bind('<Button-1>', click)

root.mainloop()
</code>

Чтобы отслеживать нажатие на фигуру на Canvas, можно использовать привязку к событию фигуры с помощью метода
tag_bind:

import random
from tkinter import *

root = Tk()
holst = Canvas(root, width=670, height=500, bg='white')
holst.pack()

colors = ['red','orange','green','blue']

def click_on_circle(event):
    print('Click on circle')

def Krujki():
    holst.delete(ALL)
    a = random.randint(5, 640)
    b = random.randint(5, 480)
    r = 25
    krug = holst.create_oval(a, b, a+r, b+r, fill=random.choice(colors), width=0)

    holst.tag_bind(krug, '<Button-1>', click_on_circle)

    root.after(1000,Krujki)

Krujki()
root.mainloop()

Функция
click_on_circle будет срабатывать при клике по кружку. Будет работать и если заменить овал на прямоугольник (
create_rectangle) или многоугольник (
create_polygon).


покоится ли тело или нет [закрыт]

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

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

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

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

программа которая узнает по векторам XYZ покоится ли тело я не очень в физике помогите плиз

В первой строке задано натуральное число n (1 ≤ n ≤ 100), далее
  следует n строк по три целых числа в каждой: координата xi, координата
  yi и координата zi вектора силы, приложенной к телу
  ( - 100 ≤ xi, yi, zi ≤ 100).
входные данные
  3
  3 -1 7
  -5 2 -4
  2 -1 -3
выходные данные YES

Ну, это проще.
Для этого примера - сумма координат векторов силы по каждой оси равна нулю, поэтому тело покоится.
3+(-5)+2=0
(-1)+2+(-1)=0
7+(-4)+(-3)=0
Для другого примера (он первый в задании) суммы не равны нулю, поэтому тело движется.


Возможно ли с помощью sys.stdout.write("\r") редактировать первую строку терминала не изменяя другие?
Вот мой код:

import time
import sys
import psutil
import threading
from random import randint
def sysusage():
    while True:
        mem=dict(psutil.virtual_memory()._asdict())["percent"]
        cpu=psutil.cpu_percent()
        sys.stdout.write("\r")
        sys.stdout.write(f"[CPU:{cpu}%    RAM:{mem}%]")
        sys.stdout.flush()
        time.sleep(1)

sysuse = threading.Thread(target=sysusage,daemon=True)
sysuse.start()
while 1==1:
    print(f"{randint(100,999)}")
    time.sleep(0.5)

Выход:

649
[CPU:0.0%    RAM:92.2%]172
698
[CPU:16.7%    RAM:92.3%]600
109
[CPU:11.5%    RAM:92.3%]741
539

хотя строчка
[CPU:11.5%    RAM:92.3%] должна была остаться сверху и обновляться:

[CPU:11.5%    RAM:92.3%]
649
172
698
600
109
741
539

Как решить эту проблему?

В конце кода, где вывод случайного числа, по дефолту print добавляет перенос строки ("\n").
Хотя даже если написать
print("...", end=""), то выводить что-то, и обновлять первую строку по моему не выйдет, курсор уже сместился


Почему возникает ошибка: "AttributeError: 'set' object has no attribute 'format'"?
ошибка AttributeError: 'set' object has no attribute 'format'
<code>
print ("Первое число")
first = int( input())
print ("действие (+ - * /)")
choise = str( input())
print("второе число")
second = int( input())
if choise == "+":
    print( {0} + {1} .format(first, second))
</code>

Правильно будет так, т.к. str.format -- метод строки:

print("{0} + {1}".format(first, second))

А
{1} это литерал для объявления множества (
set). Попробуйте, например
print(type({1}))

PS.

{  } -- это двойственный литерал, одновременно используемый для множества (
set) и словарей (
dict), например:

print({1})  # Множество
print({'a': 1, 'b': 2})  # Словарь

PPS.
Начиная с
python 3.6 можно использовать
f-string:

print(f"{first} + {second}")


AttributeError: module 'tensorflow' has no attribute 'name_scope'
Пытаюсь запустить программу, которая буквально 10 минут назад работала без проблем, а сейчас выдает ошибку об отсутствии атрибута 'name_scope'. В чем может быть проблема? никаких новых модулей за это время не устанавливала, ничего в них не меняла.

import csv
import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation
from keras.layers import Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from tensorflow.keras import utils

train_imgs=[]
a=[]
b=[]
with open('train.csv', 'r') as csv_file:
    csv_reader=csv.reader(csv_file)
    next(csv_reader)
    for line in csv_reader:
        for i in line[0]:
            i=int(i)
            a.append(i)
train_labels=utils.to_categorical(a, 10)
class_names = ["Злость", "Отвращение", "Страх", "Радость", "Грусть", "Удивление", "Нейтральная эмоция" ]

Ошибка:
AttributeError: module 'tensorflow' has no attribute 'name_scope'

У меня получилось исправить ошибку, удалив tensorflow и переустановив таким способом:
<code>
pip install --ignore-installed --upgrade tensorflow==1.14.0
</code>


Ошибочное поведение django orm
Создал модель (изначально в ней было поле ManyToMany, после само объявление было перенесено в другую модель)

class Tag(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название', unique=True)

Сделал миграции, заполнил таблицу. В итоге скрипт не работал. После анализа я нашел окончательную ошибку. (далее консоль)

./manage.py shell
Python 3.7.5 (default, Nov 20 2019, 09:21:52)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from ask_stranger.models import Tag
>>> t = Tag.objects.get(pk=800)
>>> t
<Tag: Tag object (Chartered accountant12)>
>>> t.name
800
>>> t.id
'Chartered accountant12'
>>>

то есть на запрос имени orm выдает id, и наоборот. В самой базе данных проверял, таблица создана и заполнена нормально. Можете хотя бы предположить, в чём проблема?
Прикрепляю аналогичный запрос из базы данных:

django_db=# select * from ask_stranger_tag where id = 800;
 id  |          name
-----+------------------------
 800 | Chartered accountant12
(1 row)

Методом проб и ошибок выяснилось, что проблема состояла в том, что я реализовал у классов инициализаторы, которые сначала вызывали инициализатор суперкласса, после чего инициализировали поля. Из-за этого орм django "путал" названия последних двух полей


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

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

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

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

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

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

Попробуйте так:
<code>
var1, var2 = input().split()
</code>


Что дальше учить новичку PYTHON [закрыт]

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

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

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

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

закончили основы питона не знаю что дальше учить․ Может надо учить framwork и не угубляца в питоне

Помогут такие книжки как:

Python 3 и PyQt 5. Разработка приложений,
  Прохоренок Н.А. & Дронов В.А.
Python Cookbook,
  David Beazley & Brian K. Jones
High Performance Python: Practical Performant Programming for Humans,
  Micha Gorelick & Ian Ozsvald

Также мне очень помог сайт CodeWars, на нем можно найти задачи на любой уровень и двигаться дальше


AttributeError: module 'tkinter' has no attribute 'ListBox'
В моменте кода:
<code>
self.lbproblems = tk.ListBox(main, width=15, height=8)
self.lbproblems.grid(row=0, column=0)
</code>
Ошибка:

AttributeError: module 'tkinter' has no attribute 'ListBox'

ошибка в том, что в tkinter нет класса
ListBox, но есть
Listbox

self.lbproblems = tk.Listbox(main, width=15, height=8)
self.lbproblems.grid(row=0, column=0)


Не подтягивается картинка с помощью {{ contact.contact_image.ur }}
Проблема в том что приложение пытается тянуть картинку по ссылке

/ref_pages/media/fbRostovay.jpg1.JPG

но доступна она по

/media/fbRostovay.jpg1.JPG

приложение автоматом добавляет

/ref_pages

Если я путь в MEDIA_URL = '/media/' меняю на MEDIA_URL = '/ref_pages/media/' то работает но тогда картинки не может получить другое приложение
в другом приложении все норм работает не пойму где я натупил,подскажите плс из-за чего это может быть
models.py

from __future__ import unicode_literals
from django.db import models

class Referer(models.Model):
    class Meta():
        db_table = "ref_pages_referer"

    ref_link = models.CharField(max_length=200)
    describe_link = models.TextField()
    free_test = models.BooleanField(default=True)
    personal_proxy = models.BooleanField(default=True)
    change_proxy = models.BooleanField(default=True)
    public = models.BooleanField(default=True)
    img = models.ImageField(default='img/q12.jpg')

    def __str__(self):
        return self.describe_link

views.py

from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404, render

from .models import Referer

def category(request):
    return render(request, 'ref_pages/category.html')

def support(request):
    contact_list = Referer.objects.all()
    paginator = Paginator(contact_list, 2)  # Show 25 contacts per page
    page = request.GET.get('page')
    contacts = paginator.get_page(page)
    return render(request, 'ref_pages/index.html', {'contacts': contacts})

urls.py

from django.urls import path

from . import views

app_name = 'ref_pages'

urlpatterns = [
    path('category', views.category, name='category'),
    path('', views.support, name='index'),
]

settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'poll/static') # добавил для отображения новой админки
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Попробуйте добавить в
urls.py в папке проекта следующее:

from django.conf.urls.static import static

urlpatterns = [
    # ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


сделать слайс в мультииндексе с использованием Timestamp Pandas (реиндексировать мультииндекс для использования слайса по Timestamp)
Имею датафрейм. Построен мультинденкс: (str, str, Timestamp).

MultiIndex([...], names=['IDКлиента, Бизнес-Линия', 'Расчет', 'Дата инвестиции'], length=73012)
Хочу отобрать значения датафрейма из диапазона дат, например: 2020-01-01 : 2020-12-31 (за год, включая левую и правую границы):

df.loc[slice(None),slice(None), slice('2020-01-01','2020-12-31')]
ловлю ошибку: "IndexingError: Too many indexers"
Пробую по-другому:

start = pd.Timestamp('2020-01-01')
finish = pd.Timestamp('2020-12-31')
df.loc[slice(None),slice(None), slice(start, finish)]
все равно ловлю ошибку: "IndexingError: Too many indexers"
Как правильно сделать слайс?
UPD:
увидел, что обращался неправильно, исправил:

df.loc[(slice(None),slice(None), slice('2020-01-01','2020-12-31')), :]
ловлю другую ошибку:

UnsortedIndexError: 'MultiIndex slicing requires the index to be lexsorted: slicing on levels [2], lexsort depth 0'

Вы уже ответили на собственный вопрос - для того, чтобы иметь возможность использовать срезы, индекс должен быть отсортирован.
Я бы еще посоветовал использовать pd.IndexSlice[...] для multi-index slicing:

idx = pd.IndexSlice
df.loc[idx[:, :, '2020-01-01':'2020-12-31'], :]

вместо:

df.loc[(slice(None),slice(None), slice('2020-01-01','2020-12-31')), :]


Отличие кортежей от списков
В чём отличие кортежей от списков в python? Они очень похожи. Почему бы всегда не использовать списки?

Список - аналог массивов в других языках программирования. И он изменяем, в отличии от кортежа.
Кортеж нельзя отсортировать, однако можно преобразовать в список и отсортировать уже его.
Кортеж объявляется круглыми скобками
tuple = ( 1, 2, 3 )
Список же квадратными
list = [ 1, 2, 3 ]


Кортеж в Python. Сложение элементов разных типов
Задача следующая.
Разработать функцию, принимающую любое количество аргументов и возвращает их сумму.
Проверки следующие:

assert big_summa(1, 2, 3) == 6
assert big_summa(i for i in range(10)) == 45
assert big_summa((i for i in range(10)), 1) == 46
assert big_summa(2, (i for i in range(10)), 1) == 48
assert big_summa({-1, 1, 0}) == 0

Моё решение этой задачи:

import itertools

def big_summa(*args):
    sum_item = 0
    for item in args:
        if isinstance(item, int):
            sum_item = list(itertools.accumulate(args))[-1]

        else:
            for elem in item:
                sum_item += elem
    return sum_item

Я воспользовался методом accumulate(), который возвращает в форме списка сумму с нарастающим итогом и взял оттуда последний элемент. Такой код проходит только для первого assert(a) c простыми числами.
Далее, c блоком else проходят еще второй и пятый assert.
На кортеж состоящий из range() и простых чисел выпадает исключение:

Traceback (most recent call last):
  File ".\level02.py", line 24, in <module>
    assert big_summa((i for i in range(10)), 1) == 46
  File ".\level02.py", line 8, in big_summa
    sum_item = list(itertools.accumulate(args))[-1]
TypeError: unsupported operand type(s) for +: 'generator' and 'int'

Исключение говорит о том, что сложить генератор и число нельзя.
Не могу разобраться как надо разобрать на составляющие генератор и сложить их с остальными элементами кортежа.
Как новичок, хотел бы попутно узнать какими библиотеками можно руководствоваться при таком типе задач.

Однострочник ))
<code>
def big_summa(*args):
    return sum(big_summa(*a) if hasattr(a, '__iter__') else a for a in args)
</code>
По идее оно должно работать даже при любом уровне вложенности


Почему после вызова функции записывается значение None
Ниже код, реализующий собственный класс Stack и перемещение колец по шпилям (массивам) ханойской башни.
Почему после первого вызова функции move на втором шпиле оказывается None, вместо 'Маленькое кольцо' ? Как это исправить?
<code>
class Stack:
    def __init__(self, name):
        self.stack = []
        self.name = name
        self.index = 0

    def push_(self, string_):
        self.index += 1
        self.stack.insert(self.index, string_)

    def pop_(self):
        if self.index <= 0:
            return print('шпиль пуст, нечего удалять!')
        else:
            self.index -= 1
            print('удаляем верхнее кольцо')
            return self.stack.remove(self.stack[self.index])

def move(source, destination):
    element = source.pop_()
    print(element)
    destination.push_(element)

# Называем шпили и присваиваем им класс Stack
first = Stack('Первый шпиль')
second = Stack('Второй шпиль')
third = Stack('Третий шпиль')

# Заполняем шпиль first
big_ring = 'Большое кольцо'
middle_ring = 'Среднее кольцо'
small_ring = 'Маленькое кольцо'
first.push_(big_ring)
first.push_(middle_ring)
first.push_(small_ring)

print('СТАРТОВОЕ СОСТОЯНИЕ')
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
print('-----------------------------------')

# Решаем задачу
move(first, third)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(first, second)
move(third, second)
move(first, third)
move(second, first)
move(second, third)
move(first, third)

print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
</code>

Попробуйте так:
<code>
class Stack:
    def __init__(self, name):
        self.stack = []
        self.name = name
        self.index = 0

    def push_(self, string_):
        self.index += 1
        self.stack.insert(self.index, string_)

    def pop_(self):
        if self.index <= 0:
            return print('шпиль пуст, нечего удалять!')
        else:
            self.index -= 1
            print('удаляем верхнее кольцо', self.stack[self.index])
#            return self.stack.remove(self.stack[self.index])
            stack_remove = self.stack[self.index]                       # +
            self.stack.remove(stack_remove)                             # +
            return stack_remove                                         # +

def move(source, destination):
    element = source.pop_()
    print(element)
    destination.push_(element)

# Называем шпили и присваиваем им класс Stack
first = Stack('Первый шпиль')
second = Stack('Второй шпиль')
third = Stack('Третий шпиль')

# Заполняем шпиль first
big_ring = 'Большое кольцо'
middle_ring = 'Среднее кольцо'
small_ring = 'Маленькое кольцо'
first.push_(big_ring)
first.push_(middle_ring)
first.push_(small_ring)

print('СТАРТОВОЕ СОСТОЯНИЕ')
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
print('-----------------------------------')

# Решаем задачу
move(first, third)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(first, second)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(third, second)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(first, third)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(second, first)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(second, third)
print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
move(first, third)

print(f'Башня: {first.name}, Содержание {first.stack}')
print(f'Башня: {second.name}, Содержание {second.stack}')
print(f'Башня: {third.name}, Содержание {third.stack}')
</code>


AttributeError: 'str' object has no attribute 'startwith' [закрыт]

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

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

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

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

Нет идей почему это не работает. Пытался перезапустить, менял папку, запускал от администратора, проверил документацию. По-моему все сделал правильно, но все равно не работает.
Python 3.7.6 (CPython). Windows 10
Код:

string = 'Text'

print(string.startwith('Text'))

Traceback:

Traceback (most recent call last):
  File "C:\Users\%USERNAME%\%FOLDER%\%FILENAME%.py", line 3, in <module>
    print(string.startwith('Text'))
AttributeError: 'str' object has no attribute 'startwith'

Между t и w не хватает s -
startswith().


Как правильно реализовать переход по часам, минутам и секундам? Python
<code>
hours = 1
minutes = 1
seconds = 0
t = ((hours * 60) * 60) + (minutes * 60) + seconds
for i in range(t) :
    if seconds < 10 and minutes < 10:
        print(str(hours) + ':0' + str(minutes) + ':0' + str(seconds), end='\r')
    elif seconds > 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':' + str(seconds), end='\r')
    elif seconds > 10 and minutes < 10 :
        print(str(hours) + ':0' + str(minutes) + ':' + str(seconds), end='\r')
    elif seconds < 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':0' + str(seconds), end='\r')
</code>
Как правильно реализовать переход по часам, минутам и секундам?
Пока секунда не станет равна 0, она должна уменьшаться с 59 до 0, далее смена минут и часов, пока все значения не будут равны 0

<code>
import time

hours, minutes, seconds = 1, 1, 1

t = ((hours * 60) * 60) + (minutes * 60) + seconds

while t:
  hours, minutes, seconds = t // 3600, (t % 3600) // 60, (t % 3600) % 60
  print(hours, minutes, seconds)
  t -= 1
  time.sleep(1)
</code>
К сожалению, пока я писал код, в комментариях вам уже подсказали, что нужно делать. Но думаю мои наброски вам не помешают.


Как стереть данные из командной строки и вывести новые во время работы программы Python
Написал таймер :

import time

hours = 3
minutes = 2
seconds = 1

wait_time = ((hours * 60) * 60) + (minutes * 60) + seconds

for i in range(wait_time) :
    if seconds < 10 and minutes < 10:
        print(str(hours) + ':0' + str(minutes) + ':0' + str(seconds))
    elif seconds > 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':' + str(seconds))
    elif seconds > 10 and minutes < 10 :
        print(str(hours) + ':0' + str(minutes) + ':' + str(seconds))
    elif seconds < 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':0' + str(seconds))

    seconds -= 1
    if seconds < 1 :
        seconds = 59
        minutes -= 1
    if minutes < 1 :
        minutes = 59
        hours -= 1
    time.sleep(1)

Вот Вывод :

3:02:01
3:01:59
3:01:58
3:01:57
3:01:56
...

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

Можно так, без дополнительных библиотек. используя
end в
print:

import time

hours = 3
minutes = 2
seconds = 1

wait_time = ((hours * 60) * 60) + (minutes * 60) + seconds

for i in range(wait_time) :
    if seconds < 10 and minutes < 10:
        print(str(hours) + ':0' + str(minutes) + ':0' + str(seconds), end='\r')
    elif seconds > 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':' + str(seconds), end='\r')
    elif seconds > 10 and minutes < 10 :
        print(str(hours) + ':0' + str(minutes) + ':' + str(seconds), end='\r')
    elif seconds < 10 and minutes > 10 :
        print(str(hours) + ':' + str(minutes) + ':0' + str(seconds), end='\r')

    seconds -= 1
    if seconds < 1 :
        seconds = 59
        minutes -= 1
    if minutes < 1 :
        minutes = 59
        hours -= 1
    time.sleep(1)


Как привязать клавиатуру Бота ВК к айди пользователя который её открывает
Я добавил клавиатуру Бота ВК в беседу, но при открытии и закрытии она отрывается и закрывается всем участникам беседы. Как можно привязать клавиатуру к каждому пользователю по отдельности?
Вот код клавиатуры бота:
<code>
    def create_keyboard():
    keyboard = vk_api.keyboard.VkKeyboard(one_time=False)

    keyboard.add_button("Команды", color=vk_api.keyboard.VkKeyboardColor.DEFAULT)
    keyboard.add_button("Закрыть", color=vk_api.keyboard.VkKeyboardColor.POSITIVE)

    keyboard.add_line()
    keyboard.add_button("Реклама", color=vk_api.keyboard.VkKeyboardColor.NEGATIVE)

    keyboard.add_line()
    keyboard.add_button("Админы", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)
    keyboard.add_button("Аниме", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)

    return keyboard.get_keyboard()

def create_empty_keyboard():
    keyboard = vk_api.keyboard.VkKeyboard.get_empty_keyboard()

    return keyboard

    keyboard = create_keyboard()
            empty_keyboard = create_empty_keyboard()

     if response == "йокки привет":
                api.messages.send(chat_id= event.chat_id, message="Приветики", keyboard=keyboard, random_id=0)
     if response[27:34] == "закрыть":
                api.messages.send(peer_id=event.obj.peer_id or event.message.peer_id, message="Закрываем", keyboard=empty_keyboard, random_id=0)
</code>

В беседе привязать клавиатуру к конкретному пользователю невозможно


помогите добавить клавиатуру к вк боту
вот мой код,ни в какую не получаеться добавить клавиатуру
<code>
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.utils import get_random_id
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from vk_api.upload import VkUpload
import Config as Cfg
import os, vk_api, json
import requests

vk_session = vk_api
vk_session = vk_api.VkApi(token=Cfg.token)
longpoll = VkBotLongPoll(vk_session, Cfg.group_id)

def send_message(user_id, msg, attachments):
    vk_session.method('messages.send', {'user_id': user_id,
                                        'random_id': get_random_id(),
                                        'message': msg,
                                        'attachment': attachments,
                                        'keyboard': None})

def on_message(user_id, msg):
    sended = False
    for x in range(1):
        if sended == True:
            break
        if "Привет" == msg:
            send_message(user_id, "привет", None)
            sended = True
        elif "Расписание" == msg :
            os.system(r'schedule.py')
            upload = vk_api.VkUpload(vk_session)
            photo = upload.photo_messages(photos="images/1.jpg")[0]
            attachments = []
            attachments.append('photo{}_{}'.format(photo['owner_id'], photo['id']))
            if os.path.exists(r'images\1.jpg'):
                send_message(user_id,"", attachments)
                path = r'images\1.jpg'
                os.remove(path)
            sended = True
            return attachments
    if sended == False:
        send_message(user_id, Cfg.wrong_text, None)

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:
        on_message(event.obj.from_id, event.obj.text)

    elif event.type == VkBotEventType.GROUP_JOIN:
        send_message(event.obj.user_id, Cfg.welcome_text, None)

    elif event.type == VkBotEventType.GROUP_LEAVE:
        send_message(event.obj.user_id, Cfg.leaving_text, None)
</code>

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

    def create_keyboard():
    keyboard = vk_api.keyboard.VkKeyboard(one_time=False)
    #False Если клавиатура должна оставаться откртой после нажатия на кнопку
    #True если она должна закрваться

    keyboard.add_button("Закрыть", color=vk_api.keyboard.VkKeyboardColor.DEFAULT)
    keyboard.add_button("Кнопка", color=vk_api.keyboard.VkKeyboardColor.POSITIVE)

    keyboard.add_line()#Обозначает добавление новой строки
    keyboard.add_button("Кнопка", color=vk_api.keyboard.VkKeyboardColor.NEGATIVE)

    keyboard.add_line()
    keyboard.add_button("Кнопка", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)
    keyboard.add_button("Кнопка", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)

    return keyboard.get_keyboard()
    #Возвращает клавиатуру

    def create_empty_keyboard():
    keyboard = vk_api.keyboard.VkKeyboard.get_empty_keyboard()

    return keyboard
    #Эта функция используется для закрытия клавиатуры

Прописываем метод

    for event in longpoll.listen():
    if event.type == vk_api.bot_longpoll.VkBotEventType.MESSAGE_NEW:
        try:
            print(event.obj.from_id)
            print("Текст Сообщения: " + str(event.obj.text or event.message.text))
            print('*'* 30)
            response =event.obj.text.casefold() or event.message.text. casefold()
            # не уверен насчёт event.message.text
            keyboard = create_keyboard()
            empty_keyboard = create_empty_keyboard()

После чего прописываем условие, я его прописываю вот так

         if event.from_user:
            if response == "привет":
                api.messages.send(peer_id=event.obj.peer_id or event.message.peer_id, message="Приветики", keyboard=keyboard, random_id=0)
            elif response == "начать":
                api.messages.send(peer_id=event.obj.peer_id or event.message.peer_id, message="Начинаем", keyboard=keyboard, random_id=0)
            elif response == "закрыть":
                api.messages.send(peer_id=event.obj.peer_id or event.message.peer_id, message="Закрываем", keyboard=empty_keyboard, random_id=0)


Как настроить фильтрацию в django-filter?
Не подскажите что мне делать. Умнея есть модель но я не могу её настроить каждый раз когда я её запускаю то у меня выдоёт ошибку. Что это значит и как это повиксить?
Error:

    raise FieldError(
        raise FieldLookupError(model_field, lookup_expr) from e
    django.core.exceptions.FieldError: Unsupported lookup 'icontains' for ForeignKey or join on the field not permitted.
    django_filters.exceptions.FieldLookupError: Unsupported lookup 'icontains' for field 'Realtys.Flats.Citys'.

The above exception was the direct cause of the following exception:

model:

class Citys(models.Model):
    City = models.CharField('Населёный пункт', max_length=200, db_index=True)
    def __str__(self):
        return self.City

    class Meta:
        verbose_name = 'Населёный пункт'
        verbose_name_plural = 'Населёные пункты'

class Flats(models.Model):
    Citys = models.ForeignKey(Citys, on_delete = models.CASCADE)
    Flat = models.CharField('Ктанегория', max_length=200, db_index=True)
    Method = models.CharField('Способ приобретения', max_length=200, db_index=True)
    Addres = models.CharField( 'Адрес', max_length=200)
    Characteristics = models.TextField('Характеристика')
    informa = models.CharField( 'Краткая информация', max_length=200)
    Area = models.DecimalField('Площадь', max_digits = 9,  decimal_places= 2)
    Area_kitchen = models.DecimalField('Площадь кухни', max_digits = 9,  decimal_places= 2)
    Room_Number = models.IntegerField('Количество комнат')
    Price = models.DecimalField('Цена', max_digits = 9,  decimal_places= 2)
    Floor = models.IntegerField('Этаж')
    imgFlat = FilerImageField(null=True, blank=True, related_name="Flats_imgFla", on_delete=models.SET_NULL)
    imgFlats = FilerFolderField(null=True, blank=True, related_name="Flats_imgFl", on_delete=models.SET_NULL)
    def __str__(self):
            return self.Flat

filters:

import django_filters
from .models import Flats, Houses, Plots

class FlatsFilter(django_filters.FilterSet):
    class Meta:
        model = Flats
        fields = {'Citys': ['icontains'],
                  'Flat': ['icontains'],
                  'Method': ['icontains']
                  }

Realtys.Flats.Citys - это связь через PrimaryKey. Это не текст, а число.


Установка и использование SDK в разные версии Python
Установлено две версии python 2.7 и 3.6. Есть SDK которая установлена только в python 2.7. В связи с тем, что 2.7 поддержка закончилась, возникает необходимость установить этот же SDK и в python 3, при этом поддержка SDK в python 2.7 должна остаться. То есть на компе должны быть два питона разных версий в каждом из которых одинаковый SDK.
Исходные данные:
ОС - windows 10. Установка SDK на python 2.7 проводилась батником. Содержимое bat:

pip install --upgrade -f wheelhouse -r file_list.txt

file_list.txt вот такого содержания (строк больше, просто для примера):

wheelhouse/dn_tools-0.0.1-py2-none-any.whl

Стуктура в папке SDK:

/wheelhouse
/wheelhouse_linux
LICENSE
README
install.bat
install.sh
file_list.txt
linux_file_list.txt

В wheelhouse лежат файлы с расширением whl. Путем переименовывания их в zip доступно содержимое.

Под Windows можно использовать утилиту py, которая позволяет выбирать, какой именно интерпретатор Python нужно использовать для указанной далее команды.
То есть для Python 2.7 можно выполнить команду:

py -2.7 -m pip install --upgrade -f wheelhouse -r file_list.txt

А для Python 3.6:

py -3.6 -m pip install --upgrade -f wheelhouse -r file_list.txt


Django 2. Проблема с обновлением страницы после написания комментария
Занимаюсь изучением Django 2 по книге А.Меле "Django 2 в примерах".
Написал код для комментариев под постами в блоге, однако после написания комментария, форма для написания нового комментария не открывается, а при обновлении страницы повторяется тот же комментарий. Сам код:
models.py:

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField(max_length=120)
    email = models.EmailField()
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('created',)

    def __str__(self):
        return 'Comment by {} on {}'.format(self.name, self.post)

views.py:

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                                    status='published',
                                    publish__year=year,
                                    publish__month=month,
                                    publish__day=day)

    comments = post.comments.filter(active=True)
    new_comment = None

    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post = post
            new_comment.save()
    else:
        comment_form = CommentForm()

    return render(request, 'blog/post/detail.html', {'post': post,
                                                      'comments': comments,
                                                      'new_comment': new_comment,
                                                      'comment_form': comment_form})

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

detail.html

    </p>
    {% with comments.count as total_comments %}
        <h2>
            {{ total_comments }} comment {{ total_comments|pluralize }}
        </h2>
    {% endwith %}
    {% for comment in comments %}
        <div class = "comment">
            <p class = "info">
                Comment {{ forloop.counter }} by {{ comment.name }}
                {{ comment.created }}
            </p>
            {{ comment.body|linebreaks }}
        </div>
    {% empty %}
        <p>There are no comments yet.</p>
    {% endfor %}
    {% if new_comment %}
        <h2>Your comment has been added.</h2>
    {% else %}
        <h2>Add a new comment</h2>
        <form action="." method="post">
            {{ comment_form.as_p }}
            {% csrf_token %}
            <p><input type="submit" value="Add comment"></p>
        </form>
    {% endif %}

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

Чтобы форма появлялась после добавления комментария, уберите блок
else из шаблона:

{% if new_comment %}
    <h2>Your comment has been added.</h2>
{% endif %}
    <h2>Add a new comment</h2>
    <form action="." method="post">
        {{ comment_form.as_p }}
        {% csrf_token %}
        <p><input type="submit" value="Add comment"></p>
    </form>

Насчет первой части вопроса, при обновлении страницы введенные данные формы отправляются вновь (Google Chrome, например, запрашивает подтверждение об отправке).


Поменять местами элементы двумерного массива относительно побочной диагонали Python
Программа исправно меняет элементы относительно главной диагонали. Примерно, что она выведет:

1 2 3        1 0 7
0 9 4 вывод: 2 9 6
7 6 5        3 4 5

Когда пользователь введет: 2, программа должна тоже самое сделать, но уже через побочную диагональ

n = int(input())
diagonal = int(input())
A = [[1,2,3],[0,9,4],[7,6,5]]
#for i in range(n):
#    row = input().split()
#    for i in range(len(row)):
#        row[i] = int(row[i])
#    A.append(row)
print(A)
if diagonal == 1:
    for i in range(n):
            for j in range(n):
                if i < j:
                    A[i][j],A[j][i] = A[j][i],A[i][j]
    print(A)
if diagonal == 2:
    for i in range(n):
        if i < n - 1:
            for j in range(n):
                if j < n - i:
                    print(A[i][j])
                    A[i][j],A[j][i] = A[j][i],A[i][j]
    print(A)

Я закомментировал строки ввода матрицы, для удобства. Матрица квадратная, пользователь сам выбирает NxN. Функция Print в условие побочной диагонали дана для вывода тех элементов, что находятся выше побочной диагонали.
Прошу сильно не критиковать, изучаю основы, и решаю каждый день задачи по питону, нарешал чисел, строк, обыкновенных массивов, но вот с двумерными, застрял почему-то. Спасибо за понимание

Код полностью такой же как и в первом случае, только меняешь другие элементы и по условию отзеркаленному в одну сторону
<code>
for i in range(n):
    for j in range(n):
        if n-1-i < j:
            A[i][j],A[n-1-j][n-1-i] = A[n-1-j][n-1-i],A[i][j]
</code>
< или > - значения не имеет.
n-1-i - в условии задает проход в обратном порядке: 2,1,0 . Иногда это переносят в цикл как range(n-1,-1,-1)
А дальше смотри какие элементы менять местами..


В DRF при серилизации вместо foreignkey возвращать связанное имя. И не в кортеже
Пример:
models.py:

class Service(models.Model):
    serviceName = models.CharField(max_length=64)

    def __str__(self):
        return self.serviceName

class Office(models.Model):
    officeName = models.CharField(max_length=64)

    def __str__(self):
        return self.officeName

class SendNotification(models.Model):
    office = models.ForeignKey(Office, related_name='notify', on_delete=models.CASCADE)
    service = models.ForeignKey(Service, related_name='notify', on_delete=models.CASCADE)
    notificationName = models.CharField(max_length=256)
    eventdatetime = models.DateTimeField()
    success = models.BooleanField()

    def __str__(self):
        return self.notificationName

serializers.py:

class OfficeSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Office
        fields = ['officeName']

class ServiceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Service
        fields = ['serviceName']

class SendNotificationSerializer(serializers.HyperlinkedModelSerializer):
    office= OfficeSerializer(read_only=True)
    service = ServiceSerializer(read_only=True)
    class Meta:
        model = BackupNotification
        fields = ['office', 'service', 'notificationName ', 'eventdatetime', 'success']

При get по /v1/api/notify/
Я получаю такую картину:

{
    "notify": [
        {
            "office": {
                "officeName": "Тестовый"
            },
            "service": {
                "serviceName": "Тестовая"
            },
            "backupName": "Тестовый сообщение",
            "eventdatetime": "2020-01-15T20:00:09Z",
            "success": true
        }
}

Вопрос в том, можно ли возвращать вместо массива в значении service или office обычный текст?

class SendNotificationSerializer(serializers.HyperlinkedModelSerializer):
    office= serializers.CharField(source='office.officeName')
    service = serializers.CharField(source='service.serviceName')
    class Meta:
        model = BackupNotification
        fields = ['office', 'service', 'notificationName ', 'eventdatetime', 'success']


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

Чтобы читать файл в нужной вам кодировке, нужно указать ее, скорее всего это
utf-8

file = open("text.txt", "r", encoding="utf-8")


Ошибка UnboundLocalError: local variable 'Money' referenced before assignment BeautifulSoup
Не могу понять как исправить ошибку в последнем блоке при
pricelist.append
Пример ошибки:

Traceback (most recent call last):
line 141, in <module>
pricelist = BB_parse(base_url, headers)
line 104, in BB_parse
'Money1': Money,
UnboundLocalError: local variable 'Money' referenced before assignment

Мой код:

    for page_book in page_books:
        request = session.get(page_book, headers = headers)
        soup = bs(request.content, 'lxml')
        container_main = soup.find_all('div', {'class': 'content-wrapper'})
        for c1 in container_main:
            try:
                article = c1.find('div', {'class': 'article'}).text.strip().replace("Артикул: ", "")
                name = c1.select('h1')[0].text
                description = c1.find('div', {'class': 'description'}).text.strip()
                available = c1.find('div', {'class': 'avl'}).text.strip()
                Money = c1.find('span', {'class': 'catalog-detail-item-price' }).text.replace("Цена:", "").replace("тг.", "").replace("за шт", "").strip()
                oldprice = c1.find('span', {'class': 'catalog-detail-item-price-old' }).text.replace("Цена:", "").replace("тг.", "").replace("за шт", "").replace(" ", "").strip()
                #economy = c1.find('span', {'class': 'catalog-detail-item-price-percent' }).text.replace("Экономия", "").replace("тг.", "").strip()
                Category1 = c1.find_all('span', {'itemprop': 'title'})[1].text
                Category2 = c1.find_all('span', {'itemprop': 'title'})[2].text
                Category3 = c1.find_all('span', {'itemprop': 'title'})[3].text
                catalog_detail_pictures = c1.find_all('div', {'class': 'catalog-detail-pictures'})
                image1 = c1.find_all('a', {'rel': 'lightbox'})[0]['href']
                image2 = c1.find_all('a', {'rel': 'lightbox'})[1]['href']
                image3 = c1.find_all('a', {'rel': 'lightbox'})[2]['href']
            except:
                pass

            for count, tag in enumerate(soup.find_all(class_='name')):
                try:
                    if tag.text == 'ISBN':
                       code = soup.find_all(class_='val')[count].text
                    if tag.text == 'Издательство':
                       Publish = soup.find_all(class_='val')[count].text
                    if tag.text == 'Авторы':
                       Authors = soup.find_all(class_='val')[count].text
                    if tag.text == 'Серия':
                       Series = soup.find_all(class_='val')[count].text
                    if tag.text == 'Переплет':
                       Blinding = soup.find_all(class_='val')[count].text
                    if tag.text == 'Количество страниц':
                       Count_Page = soup.find_all(class_='val')[count].text
                    if tag.text == 'Ширина':
                       Width = soup.find_all(class_='val')[count].text
                    if tag.text == 'Высота':
                       Height = soup.find_all(class_='val')[count].text
                    if tag.text == 'Дата последнего тиража':
                       Date = soup.find_all(class_='val')[count].text

                except:
                  pass

            pricelist.append({
                     'name': name,
                     'article': article,
                     'Money1': Money,
                     'oldprice': oldprice,
                     'code': code,
                     'Publish': Publish,
                     'Authors': Authors,
                     'Series': Series,
                     'Blinding': Blinding,
                     'Count_Page': Count_Page,
                     'Width': Width,
                     'Height': Height,
                     'Date': Date,
                     'Category1': Category1,
                     'Category2': Category2,
                     'Category3': Category3,
                     'image1': image1,
                     'image2': image2,
                     'image3': image3
                })

        print(len(pricelist))

    else:
        print('ERROR or Done. Status_code = ' + str(request.status_code))

    return pricelist

def files_writer(pricelist):
    with open('Book24.csv', 'w') as file:
        a_lol = csv.writer(file)
        a_lol.writerow(('Наименование', 'Артикул', 'Цена', 'Старая цена', 'Код ISBN', 'Издательство', 'Авторы', 'Серия', 'Переплет', 'Количество страниц', 'Ширина', 'Высота', 'Дата последнего тиража', 'Родительская категория', 'Категория', 'Подкатегория', 'Картикнка_1', 'Картикнка_2', 'Картикнка_3'))
        for RF in pricelist:
            a_lol.writerow((RF['name'], RF['article'], RF['Money1'], RF['oldprice'], RF['code'], RF['Publish'], RF['Authors'], RF['Series'], RF['Blinding'], RF['Count_Page'], RF['Width'], RF['Height'], RF['Date'], RF['Category1'], RF['Category2'], RF['Category3'], RF['image1'], RF['image2'], RF['image3']))

pricelist = BB_parse(base_url, headers)
files_writer(pricelist)

Прежде, чем работать с
Money вам надо ее проинициализировать.
Так как в цикле в конструкции
try-catch у вас не выполняется инициализации переменной (потому что
try не сработал), то при
pricelist.append за циклом питон не знает, что это за переменная


Почему не срабатывает код при некоторых значениях пин?
Всем здравствуйте, я новичок здесь.
Хотелось бы спросить, почему такой код не работает при например
pin = "a234" или
pin = "-111"
И как это исправить, заранее спасибо!
Сам код:

def validate_pin(pin):
a = len(pin)
if (a == 4 or a == 6 and pin.isdigit()):
    return True
else:
    return False

Расставьте скобки. Сейчас проверяется не совсем то, что нужно:

if ((a == 4 or a == 6) and pin.isdigit()):

Что было: сначала проверялось, равна ли длина pin четырем символам. Т.к. и у
а234 и у
-111 длина равна четыре символа, то условие удовлетворено, и дальнейшие проверки не делались (поскольку
or). В этом легко убедиться, поменяв местами
a == 4 и
a == 6 в исходном коде. Результат будет отличаться, поскольку первая проверка будет на длину в шесть символов.
Было: pin из четырех символов (любых) ИЛИ (пин из шести символов и только и цифр).
Стало: (pin из 4 или из 6 символов) И только из цифр.


Вычислить значение функции на заданном интервале в Python [закрыт]

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

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

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

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

Стоит задача написать программу на языке Python для вычисления 8-ми значений функции y =    3.14 * (x^3 - 6x^2)^1/3 на заданном интервале x от -3 до 8. Контрольные значения: x = 3.0; y = -9.4.
Подскажите решение с объяснением, если можно :)


Telegram бот 'слушающий' Чат в котором бот администратор
Есть телеграм канал (Чат), в котором бот, написанный на языке python, администратор.
При появлении не желаемого сообщения в Чате (например адрес сайта), бот должен удалить сообщение. Но для этого нужно знать когда появляется сообщения в канале и его
message_id.
Как это можно сделать?

Если используете pyTelegramBotAPI
То можно получать текст каждого сообщения и при помощи какого нибудь регулярного выражения искать в них адреса сайтов и после этого уже удалять сообщение.
Если не ошибаюсь есть функция
<code>
bot.delete_message(message.chat.id, message.message_id)
</code>


Как правильно прописать команду закрытия клавиатуры Бота Вконтакте
Написал код клавиатуры, все команды работают, но не могу никак прописать команду закрытия. Лазил по интернету ничего дельного не нашел, решил спросить у вас.
Вот код клавиатуры
<code>
from vk_api.keyboard import VkKeyboard, VkKeyboardColor

def create_keyboard():
    keyboard = vk_api.keyboard.VkKeyboard(one_time=False)

    keyboard.add_button("Команды", color=vk_api.keyboard.VkKeyboardColor.DEFAULT)
    keyboard.add_button("0", color=vk_api.keyboard.VkKeyboardColor.POSITIVE)

    keyboard.add_line()
    keyboard.add_button("Реклама", color=vk_api.keyboard.VkKeyboardColor.NEGATIVE)

    keyboard.add_line()
    keyboard.add_button("Админы", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)
    keyboard.add_button("Аниме", color=vk_api.keyboard.VkKeyboardColor.PRIMARY)

    return keyboard.get_keyboard()
</code>

Из документации:

Чтобы убрать у пользователя клавиатуру, необходимо отправить сообщение с пустым параметром buttons:

{"buttons":[],"one_time":true}

Чтобы получить пустую клавиатуру, воспользуйтесь методом
VkKeyboard.get_empty_keyboard().


Объединение http-запросов в батч
Использую aiohttp и хочу объединять все входящие запросы в сервис в батч.
Например, летит 100 запросов в сервис, я их хчоу объединить в 10 батчей по 10 запросов в каждом и отдаю на дальнейшую обработку.
Kак это можно реализовать?
Вот примерный алгоритм работы, который я представляю:
handler.py:

this = {
    'status': False,
    'data': request_data,
    'response': '',
}

request.app['requests'][request_id] = this  # записали реквест в словарь

if len(request.app['requests']) == BATCH_SIZE:  # заполнили батч
    logging.info('Here!')
    await processing(request.app['requests'])  # обработка, которая меняет 'status' на True
else:
    while not request.app['requests'][request_id]['status']:  # пока статус False ждем
        pass

По идее, первый запрос падает в батч, второй тоже, третий падает в батч и запускает обработку. После обработки все три запроса отдают свои ответы.
На практике первый запрос падает в батч, печатается
Here! и все. При отправке третьего запроса я повисаю в ожидании.

Переделал через Future, как писал @andreymal и все заработало.
Вот примерный код:
handler.py

......................
fut = asyncio.Future()
await request.app['storage'].put_to_storage(
    (fut, request_data),
)
response_data = await fut

Как только хранилище заполняется, выполняется его обработка:

async def process_storage(self, recreate=True):
    if not self.empty():
        await processing(self.storage)
    if recreate:
        self.create_new_storage()

Обработка данных:

async def processing(data: list):
    """Обработка батча из запросов в сервис."""
    ........
    # Кладем результат обработки данных в Future объект
    data[0].set_result(result)


Не получается удалить повторы из списка
Мне нужно удалить повторы названий процессов в списке который я получаю через
os.popen("wmic process get name").read().split(), я сонный и может просто не вижу чего то элементарного?

process_list = os.popen("wmic process get name").read().split()

current_id = 0
for current_process in process_list:
    try:
        current_id += 1
        print(current_process)
        if current_process == process_list[current_id]:
            print("Oops!")
            process_list.remove(current_process)

    except IndexError:
        pass

print(process_list)

Пытался удаление через индекс сначала, потом сделал этот. Эффект был должен был одинаковым - все повторы удались и оставили только один результат, но показали одинаковый - только с повторами)

Не стоит при итерации цикла удалять из него элементы. Лучше составьте новый список, например:

import os

process_list = []

for current_process in os.popen("wmic process get name"):
    current_process = current_process.strip()
    if current_process not in process_list:
        process_list.append(current_process)

print(process_list)

В одну строку:

process_list = list({p.strip() for p in os.popen("wmic process get name")})

PS.

strip() нужен для удаления пробелов и символов перевода на новую строку, например имя процесса
'wininit.exe                    \n' станет
'wininit.exe'


Как перенести кодирующую функцию из js в python 3?
Имеется функция:
<code>
function Signature(value) {
  var hash = CryptoJS.SHA256(value);
  return (hash.toString(CryptoJS.enc.Base64));
}
</code>
Нужно перенести её в python 3. Много гуглил но так ничего и не нашел. Буду сильно рад вашей помощи, заранее спасибо.

import hashlib
import base64

def signature(value):
    return base64.b64encode(hashlib.sha256(value.encode('utf-8')).digest())

signature('message')
# b'q1MKE+RZFJgrefm34/uplM/R8/si9xzqGvvwK0YMbR0='

signature('message').decode('utf-8')
# 'q1MKE+RZFJgrefm34/uplM/R8/si9xzqGvvwK0YMbR0='


Не открывает файл для чтения - Python
Делаю, как в уроке, но файл не находит. Подскажите пожалуйста, где ошибка.
Как сделать, чтобы файл открывался по указанному пути?
<code>
handle = open("M:\zDownloads\numbers.txt", "r")
for line in handle:
    print(line)
handle.close()

handle = open("C:\numbers.txt", "r")
for line in handle:
    print(line)
handle.close()
</code>

Необходимо перед каждой строкой пути поставить
r (raw).
r"M:\zDownloads\numbers.txt", либо самому экранировать все спец. символы, типа
"\n":
"M:\zDownloads\\numbers.txt".

Строка
"M:\zDownloads\numbers.txt" воспринимается, как:

"M:\zDownloads" + перенос_строки + "umbers.txt"


Как получить данные из другого DataFrame по условию?
У меня есть 2 фрейма:
SpendDF и
MainDF, у которых два общих поля:
ad_id и
Date.
В фрейме
SpendDF есть поле
spend, которое нужно сопоставить всем строчкам из
MainDF, у которых происходит совпадение этих двух общих полeй. В фрейме
MainDF может быть несколько строчек с одинаковыми
ad_id и
Date и у них должны быть одинаковые значения
spend.

SpendDF
               Date  campaign     ad_id  spend
    0  11-02-19  11484480  32631604  49.18
    1  11-02-19  11484485  32631612  33.19
    2  11-02-19  11484611  32631778   2.52
    3  11-02-19  11487692  32636729   7.08
    4  11-02-19  11487692  32636730   7.47
MainDF
             Date Campaign    id     ad_id   os  Installs   app
    0  2019-03-01      MSK  1190  36296008  ios       0.0  real
    1  2019-03-01      MSK  1190  36296013  serv       0.0  real
    2  2019-03-01      MSK  1190  36296013  ios       0.0  real
    3  2019-03-01      MSK  1190  36296022  ios       0.0  real
    4  2019-03-01      MSK  1190  36296023  ios       0.0  real

Там достаточно болшие фреймы, они не отсортированы, но все
ad_id и
Date из первого присутствуют во втором в нескольких вариантах (тут видно
serv и следующий за ним
ios).
Я использую:

ResultDF = MainDF.merge(SpendDF[['ad_id','Date','spend']],on=['ad_id','Date'],how='inner')

Но в итоге получаю пустой фрейм. А если использую:

ResultDF = MainDF.merge(SpendDF[['ad_id','Date','spend']],on='ad_id',how='inner')

, то получаю:

        Date_x Campaign     ad_id   os  Installs   app    Date_y  spend
0   2019-03-01      MSK  36374447  ios       0.0  real  11-02-19   1.14
1   2019-03-01      MSK  36374447  ios       0.0  real  12-02-19   1.94
2   2019-03-01      MSK  36374447  ios       0.0  real  13-02-19   2.09
3   2019-03-01      MSK  36374447  ios       0.0  real  14-02-19   1.60
4   2019-03-01      MSK  36374447  ios       0.0  real  15-02-19   1.29
5   2019-03-01      MSK  36374447  ios       0.0  real  16-02-19   3.22
6   2019-03-01      MSK  36374447  ios       0.0  real  17-02-19   4.26
7   2019-03-01      MSK  36374453  ios       0.0  real  11-02-19   3.79
8   2019-03-01      MSK  36374453  ios       0.0  real  12-02-19   2.49
9   2019-03-01      MSK  36374453  ios       0.0  real  13-02-19   4.21
10  2019-03-01      MSK  36374453  ios       0.0  real  14-02-19   6.26
11  2019-03-01      MSK  36374453  ios       0.0  real  15-02-19   7.38
12  2019-03-01      MSK  36374453  ios       0.0  real  16-02-19   9.87

Скорее всего у вас не совпадают типы данных в столбце "Date" - в одном DF тип столбца
object, а в другом -
datetime. Убедитесь что в обоих фреймах у столбцов, по которым идет объединение одинаковые типы данных.
Чтобы проверить тип данных всех столбцов DF:

print(df.dtypes)

Чтобы преобразовать строковые значения в
datetime:

df["Date"] = pd.to_datetime(df["Date"], errors="coerce")


Задача: преобразование строки из верблюжьего регистра в змеиный
Нужно преобразовать строку из верблюжьего регистра в змеиный, добавить возможность менять разделитель.
Я решил задачу, но хотел бы узнать каким способом правильнее ее решить.
<code>
def camel_to_snake(str, sep=' '):
    snake_register = ''
    for i in str:
        if i.isupper():
            snake_register += sep + i.lower()
        else:
            snake_register += i
    print(snake_register.lstrip(sep))

camel_register = 'ThisIsCamelCased'
camel_to_snake(camel_register, '_')
</code>

Так, в копилку добавлю:
<code>
import re
a = "ThisIsCamelCaseExample"
b=list(a)
[b.insert(x,'_') for x in [m.start() for m in re.finditer("[A-Z]",a)][:0:-1]]
res = ''.join(b).lower()
print(res)
</code>
this_is_camel_case_example


Как вернуть все объекты класса?
Нужно, чтобы класс мог вернуть все созданные объект этого класса. Можно статическим методом или обычным.
Допустим, есть класс:
<code>
class A ():
    def __init__(self):
        pass
    def GetAllObject(self):
        #Код, который вернет все объекты
        return list_object
</code>

Один из способов - добавлять self в статический список класса, однако для сборщика мусора нужно не забыть использовать weakref:

import weakref

class A:
    instance_list = list()

    def __init__(self):
        self.__class__.instance_list.append(weakref.proxy(self))

    def GetAllObjects(self):
        return A.instance_list

obj1 = A()
obj2 = A()

print(A.instance_list)
# [<__main__.A object at 0x000002085E8793C8>, <__main__.A object at 0x000002085E8790B8>]
print(obj1.GetAllObjects())
# [<__main__.A object at 0x000002085E8793C8>, <__main__.A object at 0x000002085E8790B8>]

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

Намного более медленный способ - пройтись по всем объектам сборщика мусора и найти объекты нужного типа:

import gc

def GetObjectsOfType(type):
    objects_list = list()
    for obj in gc.get_objects():
        if isinstance(obj, type):
            objects_list.append(obj)
    return objects_list

class A:
    def __init__(self):
        pass

obj1 = A()
obj2 = A()

print(GetObjectsOfType(A))


Обработка исключений на этапе импорта python 2.7, 3.6
Есть некий код, в котором используются zip и zip_longest из itertools в обработке списков.
Проблема заключается в следующем, этот код должен работать как на Python 2.7 (знаю что уже не поддерживается), так и на 3.6.
Но для python 2.7 нет функций zip и zip_longest, но есть izip и izip_longest.Для "универсальности" импортирую функции вот таким образом:
<code>
# import izip_longest for python2.7:
try:
    from itertools import izip_longest as zip_longest
except:
    pass

# import zip_longest for python 3.6:
try:
    from itertools import zip_longest
except:
    pass

value_1 = ["A", "B", "C", "D"]
value_2 = ["a", "b", "e"]
result = list(zip_longest(value_1, value_2))
print (result)
</code>
В PyCharm проверяю работоспособность кода, меняя интерпретатор - код работает.Ошибок не возникает.
Корректно ли так делать импорт?
Какие проблемы могут при этом возникнуть?

Я думаю что лучше будет так
<code>
import sys

if sys.version_info.major == 3:
    from itertools import zip_longest
else:
    from itertools import izip_longest as zip_longest
</code>


Запись приём без повторений в django
Делаю сайт парикмахерской. Я хочу, для начала, сделать так, что бы у меня была одна запись в день, но я не совсем понимаю, как это сделать.
В views.py  у меня

def landing(request, id):
  master = get_object_or_404(Master, id=id)
  if request.method=="POST":
      form=SubscriberForm(request.POST)
      if form.is_valid():
          data = form.save(commit=False)
          landing.master = master
          data.save()
          return redirect('master', id=master.id)
  else:
      form=SubscriberForm()
  return render(request, 'landing/landing.html', {'form': form})

вот класс в models.py

class Subscriber(models.Model):
  email = models.EmailField()
  name = models.CharField(max_length=155)
  date = models.DateTimeField(u'Дата и время',default=timezone.now)

Подскажите, что делать дальше?

Можно переписать метод сохранения объекта добавив к нему проверку нужных параметров:
<code>
class Subscriber(models.Model):
    date = models.DateTimeField(u'Дата и время', default=timezone.now)
    ...

    def save(self, *args, **kwargs):
        q = Subscriber.objects.filter(
            date__year=self.date.year,
            date__month=self.date.month,
            date__day=self.date.day
        )
        if q.exists() > 0:
            raise ValueError('Cannot create new event on the same date!')
        else:
            super(Subscriber, self).save(*args, **kwargs)
</code>
Ошибку в таком случае стоит ловить и адекватно обрабатывать.


timedelta неправильно считает [закрыт]

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

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

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

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

Есть такой код
<code>
def late(now, classes, bus):
    now = now.split(':')
    now = timedelta(days=0, hours=int(now[0]), minutes=int(now[1]) + 5)
    classes = classes.split(':')
    classes = timedelta(hours=int(classes[0]), minutes=int(classes[1]))
    for i in bus:
        times = now + timedelta(minutes=15)
        print(times)
        if times < classes:
            return f'Выйти через {i} минут'
    return 'Опаздание'

print(late('12:00', '12:40', [0, 1, 4, 6, 25]))
</code>
Снизу пример, он считает успеешь ли ты до школы. Первое это сколько сейчас времени. Второй параметр это время начала уроков. Третий это через сколько приедет автобус(в минутах). При этом чтобы выйти нужно 5 минут и чтобы доехать 15. Все идеально но timedelta считает в pm, а не в am. Как можно дополнить код, чтобы timedelta считал правильно.

Переписать код, чтобы не извращаться, а использовать
timedelta по назначению:

import datetime as dt

def to_datetime(str_time):
    t = str_time.split(':')
    return dt.datetime.combine(dt.date.today(), dt.time(int(t[0]), int(t[1])))

def late(now, classes, bus):
    now = to_datetime(now) + dt.timedelta(minutes=5)
    classes = to_datetime(classes)
    for i in bus:
        times = now + dt.timedelta(minutes=15)
        if times < classes:
            return f'Выйти через {i} минут'
    return 'Опоздание'

print(late('12:00', '12:40', [0, 1, 4, 6, 25]))
# 'Выйти через 0 минут'


Как правильно создать массив на основании DataFrame?
У меня есть DataFrame. Вот пример:

0    457.33402
1    424.44000
2    394.79599
3    408.90399
4    398.82101
5    402.15201
6    435.79098
7    423.20499
8    411.57400
9    404.42499
10   399.51999
11   377.18100
12   375.46701
13   386.94400
14   383.61499
15   375.07199
16   359.51199
17   328.86600
18   320.51001
19   330.07901
Name: Adj Close, dtype: float64

Я хочу пройтись по нему и создать массив данных, таким образом, чтобы взять значение и к нему добавить
n значений, которые идут после него. Например:

[[457.33402, 424.44000, 394.79599], [424.44000, 394.79599, 408.90399], ...
[328.86600, 320.51001, 330.07901]]

Делаю это вот так:

quotes = []
for i in df.values:
    s = df[i:i+30].values
    quotes.append(s)

При выполнении кода, получаю ошибку:

TypeError: cannot do slice indexing on <class 'pandas.core.indexes.range.RangeIndex'> with these indexers [457.334015] of <class 'numpy.float64'>

Я использовал
iloc, но ошибка не пропала.
Как правильно сделать то, что я хочу?

У вас i это значение, а не индекс записи. Нужно так:
<code>
quotes = []
for num, i in df.items():
    s = df[num:num+30].tolist()
    quotes.append(s)
</code>
И это Series, а не DataFrame.


Как правильно поставить timeout для пула соединений?
Имеется модуль подключения к БД, пул соединений работает отлично.
Единственный минус - проблема с сетевой связностью. Пока она решается, надо при зависании соединения обрывать его. Сейчас на каком-то запросе сессия может просто зависнуть, и не понятно, пытается ли она так долго подключиться или долго получает данные или еще что-to.
Как правильно поставить timeout для пула соединений?
Сам пул (pool_oracl.py):

from contextlib import contextmanager
from cx_Oracle import SessionPool

class OraPool:
    def __init__(self, pool_cfg):
        self.conn_pool = SessionPool(pool_cfg['USER'], pool_cfg['PASS'], pool_cfg['DSN'], pool_cfg['POOL_INIT_SIZE'],
                                     pool_cfg['POOL_MAX_SIZE'], increment=1)

    @contextmanager
    def connect(self):
        con = self.conn_pool.acquire()
        try:
            yield con
            con.commit()
        finally:
            self.conn_pool.release(con)

Вызов подключения:

from pool_oracl import OraPool

pool = OraPool(..)
with pool.connect() as con:
    conn.cursor...
....

Начиная с версии 18c (cx_Oracle 7.0) можно задать макс. время выполнения запроса для соединения значением атрибута Connection.callTimeout.
Воспроизводимый пример:

from cx_Oracle import SessionPool
import threading
from datetime import datetime as dt

pool = SessionPool('iam', 'pass', 'srv/svc', 1, 3, 1, threaded=True)

def longOp (tim, timeout):
    with pool.acquire() as conn:
        conn.callTimeout = timeout*1000
        cur = conn.cursor()
        st = dt.now ()
        print (dt.now ()-st, f"starting longop {tim} sec ...")
        try:
            cur.callproc ("dbms_session.sleep", (tim,))
        except Exception as e:
            print (dt.now ()-st, e)
        print (dt.now ()-st, "finished longop")

thd = threading.Thread (target=longOp, args=(10,3))
thd.start ()
thd.join ()

Вывод:

0:00:00.000010 starting longop 10 sec ...
0:00:03.007227 ORA-03156: OCI call timed out
0:00:03.007379 finished longop


Как вывести значение среди множества одинаковых классов beautifulsoup
Возможно сможет кто подсказать, как вытащить (print) только одну характеристику?
Например только ISBN (978-5-17-115171-3).

Характеристики

                            Возрастное ограничение
                            12+

                            ISBN
                            978-5-17-115171-3

                            Издательство
                            АСТ

                            Авторы
                            Пушкин Александр Сергеевич

                            Серия
                            Лучшая мировая классика

                            Переплет
                            Твердый

                            Вес
                            0.299

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

Используйте find_all чтоб найти все элементы, которые будут в виде списка, выберите нужный элемент, потом используйте метод text чтобы достать текст.
main.py

from bs4 import BeautifulSoup

with open('some.txt', 'r') as html:
    soup = BeautifulSoup(html, 'html.parser')

    print(soup.find_all(class_='name')[1].text)  #ISBN
    print(soup.find_all(class_='val')[1].text)  #978-5-17-115171-3

some.txt -> html из вопроса
UDP, если неизвестно заранее, где находится нужная часть:

word = 'ISBN'

for count, tag in enumerate(soup.find_all(class_='name')):
   print(soup.find_all(class_='val')[count].text if tag.text == 'ISBN' else 0) #978-5-17-115171-3

UDP2,

for count, tag in enumerate(soup.find_all(class_='name')):
    if tag.text == 'ISBN':
       vol = soup.find_all(class_='val')[count].text


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

test_l = [
          ('res10', 1, '2'),
          ('res2', 3, '4'),
          ('res4', 12, '1'),
          ('res10', 2, '1'),
          ('res2', 3, '4'),
          ('res5', 1, '5')
         ]

Нужно:

Выбрать одинаковые элементы по названию (1 колонка)
У одинаковых элементов просуммировать количество (2 колонка)
У одинаковых элементов склеить номер заявки из 3 колонки к виду '1, 2, 3'

Я делаю это следующим образом:

test_l.sort()  # сортирую по названию

test_2 = []  # массив для готовых данных

for ind_unit, unit in enumerate(test_l):
    incr: int = 1
    count: int = unit[1]
    request: str = unit[2]

    # проверка на последний элемент, чтобы выйти из цикла,
    # если он не повторяется
    if ind_unit + 1 == len(test_l):
        test_2.append((unit[0], count, request))
        break

    # цикл, проходящий по всем повторяющимся элементам
    while unit[0] == test_l[ind_unit + incr][0]:
        count += test_l[ind_unit + incr][1]
        request += ', ' + test_l[ind_unit + incr][2]
        incr += 1

    # добавление в итоговый массив просуммированного элемента
    if ind_unit == 0 or unit[0] != test_l[ind_unit - incr][0]:
        test_2.append((unit[0], count, request))

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

from itertools import groupby

data = [
          ('res10', 1, '2'),
          ('res2', 3, '4'),
          ('res4', 12, '1'),
          ('res10', 2, '1'),
          ('res2', 3, '4'),
          ('res5', 1, '5')
         ]

data = sorted(data)

res = []

for (key, group) in groupby(data, key=lambda x: x[0]):
    value = 0
    nums = []
    for elem in group:
        value += elem[1]
        nums.append(elem[2])
    item = (key, value, ', '.join(sorted(nums)))
    res.append(item)

print(res)


Моя первая программа, просьба указать явные ошибки и как можно укоротить код [закрыт]

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

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

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

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

<code>
import re

print ("Проверка имени и возраста(18+) \n")

#Проверка имени
name = None
while name is None:
    name = input (str("Введите имя :\n")).capitalize()
    if not re.findall('[\d]', name) and name.isalpha() and len(name) <=11 :
        print ('Проверка имени успешно завершена')
    else:
        name = None
        print ("Ошибка! Нельзя использовать цифры или спец символы, ограничение длины не больше 10 символов")
        continue

#Проверка возраста
age = None
while age is None :
    ager = input("Введите возраст :\n")
    try:
        age = int(ager)
    except ValueError:
        print("Ошибка! Используйте пожалуйста цифры")
        continue
    if age > 99 or age < 18:
        print ("Ошибка! Вам нет 18 лет или вам больше 99 лет")
        age = None
        continue
    if len(ager) >=3:
        print ("Ошибка! Вам нет 18 лет или вам больше 99 лет")
        age = None
        continue
    else:
        print ('Проверка возраста успешно завершена')

print (f"Вас зовут {name}, и вам {ager}")

input("Для завершения программы нажмите ENTER")
</code>

Можно убрать лишнюю переменную
ager и делать проверку на число
age = int(input("Введите возраст :\n"))
Код всей программы:

print ("Проверка имени и возраста(18+)\n")

#Проверка имени
name = None
while name is None:
    name = input("Введите имя :\n").capitalize()
    if name.isalpha() and len(name) <=10 :
        print ('Проверка имени успешно завершена')
    else:
        name = None
        print ("Ошибка! Нельзя использовать цифры или спец символы, ограничение длины не больше 10 символов")
        continue

#Проверка возраста
age = None
while age is None :
    try:
        age = int(input("Введите возраст :\n"))
    except ValueError:
        age = None
        print("Ошибка! Используйте пожалуйста цифры")
        continue
    if age > 99 or age < 18:
        print ("Ошибка! Вам нет 18 лет или вам больше 99 лет")
        age = None
        continue
    else:
        print ('Проверка возраста успешно завершена')

print (f"Вас зовут {name}, и вам {age}")
input("Для завершения программы нажмите ENTER")


Почему "not in" не работает в моем коде Python?
<code>
Pр = [69.52, 54.9, 4.4, 0, 58.15, 71.57, 54.9, 1, 3.5, 58.15, 11, 11, 4.95, 10.84, 14.7, 7.86, 23.7]
Список_количества_квартир = [26, 18, 0, 0, 0, 27, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Список_имен_панелей = ["ЩЭ", "ЩЭ", "БАУО", "Резерв", "АВР-1", "ЩЭ", "ЩЭ", "ЩУ1", "ЩС-Т1", "АВР-1", "ШУЛ-1", "ШУЛ-2", "БАУО", "ЩС-ДУ1", "ЩС-Н1", "ЩУ-Пн", "КРМ"]
Не_учитывается = [0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]

Pр_Аварийная = []
for n in range(len(Pр)):
    if Список_количества_квартир[n] == 0 and Не_учитывается[n] == 0 and "ЩС-ДУ" not in Список_имен_панелей[n] or "ЩС-Пн" not in Список_имен_панелей[n] or "ЩУ-Пн" not in Список_имен_панелей[n] or "JET" not in Список_имен_панелей[n] or "ШУЛ" not in Список_имен_панелей[n] or "ЩУЛ" not in Список_имен_панелей[n]: Pр_Аварийная.append(Pр[n])
    else: pass

print(Pр_Аварийная)
</code>
Результат: [69.52, 54.9, 4.4, 0, 58.15, 71.57, 54.9, 1, 3.5, 58.15, 11, 11, 4.95, 10.84, 14.7, 7.86, 23.7]
Хотя должен быть: [4.4, 1, 3.5, 4.95, 14.7]

Потому что вы неверно составили условие.
У вас
A and B or C1 or C2...
Нужно
A and B and (C1 or C2 or...)
Думаю есть проблема с семантикой. Скорее всего вы имели в виду такое

badList=["Щупн", "JET",...]

Далее в условии

A and B and Список_имен_панелей[n] not in badList

Основная проблема в непонимании логических операций
А and В - логическое И, истинно когда оба истинны
А or B - логическое ИЛИ, истинно когда хотя бы одно истинно.
Поэтому когда вы пишите A and B and (C or D), то условие выполнится, если хотя бы одно из С или D истинно.


Сочетание строки с числом - ошибка
У меня есть код. С виду идентичный, но я получаю ошибку. Кто может сказать почему?
Даже, если я в возрасте введу float, то ошибки не будет. А в процентах она есть.
Без ошибки:

age = input("Введите Ваш возраст: ")
print("Ваш возраст: " + age + " лет")

С ошибкой:

a1 = 532
a2 = 2063
target = a1 / a2 * 100
print(target + "%")

Функция
input возвращает строку.

Даже, если я в возрасте введу float

В
age все равно будет строка.
Во втором примере
target имеет тип
float. А
float со строкой без явного преобразования складывать нельзя.

print(str(target) + '%') - так заработает.


Как правильно реализовать запись в файл работы функции?
На досуге, чтобы изучать питон, пишу эмулятор командной строки ДОС на питоне. Возник вопрос как правильно реализовать аналог ДОС команды утилита>файл. Сохранение результата работы в файл. Пример
dir>1.txt Вариант
os.system('dir>1.txt') конечно простой. Но я не для того занимаюсь извращениями чтоб было просто. Хочу чтоб в файл писал именно питон. Пока все это состоит из скрипта main который содержит вечный цикл ввода команд и модуля с функциями, которые main дергает в зависимости от введенной команды.
Это main:

import utils
import os
import re

functions = {'tree': utils.tree, #словарь релизованных функций
             'quit': utils.quit, 'exit': utils.quit, 'x': utils.quit,
             'dir': utils.dir, 'ls': utils.dir,
             'cd': utils.cd, 'chdir':utils.cd,
             'help': utils.help, '?': utils.help,
             'cls':utils.cls
             }

while True:
    input_string = input(os.getcwd() + '>').lower() # читаем ввод
    cli = re.split(r'([a-z]+)(.*)', input_string)   # режем на функцию и аргумент
    cli.extend(' '' ')
    function_name = cli[1]
    argument = cli[2]
    if function_name in functions and argument == '/?': # если /? печатаем докум.
        print(functions[function_name].__doc__)
    elif function_name in functions:
        functions[function_name]((argument).strip()) # если функция в словаре - вызываем
        print('\n')
    elif function_name != ' ' or not function_name.isalpha():
        print(function_name + argument, """ не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.""")

Это пример функции из utils.py

from pathlib import Path
import sys
import os
import datetime
import re

def cd(argument):
    r"""Вывод имени либо смена текущего каталога.
Здесь вырезано куча текста из справки

"""
    if len(argument) > 0:
        command = re.split(r'[ ]', argument, maxsplit=1)
        if len(command) > 1 and command[0] == '/d':
                path = command[1]
        else:
            path = argument
        if not os.path.isdir(path):
            print('Системе не удается найти указанный путь.')
        else:
            accert: os.path.isdir(path)
            os.chdir(path)
    elif argument == '':
            print(os.getcwd())

Хотелось бы сделать так же просто как вывод справки если аргумент функции /?. Или надо переписать как-то функции чтоб они не печатали результат, а возвращали список строк, а потом его в зависимости от команды печатать в консоль или в файл писать? Прошу в пианиста не стрелять, играет как может. Опыта у меня нет совсем и именно чтоб его получить я эту бесполезную вещь и пишу.

import utils
import os
import re
from contextlib import redirect_stdout

functions = {'tree': utils.tree,
             'quit': utils.quit, 'exit': utils.quit, 'x': utils.quit,
             'dir': utils.dir, 'ls': utils.dir,
             'cd': utils.cd, 'chdir':utils.cd,
             'help': utils.help, '?': utils.help,
             'cls':utils.cls
             }

while True:
    input_string = input(os.getcwd() + '>').lower()
    cli = re.split(r'([a-z]+)(.*)', input_string)
    cli.extend(' '' ')
    function_name = cli[1]
    argument = cli[2]
    if function_name in functions and argument == '/?':
        print(functions[function_name].__doc__)

    elif function_name in functions and (len(argument) and argument[0] == '>'):
        with open(argument[1:], 'w') as file: #Перенаправляем вывод в файл если
            with redirect_stdout(file):       #Аргумент начинается с '>'
                functions[function_name]('')

    elif function_name in functions:
        functions[function_name]((argument).strip())
        print('\n')
    elif function_name != ' ' or not function_name.isalpha():
        print(function_name + argument, """ не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.""")


Как в строчке заменить последовательность элементов на количество вхождений?
Допустим у меня есть строка
"aaabbbcc" и мне нужно заменить все
"a" на
"a3",  где
3 это количество вхождений и так далее с другими буквами.

In [32]: from itertools import groupby

In [33]: s = "aaabbbcc"

In [34]: res = ''.join(f"{a}{len(list(b))}" for a,b in groupby(list(s)))

In [35]: res
Out[35]: 'a3b3c2'

без использования модулей:

res = ""
cnt = 1

for i,c in enumerate(s[:-1]):
    if c != s[i+1]:
        res += f"{c}{cnt}"
        cnt = 1
    else:
        cnt += 1
    if i == len(s) - 2:
        res += f"{s[i+1]}{cnt}"

PS не вижу смысла отказываться от использования модулей (если это не учебное задание, в котором явно запрещено использовать модули).


Code-review поиск одинаковых слов в списках
господа. Полагаю, данный код можно/нужно сократить, возможно использовать библиотеки Pandas. Ковыряла, по итогу, дельного ничего не нашла.
Код реализует вывод слов из второго списка, при условии, что они не совпадают со словом из первого. Огромное спасибо!
<code>

    text_robot = ['попытаемся найти соску', 'надоедливый блогер', 'капитан очевиднасть', 'корректное предложение']
    text_human = ['попытаемся найти сосиску', 'блогер обычный', 'капитан очевидность', 'корректное предложение']
        itog_termin_list = []

        for sentence in text_human:
            if sentence not in text_robot:
                dobavlenie_elementa = text_robot[text_human.index(sentence)]
                sentence_new = sentence
                if len(dobavlenie_elementa.split(' ')) > len(sentence.split(' ')):
                    for i in range(len(dobavlenie_elementa.split(' ')) - len(sentence.split(' '))):
                        sentence_new = sentence_new + ' trash'
                else:
                    len(sentence.split(' ')) - len(dobavlenie_elementa.split(' '))
                    for i in range(len(sentence.split(' ')) - len(dobavlenie_elementa.split(' '))):
                        dobavlenie_elementa = dobavlenie_elementa + ' trash'
                for word in sentence_new.split(' '):
                    if word not in text_robot[text_human.index(sentence)].split(' '): # индексы (убрать)
                        itog_human = word
                        try:
                            itog_robot = dobavlenie_elementa.split(' ')[sentence_new.split(' ').index(word)]
                            if itog_human != itog_robot and itog_human != 'trash':
                                if itog_human not in itog_termin_list:
                                    itog_termin_list.append(itog_human)
                        except:
                            print('ou, shit')
        print(itog_termin_list)
</code>

['сосиску', 'обычный', 'очевидность']

res = []

for rob, hum in zip(text_robot, text_human):
    res.extend(set(hum.split()) - set(rob.split()))

результат:

In [21]: res
Out[21]: ['сосиску', 'обычный', 'очевидность']


Многострочный ввод в файл .txt
Есть код, который должен выполнять такую задачу как записывание из многострочного input() в .txt файл, с чем он успешно не справляется, неизвестно по какой причине, причем при записи никаких ошибок не возникает, а после нажатия ctrl + D возникает ошибка приложенная ниже.
<code>
print("Enter/Paste your content. Ctrl-D or Ctrl-Z ( windows ) to save it.")
contents = []
while True:
    try:
        line = input()
    except EOFError:
        break
    contents.append(line)
    with open("some.txt", "a") as ouf:
        ouf.write(input() + "\n")

\\\\\\
Traceback (most recent call last):
File "D:/python-projects/test/main.py", line 10, in <module>
ouf.write(input() + "\n")
EOFError: EOF when reading a line
</code>

вместо input(), используйте line:

with open("some.txt", "a") as ouf:
        ouf.write(line + "\n")

и у вас бесконечный цикл, поэтому вам нужно его остановить:

if line == 'stop':
   break


Pygame: столкновение
Я начал изучать библиотеку PyGame и задача такова: нужно сделать так, чтобы игрок (прямоугольник) падал вниз, пока не столкнётся с каким-либо спрайтом (платформой в моём случае). ЛКМ - создаёт платформу, ПКМ - перемещает игрока по координатам мыши. Так же клавишами "право" и "лево" игрок сдвигается на 10 единиц в право/лево соответственно.
Почему у меня не падает игрок вниз, ведь условие выполняется, а само действие в классе PlayerBorder не выполняется.
<code>
import pygame

pygame.init()
size = width, height = (500, 500)
screen = pygame.display.set_mode(size)
back_color = pygame.Color('black')
running = True
fps = 60
clock = pygame.time.Clock()
######
all_sprites = pygame.sprite.Group()
things = pygame.sprite.Group()
all_sprites.add(things)

class Player(pygame.sprite.Sprite):

    def __init__(self, x, y, group):
        # НЕОБХОДИМО вызвать конструктор родительского класса Sprite. Это очень важно!!!
        super().__init__(group)
        self.image = pygame.Surface((20, 20))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.add(group)

    def render(self):
        pygame.draw.rect(screen, [255, 0, 0], (self.rect.x, self.rect.y, 20, 20))

class Barriers(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, group):
        # НЕОБХОДИМО вызвать конструктор родительского класса Sprite. Это очень важно!!!
        super().__init__(group)
        self.image = pygame.Surface((width, height))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.width = width
        self.height = height
        self.add(group)

    def update(self):
        pygame.draw.rect(screen, pygame.Color('grey'), (self.rect.x, self.rect.y, self.width, self.height))

class PlayerBorder(pygame.sprite.Sprite):

    def __init__(self, x, y, width, height, group):
        super().__init__(group)
        self.image = pygame.Surface((width, height))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.width = width
        self.height = height
        self.add(group)

    def update(self):
        if not pygame.sprite.spritecollideany(self, things):
            self.rect.y += 50 / fps
        pygame.draw.rect(screen, pygame.Color('white'), (self.rect.x, self.rect.y, self.width, self.height))
#####

def move(key):

    if key == 'left':
        player.rect.x -= 10
        l_b.rect.x -= 10
        r_b.rect.x -= 10
        u_b.rect.x -= 10
        d_b.rect.x -= 10
    elif key == 'right':
        player.rect.x += 10
        l_b.rect.x += 10
        r_b.rect.x += 10
        u_b.rect.x += 10
        d_b.rect.x += 10

player = Player(20, 20, all_sprites)
l_b = PlayerBorder(player.rect.x - 1, player.rect.y - 1, 1, player.rect.y + 2, all_sprites)
r_b = PlayerBorder(player.rect.x + 20, player.rect.y - 1, 1, player.rect.y + 2, all_sprites)
u_b = PlayerBorder(player.rect.x - 1, player.rect.y - 1, 22, 1, all_sprites)
d_b = PlayerBorder(player.rect.x - 1, player.rect.y + 20, 22, 1, all_sprites)
while running:
    screen.fill((0, 0, 0))
    things.update()
    all_sprites.draw(screen)
    player.render()
    all_sprites.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                Barriers(pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1], 50, 10, things)
            elif event.button == 3:
                player.x, player.y = pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1]
                d_b.x, d_b.y = player.rect.x - 1, player.rect.y + 20
                u_b.x, u_b.y = player.rect.x - 1, player.rect.y - 1
                r_b.x, r_b.y = player.rect.x + 20, player.rect.y - 1
                l_b.x, l_b.y = player.rect.x - 1, player.rect.y - 1
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                move('left')
            elif event.key == pygame.K_RIGHT:
                move('right')
    pygame.display.flip()
    clock.tick(fps)
pygame.quit()
</code>

Я проверил, self.rect.y у вас точно имеет тип int, когда вы к нему прибавляете int(50/60), то есть ноль, то ничего, естественно, не происходит. Если задать fps поменьше (например, 25), то на экране что-то начинает происходить.