Перейти к содержимому

Фотография

Интересный PythonКонсультации, Вопросы, Интересные Задачки на Python

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

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1
T-800 Danya

T-800 Danya
  • Завсегдатай
  • 293 сообщений

Собственно Сабж. 

 

Если у кого есть Вопросы, Задачки по Программированию на Python постим сюда - Ответы и Решения будут.

 

 

 

 


  • 0

#2
T-800 Danya

T-800 Danya
  • Завсегдатай
  • 293 сообщений

И для почина - чтобы разогреть Многоуважаемую Аудиторию - Первый  Вопрос от меня про Интересные Shared acute.gif

 

К примеру  есть такая Программа

import sys


class ParseResult:
  errors_list= []
  parse_ok= False


def Parse():
  result= ParseResult()
  result.errors_list.append( "something" )
  return result


def main():
  print( Parse().errors_list )
  print( Parse().errors_list )
  print( Parse().errors_list )
  print( Parse().errors_list )

if __name__ == "__main__":
  sys.exit(main())

Выполнить код  он-лайн  см. http://rextester.com/PXL1357

 

Т.е. при выполнении программа  на выводе дает вот что

$ python test.py
['something']
['something', 'something']
['something', 'something', 'something']
['something', 'something', 'something', 'something']

Почему? Т.е. откуда возникают Shared состояния? acute.gif

 

Кто даст правильный Ответ - получит Плюсик в Репутацию good3.gif


Сообщение отредактировал T-800 Danya: 27.08.2018, 15:40:06

  • 0

#3
lexx821

lexx821
  • Частый гость
  • 64 сообщений

От нечего делать, вот написал код на python, алгоритм пузырчатой сортировки, возможно её как-то можно упростить...

def bubble_sort(l):
    for i in range(0, len(l)):
     for j in range(i, len(l)):
       if l[i] > l[j]: 
         l[j],l[i] = l[i],l[j]
    
l = [100, 5, 1, 7, 20, 10000]
print(l)
bubble_sort(l)
print(l)

  • 0

#4
Создатель

Создатель
  • Случайный прохожий
  • 1 сообщений

Где можно пройти курсы Python в Алматы?


  • 0

#5
lexx821

lexx821
  • Частый гость
  • 64 сообщений

Где можно пройти курсы Python в Алматы?
 

Я лично научился языку Python просмотрев видеоролики Тимофея Хирьянова на ютубе, он очень хорошо, просто и понятно объясняет. А когда базовые знания получили, потом нужно будет читать онлайн документацию по языку, установить Python на комп, и закреплять теоретические знания практикой.


  • 0

#6
hes

hes
  • В доску свой
  • 1 541 сообщений

питон коварен:) еще эликсир вот хорошая вещь, похож на питон, похож на руби, базирован на Erlang https://habr.com/ru/post/50028/

вацапы, чаты фейсбука, телеграм - это всё джаббер, xml-потоки, можно и protobuf, протокол xmpp


  • 0

#7
Mr. Bool

Mr. Bool
  • Случайный прохожий
  • 2 сообщений

И для почина - чтобы разогреть Многоуважаемую Аудиторию - Первый  Вопрос от меня про Интересные Shared acute.gif

 

К примеру  есть такая Программа

import sys


class ParseResult:
  errors_list= []
  parse_ok= False


def Parse():
  result= ParseResult()
  result.errors_list.append( "something" )
  return result


def main():
  print( Parse().errors_list )
  print( Parse().errors_list )
  print( Parse().errors_list )
  print( Parse().errors_list )

if __name__ == "__main__":
  sys.exit(main())

Выполнить код  он-лайн  см. http://rextester.com/PXL1357

 

Т.е. при выполнении программа  на выводе дает вот что

$ python test.py
['something']
['something', 'something']
['something', 'something', 'something']
['something', 'something', 'something', 'something']

Почему? Т.е. откуда возникают Shared состояния? acute.gif

 

Кто даст правильный Ответ - получит Плюсик в Репутацию good3.gif

 

Интересный вопрос. Попробую на него ответить. Мне думается, это происходит по следующим причинам. 

