Найти - Пользователи
Полная версия: вопрос про классы
Начало » Python для новичков » вопрос про классы
1
АндрейК
Прощу прощения за слишком простой вопрос, но для меня он является неразрешимым. Надеюсь разрешить его с Вашей помощью. Есть простая програмка, которая возвращает матрицу заданного размера (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 которая возвращает матрицу заданного размера, заполненную единицами. Знаю, что просто, но НИКАК не получается. Прошу помочь. Поверьте, что читал все описания, но на практике никак не выходит…. Начинаю вызывать функцию внутри класса, задавать переменные (ее размер) но все бестолку. :-(((
Yurietc
>>> 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]]
Puppy
#!/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()
Soteric
Почему не использовать статические методы?
АндрейК
Спасибо всем! Кажется чуток разобрался. Препод тестирует наши проги своей прогой, подставляя контрольные значения в наши функции. Имена классов и функции строго определены. Потому и приходится их (классы) использовать.
Isem
def uns(m,n):
row = [1]*n
return [list(row) for i in range(m)]
py.user.next
а в чём смысл 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]
>>>
Isem
Смысл list(row) в том, что создается копия row. Если писать просто row, а не list(row), тогда матрица будет состоять из одних и тех же строк (как объектов) и модификация одной из них автоматически приведет к модификации всех остальных.
То есть если в вашем примере написать m = 5, то у всех строк первый элемент изменится на 5.

Хотя нет, в вашем примере будет все нормально работать.
Но если написать так:
def uns(m,n):
return [[1]*n]*m
или убрать list из первого примера, то получим идентичные строки как указатели на один и тот же объект.
py.user.next
>>> 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]]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB