Найти - Пользователи
Полная версия: генерация единичной матрицы
Начало » Python для новичков » генерация единичной матрицы
1 2 3 4
FishHook
AD0DE412
кста прикольная штука
А объясните, зачем вы один генератор заворачиваете в другой генератор?
Вот так будет тоже самое
 inf_gen = itertools.count()
FishHook
AD0DE412
вроде как да (эээ как мне кажется, тут больше подойдут слова - сравнение элемента(элементов)
У всего есть название, цикл фор - “это цикл со счетчиком”, в низкоуровневый код он разворачивается как то так

int start = 0 // это счетчик
int end = 10
int step = 1
label:
if start < end:
// Это тело цикла
start += step
goto label
Rodegast
> по хорошему вопрос должен звучать - почему while ни как не используется в генераторах списков?

По моему вопрос должен звучать “почему в списочных выражениях используется ключевое слово for”?

> в низкоуровневый код он разворачивается как то так

Не, там всё намного сложнее из за протокола итератора.
AD0DE412
просто кроличья нора какая то
Rodegast хорошо почему for
зы FishHook вроде Лутц утверждает что for это перебор (next()) чего то итерируемого до ошибки выхода за пределы эээ “массива?” те что то вроде
 # codind: utf-8
for i in range(10):
    print(i)
    if i == 5:
        raise IndexError
ззы а понятно вы про while сорямба)
зззы
FishHook
А объясните, зачем вы один генератор заворачиваете в другой генератор?
Вот так будет тоже самое
не знаю (

 # codind: utf-8
# python 2
import itertools
if raw_input('--> ') == '1':
    inf_gen = (x for x in itertools.count())
else:
    inf_gen = itertools.count()
for i in inf_gen:
    print type(inf_gen), inf_gen
    print i

 --> 1
<type 'generator'> <generator object <genexpr> at 0x02B13DA0>
0
 --> s
<type 'itertools.count'> count(1)
0
разные типы?


StanLee
Видимо это будет как то так:
 [[(1 if i == j else 0) for i in range(10)] for j in range(10)]
А если по уму, для работы с матрицами нужно использовать numpy:
 import numpy as np
m = np.full((10,10),0)
width = m.shape[1]
height = m.shape[0]
for i in range(height):
    for j in range(width):
        if i == j:
            m[i,j] = 1
(Списки - медленная структура, массивы numpy работают гораздо быстрее)
FishHook
AD0DE412
зы FishHook вроде Лутц утверждает что for это перебор (next()) чего то итерируемого до ошибки выхода за пределы эээ “массива?” те что то вроде
AD0DE412
raise IndexError
А индекс где хранится? Текущий индекс - это и есть счётчик.
Да, не могу не согласиться, что в питоне итератор можно сделать и по-другому, например на основе LinkedList, и тогда в основе перебора будет лежать while и флаг конца последовательности, а не счетчик, и в этом смысле понятие “цикл со счетчиком” не совсем применимо к питоновскому фору. Но в принципе, мы можем считать счетчиком ту самую переменную i в for i in seq, это не слишком отдаляет нас от классического for (int i=0; i<100; i++)
AD0DE412
спсб … вроде понятно for потому, что он “достовляет” индекс, что упращает … многое.
LinkedList (связаные списки) выглядят прикольно но, это больше про java (покрайней мере если верить поисковикам, толька на 5 - 6 странице выскакивает что то с python)

FishHook
AD0DE412
спсб … вроде понятно for потому, что он “достовляет” индекс, что упращает … многое.
LinkedList (связаные списки) выглядят прикольно но, это больше про java (покрайней мере если верить поисковикам, толька на 5 - 6 странице выскакивает что то с python)

Структуры данных вообще к языкам программирования не привязаны. Если мне нужна структура с фиксированным временем вставки / извлечения и я не планирую обращаться к элементам по индексу, например, для организации очереди, то, вероятно, я выберу в качестве основы связный список. Это требование алгоритма, а не питона или джавы. В питоне вполне себе есть связные списки
py.user.next
FishHook
В питоне вполне себе есть связные списки
Дек - это всё-таки другая динамическая структура данных. Да, связный список можно на деке построить, но и на двух обычных списках можно построить.

Описание Л2-списка (СП - система предписаний)
Л2-список элементов типа E.
СП (полная):
1. начать работу
2. сделать список пустым
3. список пуст/список не пуст : да/нет
4. установить указатель в начало/конец списка
5. указатель в начале/конце списка : да/нет
6. передвинуть указатель списка вперёд/назад
7. добавить элемент <вх: E> до указателя/за указателем списка
8. взять элемент списка до указателя/за указателем в <вых: E>
9. элемент списка до указателя/за указателем :: E
10. удалить элемент списка до указателя/за указателем
11. кончить работу

СП (сокращённая):
1. начать работу
2. сделать пустым
3. пуст/не пуст : да/нет
4. установить в начало/конец
5. в начале/конце : да/нет
6. вперёд/назад
7. добавить <вх: E> до/за
8. взять до/за <вых: E>
9. до/за :: E
10. удалить до/за
11. кончить работу

Реализация L2-списка
#!/usr/bin/env python3

class L2List:
def __init__(self, seq=[]):
self.datal = []
self.datar = list(seq)

def iter_left(self):
while not self.atending():
self.gonext()
yield self.prevr()

def iter_right(self):
while not self.atbeginning():
self.goprev()
yield self.nextr()

def start(self):
self.datal = []

def clear(self):
self.datal = []
self.datar = []

def isempty(self):
return not (self.datal or self.datar)

def beginning(self):
self.datar = self.datal + self.datar
self.datal = []

def ending(self):
self.datal = self.datal + self.datar
self.datar = []

def atbeginning(self):
return self.datal == []

def atending(self):
return self.datar == []

def gonext(self):
if not self.datar:
raise ValueError('gonext on ending of list')
self.datal.append(self.datar.pop(0))

def goprev(self):
if not self.datal:
raise ValueError('goprev on beginning of list')
self.datar.insert(0, self.datal.pop())

def addnext(self, e):
self.datar.insert(0, e)

def addprev(self, e):
self.datal.append(e)

def popnext(self):
if not self.datar:
raise ValueError('popnext on ending of list')
return self.datar.pop(0)

def popprev(self):
if not self.datal:
raise ValueError('popprev on beginning of list')
return self.datal.pop()

def nextr(self):
if not self.datar:
raise ValueError('nextr on ending of list')
return self.datar[0]

def nextw(self, e):
if not self.datar:
raise ValueError('nextw on ending of list')
self.datar[0] = e

def prevr(self):
if not self.datal:
raise ValueError('prevr on beginning of list')
return self.datal[-1]

def prevw(self, e):
if not self.datal:
raise ValueError('prevw on beginning of list')
self.datal[-1] = e

def delnext(self):
if not self.datar:
raise ValueError('delnext on ending of list')
self.datar.pop(0)

def delprev(self):
if not self.datal:
raise ValueError('delprev on beginning of list')
self.datal.pop()

def end(self):
self.datal = []
self.datar = []

def __repr__(self):
return '{} ^ {}'.format(self.datal, self.datar)

def f():
lst = L2List()
lst.start()
print(lst.isempty())
lst.addnext(1)
lst.addnext(2)
lst.addnext(3)
print(lst.isempty())
print(lst.nextr())
lst.nextw(4)
print(lst.popnext())
print(lst.nextr())
lst.end()

if __name__ == '__main__':
f()
FishHook
py.user.next
Дек - это всё-таки другая динамическая структура данных. Да, связный список можно на деке построить, но и на двух обычных списках можно построить.

Я почитал исходники и понял вот этот комментарий
/* Data for deque objects is stored in a doubly-linked list of fixed
* length blocks. This assures that appends or pops never move any
* other data elements besides the one being appended or popped.
*

как реализацию deque через doubly-linked list. Я неправильно понял?
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