Форум сайта python.su
Прощу прощения за слишком простой вопрос, но для меня он является неразрешимым. Надеюсь разрешить его с Вашей помощью. Есть простая програмка, которая возвращает матрицу заданного размера (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()
Офлайн
>>> 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]]
Офлайн
#!/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()
Офлайн
Почему не использовать статические методы?
Отредактировано (Окт. 1, 2010 20:10:35)
Офлайн
Спасибо всем! Кажется чуток разобрался. Препод тестирует наши проги своей прогой, подставляя контрольные значения в наши функции. Имена классов и функции строго определены. Потому и приходится их (классы) использовать.
Отредактировано (Окт. 3, 2010 10:18:19)
Офлайн
def uns(m,n):
row = [1]*n
return [list(row) for i in range(m)]
Отредактировано (Окт. 4, 2010 17:25:15)
Офлайн
а в чём смысл 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]
>>>
Офлайн
Смысл list(row) в том, что создается копия row. Если писать просто row, а не list(row), тогда матрица будет состоять из одних и тех же строк (как объектов) и модификация одной из них автоматически приведет к модификации всех остальных.
То есть если в вашем примере написать m = 5, то у всех строк первый элемент изменится на 5.
Хотя нет, в вашем примере будет все нормально работать.
Но если написать так:
def uns(m,n):
return [[1]*n]*m
Отредактировано (Окт. 6, 2010 06:16:06)
Офлайн
>>> 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]]
>>>
Офлайн