LINUX.ORG.RU

аналог Си-шных структур в питоне

 ,


1

2

Какой наименее громоздкий аналог Си-шных структур для языка Python. Я гуглил, но что-то мне не нравятся ответы.

Хотелось бы легкий доступ к shit.a = 5 и чтобы print выводил содержимое структуры вместе с названиями полей...

Ответ на: комментарий от x3al

Точно! Спасибо.

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

Идеально, лучше не придумать. Надеюсь это быстрое...

I-Love-Microsoft ★★★★★
() автор топика

Если будет потребность в оптимизации памяти (например, если нужен здоровый массив структур), то можно глянуть в сторону cffi. Можно будет создавать C-шные структуры с тем же легким доступом shit.a.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от ei-grad

construct — если нужно работать с бинарными форматами, а ТС просто хочет легковесную языковую конструкцию. Ну и construct ничерта не легковесно.

x3al ★★★★★
()

class со __slots__, namedtuple такое же pure python решение, емнип

Virtuos86 ★★★★★
()

Если на коленке то

from math import sqrt

class Point:
  def __init__(self, x, y):
    self.x = x
    self.y = y

pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
itn ★★★
()
Ответ на: комментарий от itn
class Point:
  def __init__(self):
    self.x = 0
    self.y = 0

А так можно? Не хочется инитить сразу... Я просто нуб в питоне, хотя однажды написал довольно сложный скрипт для себя, а теперь вот решил использовать python там где раньше бы взял проприеторастический матлаб.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Если хочешь именно так, то делай как анонимус посоветовал. Это будет намного гибче.

itn ★★★
()
Ответ на: комментарий от I-Love-Microsoft

а теперь вот решил использовать python там где раньше бы взял проприеторастический матлаб

Тогда сразу смотри в сторону numpy, simpy и matplotlib.

PolarFox ★★★★★
()
Ответ на: комментарий от ei-grad

Нет, конечно. Просто я не буду использовать их кроме как для разбора/генерации бинарных форматов, в первую очередь легаси (потому, что батарейки для остального давно есть. Да, я ненавижу clarion).

x3al ★★★★★
()

Какой наименее громоздкий аналог Си-шных структур для языка Python

В питоне нет нормальных аналогов сишных структур, всё какое-то уг. Самый лёгкий это __slots__, как уже советовали ниже. Все collections тормозные надстройки над стандартными структурами писанные на самом же питоне.

mashina ★★★★★
()

Не специалист в питоне, мб класс shit со статическим открытым полем a?

nikolnik ★★★
()
Ответ на: комментарий от PolarFox

Тогда сразу смотри в сторону numpy, simpy и matplotlib

О да, я уже на всех парах именно эти штуки и осваиваю. Вот встал вопрос как данные от разных датчиков в одной структуре хранить :) Но теперь уже ответ найден: named tuple.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от PolarFox

Вот код, не весь - опущена загрузка из файла, всё прекрасно рисуется и причем правильно. Но есть вопросы: 1) объявление linspace 2) информация о типе...

from collections import namedtuple
measure = namedtuple("measure", "acc gyr")

... тут заполняются данные из файла, каждый элемент data - это measure (named tuple с полями acc и gyr)

time = numpy.linspace(0., .02 * len(data), len(data))
ax = numpy.linspace(0., 0., len(data))
ay = numpy.linspace(0., 0., len(data))
az = numpy.linspace(0., 0., len(data))
gx = numpy.linspace(0., 0., len(data))
gy = numpy.linspace(0., 0., len(data))
gz = numpy.linspace(0., 0., len(data))
for i in range(0, len(data)):
    ax[i], ay[i], az[i] = data[i].acc
    gx[i], gy[i], gz[i] = data[i].gyr
plt.figure().canvas.set_window_title("graph")
pylab.subplot(211)
pylab.title("accelerometer")
pylab.plot(time, ax, "-r")
pylab.plot(time, ay, "-g")
pylab.plot(time, az, "-b")

pylab.subplot(212)
pylab.title("gyroscope")
pylab.plot(time, gx, "-r")
pylab.plot(time, gy, "-g")
pylab.plot(time, gz, "-b")
pylab.show()

1) Есть ли способ задать linspace сразу для всех этих переменных. А то не няшно - 6 одинаковых строк...

2) И правильно ли я беру данные из namedtuple? Ведь как только мы выходим из функции например, то мы теряем информацию что data это named tuple и у него есть поля acc и gyr. А как вернуть информацию что это data это measure??? Когда я был в функции загрузки из файла, то я мог присваивать полям значения в m = measure(acc = a, gyr = g):

def parse(file):
    print file
    d = []
    f = file.readlines()
    #print f
    for i in range(0, len(f)):
        f[i] = f[i].rstrip()
        if len(f[i]) != 65: f[i] = ""
    f = filter(None, f)
    for i in range(0, len(f)):
        s = f[i].split()
        a = float(s[3]), float(s[4]), float(s[5])
        g = float(s[0]), float(s[1]), float(s[2])
        m = measure(acc = a, gyr = g)
        d.append(m)
    return d
I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 3)
Ответ на: комментарий от I-Love-Microsoft

Есть ли способ задать linspace сразу для всех этих переменных. А то не няшно - 6 одинаковых строк..

не очень красиво, конечно, но

ax,ay,az,gx,gy,gz = [numpy.linspace(0., 0., len(data)) for _ in range(6)]

Dred ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

numpy.linspace(0., 0., len(data))

numpy.zeros(len(data))
anonymous
()
Ответ на: комментарий от I-Love-Microsoft

И правильно ли я беру данные из namedtuple?

да

Ведь как только мы выходим из функции например, то мы теряем информацию что data это named tuple и у него есть поля acc и gyr.

предрассудки

А как вернуть информацию что это data это measure???

не нужно

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

for i in range(0, len(f))

тоже самое

for i in range(len(f))
но лучше
for i,value in enumerate(f)

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft
import numpy
from collections import namedtuple
measure = namedtuple("measure", "acc gyr")

def parse(fname):
    for i in open(fname):
        i = i.rstrip()
        if len(i) == 65:
            i = tuple(map(float, i.split()[:6]))
            yield measure(acc = i[0:3], gyr = i[3:6])

d = list(parse('in.txt'))
print(d)
anonymous
()
Ответ на: комментарий от Dred
ax,ay,az,gx,gy,gz = [numpy.linspace(0., 0., len(data)) for _ in range(6)]

А по мне так очень даже няяя.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

щас вообще meas назову

Даже это будет лучше, чем measure.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.