В объявлении класса ParseResult используется атрибут error_list с изменяемым типом данных (list), который является переменной класса (class variable), а не его экземпляра. Другими словами, список error_list используется совместно всеми экземплярами данного класса, потому что каждый из них хранит ссылку на один и тот же список. Дальше в функции main() несколько раз вызывается функция Parse(), которая каждый раз создает новый экземпляр класса ParseResult и сразу же изменяет атрибут error_list, когда добавляет новый элемент в список при помощи метода append(). Поскольку атрибут совместно используется всеми экземплярами, он автоматически изменяется во всех остальных уже созданных экземплярах этого класса. Чтобы каждый экземпляр класса имел собственное значение атрибута error_list, надо переписать класс примерно так:

class ParseResult:
   def __init__(self, parse_ok):
      self.parse_ok = False
      self.errors_list = [] # создает новый пустой список для каждого экземпляра ParseResult

   def add_error(self, error):
      self.errors_list.append(error)

Правильный ли мой ответ? Будет ли у меня плюсик в репутацию?  ;)


  • 1

#8
T-800 Danya

T-800 Danya
  • Завсегдатай
  • 293 сообщений

Интересный вопрос. Попробую на него ответить. Мне думается, это происходит по следующим причинам. 
В объявлении класса ParseResult используется атрибут error_list с изменяемым типом данных (list), который является переменной класса (class variable), а не его экземпляра. Другими словами, список error_list используется совместно всеми экземплярами данного класса, потому что каждый из них хранит ссылку на один и тот же список. Дальше в функции main() несколько раз вызывается функция Parse(), которая каждый раз создает новый экземпляр класса ParseResult и сразу же изменяет атрибут error_list, когда добавляет новый элемент в список при помощи метода append(). Поскольку атрибут совместно используется всеми экземплярами, он автоматически изменяется во всех остальных уже созданных экземплярах этого класса. Чтобы каждый экземпляр класса имел собственное значение атрибута error_list, надо переписать класс примерно так:

class ParseResult:
   def __init__(self, parse_ok):
      self.parse_ok = False
      self.errors_list = [] # создает новый пустой список для каждого экземпляра ParseResult

   def add_error(self, error):
      self.errors_list.append(error)
Правильный ли мой ответ? Будет ли у меня плюсик в репутацию?  ;)

 

 
Плюсик будет  :)
 
Суть   в том, что в Python поля класса - это именно поля класса, а не инстанса. Инстансы работают за счёт того, что, когда происходит  обращаение к полю, которого у инстанса нет, запрос перенаправляется классу.

print('look carefully for object identities')

print('\ndefine Inner')
class Inner:
    def __init__(self):
        print('Inner.__init__(', self, ')')
        
    def __del__(self):
        print('Inner.__del__(', self, ')')

print('\ndefine Outer')
class Outer:
    class_attribute = Inner()
    
    def __init__(self):
        print('Outer.__init__(', self, ')')
        self.instance_attribute = Inner()
        
    def __del__(self):
        print('Outer.__del__(', self, ')')

print('\ncreate OuterInstanceA')
OuterInstanceA = Outer()

print('\ncreate OuterInstanceB')
OuterInstanceB = Outer()

print('\nOuterInstanceA.class_attribute ::', OuterInstanceA.class_attribute)
print('OuterInstanceA.instance_attribute ::', OuterInstanceA.instance_attribute)
print('OuterInstanceB.class_attribute ::', OuterInstanceB.class_attribute)
print('OuterInstanceB.instance_attribute ::', OuterInstanceB.instance_attribute)
print('Outer.class_attribute ::', Outer.class_attribute)
try:
    print('Outer.instance_attribute ::', Outer.instance_attribute)
except Exception as e:
    print('Outer.instance_attribute !', e)

print('\ndelete OuterInstanceA')
del OuterInstanceA

print('\ndelete OuterInstanceB')
del OuterInstanceB

print('\ndelete Outer')
del Outer

print('\nend')

См. результат выполнения  кода   https://rextester.com/SJOH58595

 

Таким образом если необходимо, чтобы каждый инстанс при появлении получал свою собственную копию list() -   надо прописать  создание этой копии в __init__.


Сообщение отредактировал T-800 Danya: 08.02.2019, 23:05:42

  • 0

#9
Mr. Bool

Mr. Bool
  • Случайный прохожий
  • 2 сообщений

Суть в том, что в Python поля класса - это именно поля класса, а не инстанса.

 

