Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2010 16:50:36

АндрейК
От:
Зарегистрирован: 2010-09-11
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про классы

Прощу прощения за слишком простой вопрос, но для меня он является неразрешимым. Надеюсь разрешить его с Вашей помощью. Есть простая програмка, которая возвращает матрицу заданного размера (m строк n столбцов), все элеменьы которой равны 1.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def uns(m, n):
matriceUns = [[]]
for i in range (m):
matriceUns[0].append(1)
matrice = list()
x = 0
while x < n:
matrice.insert(x, matriceUns[0])
x = x + 1
matrice = matrice[:n]
return matrice

def main():
print(uns(3,2))
if __name__ == '__main__':
main()
Необходимо создать класс с именем, например, MyClass внутри которого и будет вызываться эта програмка, точнее функция uns которая возвращает матрицу заданного размера, заполненную единицами. Знаю, что просто, но НИКАК не получается. Прошу помочь. Поверьте, что читал все описания, но на практике никак не выходит…. Начинаю вызывать функцию внутри класса, задавать переменные (ее размер) но все бестолку. :-(((



Офлайн

#2 Окт. 1, 2010 17:35:44

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про классы

>>> def uns(m, n):
... matriceUns = [[]]
... for i in range (m):
... matriceUns[0].append(1)
... matrice = list()
... x = 0
... while x < n:
... matrice.insert(x, matriceUns[0])
... x = x + 1
... matrice = matrice[:n]
... return matrice
...
>>> class MyClass():
... def uns_Mega_Caller(self,m,n):
... print uns(m,n)
...
>>> MyClass().uns_Mega_Caller(2,2)
[[1, 1], [1, 1]]



Офлайн

#3 Окт. 1, 2010 17:48:33

Puppy
От:
Зарегистрирован: 2010-02-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про классы

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class beta():
def uns(self,m, n):
matriceUns = [[]]
for i in range (m):
matriceUns[0].append(1)
matrice = list()
x = 0
while x < n:
matrice.insert(x, matriceUns[0])
x = x + 1
matrice = matrice[:n]
return matrice
class main():
def __init__(self):
p=beta().uns(3,2)
print (p)
app=main()



Офлайн

#4 Окт. 1, 2010 20:08:38

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

вопрос про классы

Почему не использовать статические методы?



Отредактировано (Окт. 1, 2010 20:10:35)

Офлайн

#5 Окт. 3, 2010 10:17:49

АндрейК
От:
Зарегистрирован: 2010-09-11
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про классы

Спасибо всем! Кажется чуток разобрался. Препод тестирует наши проги своей прогой, подставляя контрольные значения в наши функции. Имена классов и функции строго определены. Потому и приходится их (классы) использовать.



Отредактировано (Окт. 3, 2010 10:18:19)

Офлайн

#6 Окт. 4, 2010 12:37:34

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

вопрос про классы

def uns(m,n):
row = [1]*n
return [list(row) for i in range(m)]



Отредактировано (Окт. 4, 2010 17:25:15)

Офлайн

#7 Окт. 6, 2010 02:15:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

вопрос про классы

а в чём смысл list(row) ? разве row уже не list ?

>>> def uns(m,n):
... row = [1]*n
... return [list(row) for i in range(m)]
...
>>> def uns(m, n): # матрицу заданного размера (m строк n столбцов)
... return [[1] * n for i in range(m)]
...
>>> uns(3, 4)
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> m = uns(3, 4)
>>> m[0]
[1, 1, 1, 1]
>>>



Офлайн

#8 Окт. 6, 2010 05:39:25

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

вопрос про классы

Смысл list(row) в том, что создается копия row. Если писать просто row, а не list(row), тогда матрица будет состоять из одних и тех же строк (как объектов) и модификация одной из них автоматически приведет к модификации всех остальных.
То есть если в вашем примере написать m = 5, то у всех строк первый элемент изменится на 5.

Хотя нет, в вашем примере будет все нормально работать.
Но если написать так:

def uns(m,n):
return [[1]*n]*m
или убрать list из первого примера, то получим идентичные строки как указатели на один и тот же объект.



Отредактировано (Окт. 6, 2010 06:16:06)

Офлайн

#9 Окт. 6, 2010 07:04:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

вопрос про классы

>>> def uns(m, n): # матрицу заданного размера (m строк n столбцов)
... return [[1] * n for i in range(m)]
...
>>> uns(3, 4)
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> m = uns(3, 4)
>>> m[0][0] = 0
>>> m
[[0, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>>
>>> def uns(m, n):
... return [[1] * n] * m
...
>>> uns(3, 4)
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> m = uns(3, 4)
>>> m[0][0] = 0
>>> m
[[0, 1, 1, 1], [0, 1, 1, 1], [0, 1, 1, 1]]
>>>
да, точно
может быть такое, я что-то и не подумал

>>> def uns(m, n):
... row = [1] * n
... return [row[:] for i in range(m)]
...
>>> m = uns(3, 4)
>>> m[0][0] = 0
>>> m
[[0, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version