А я разве не то же самое сказал?  :)

 

Таким образом если необходимо, чтобы каждый инстанс при появлении получал свою собственную копию list() - надо прописать создание этой копии в __init__.

 

И об этом в моем ответе то же самое сказано, с примером кода.  :hi:

 

Инстансы работают за счёт того, что, когда происходит обращаение к полю, которого у инстанса нет, запрос перенаправляется классу.

 

А вот тут интересный момент. Вот пример класса с двумя полями, которых тоже вроде бы не будет у "инстанса" (по-русски говоря, у экземпляра класса).

#python 3.5.2

class MyClass:
    year = 1900
    words = ['spam', 'test']

var1 = MyClass()
var2 = MyClass()
var3 = MyClass()

var2.year = 1999
var3.year = 2019
var2.words[0] = 'Hello'
var3.words[1] = 'world'

print(var1.year, var1.words)
print (var2.year, var2.words)
print(var3.year, var3.words)

При выполнении этого кода через тот же самый сервис https://rextester.co...online_compiler получим:

1900 ['Hello', 'world']
1999 ['Hello', 'world']
2019 ['Hello', 'world']

Видим, что атрибут words, как и прежде, это атрибут класса. Он общий (совместно используемый). Изменения этого атрибута в любом "инстансе", как и раньше, приводят к его изменению во всех остальных. Атрибут year в MyClass тоже является атрибутом класса, а не "инстанса". А вот значение атрибута year при его изменении в каждом "инстансе" получилось свое! Причем прописывать его в классе через self не потребовалось. 

 

Кто сможет это правильно объяснить, получит от меня плюсик в репутацию. ;)


  • 1

#10
T-800 Danya

T-800 Danya
  • Завсегдатай
  • 293 сообщений

Кто сможет это правильно объяснить, получит от меня плюсик в репутацию. ;)

 

Скрытый текст

Сообщение отредактировал T-800 Danya: 09.02.2019, 12:00:32

  • 0

#11
Regi

Regi
  • Завсегдатай
  • 160 сообщений

Буду очень благодарен если хотя-бы подскажите куда копать...

Итак:

есть два массива, скажем таких:

u1=[1,4,2,6,7,3]

x1=[20,43,21,45,32,87]

Количество элементов в двух массивах равное, это важно. Проще говоря каждый n элемент первого массива соотносится к каждому n элементу второго массива.

Далее задаем значение u, например 5.

Задача вычислить значение x.

ТО есть: нужно понять где в первом массиве находится значение u, интерполировать его и на основе этого значения вычислить значение x из второго массива.

Рыл в сторону интерполяции, регрессии, но пока безрезультатно.

Спасибо.


  • 0

#12
T-800 Danya

T-800 Danya
  • Завсегдатай
  • 293 сообщений

Буду очень благодарен если хотя-бы подскажите куда копать...
Итак:
есть два массива, скажем таких:
u1=[1,4,2,6,7,3]
x1=[20,43,21,45,32,87]
Количество элементов в двух массивах равное, это важно. Проще говоря каждый n элемент первого массива соотносится к каждому n элементу второго массива.
Далее задаем значение u, например 5.
Задача вычислить значение x.
ТО есть: нужно понять где в первом массиве находится значение u, интерполировать его и на основе этого значения вычислить значение x из второго массива.
Рыл в сторону интерполяции, регрессии, но пока безрезультатно.
Спасибо.

ИМХО если каждый n-й элемент массива Х соотвествует одному и только одному n-ому элементу массива U то Вам надо сделать перебор элементов массива U c n=0 дл n=N, определить индекс n для которого будет минимум модуля разности Un и 5 и выбрать из массива X элемент с определенным Вами индексом n, а потом просто взять да и прибавить к нему (Un-5)*[Xn+1 - Xn]/[Un+1 -Un]

Одним словом ИМХО как-то примерно так вот ;)

Сообщение отредактировал T-800 Danya: 12.02.2019, 00:10:59

  • 0

#13
vladimir55

vladimir55
  • Постоялец
  • 401 сообщений

упс!


Сообщение отредактировал vladimir55: 16.02.2019, 16:59:55

  • 0





Темы с аналогичным тегами python, вопросы, задачки, консультации, программирование

Количество пользователей, читающих эту тему: 2

пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0

X

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2019 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.