Найти - Пользователи
Полная версия: Помогите разобраться с классами и функциями
Начало » Python для новичков » Помогите разобраться с классами и функциями
1 2 3
macgera
Здравствуйте. Извините, если дергаю зря простым вопросом.

Осваиваю Python, и не все понимаю.. некоторые вещи даже с чтением манов =(

есть файл base.txt и файл со скриптом

Есть такой код.

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

base_data = open('base.txt')

base_line = base_data.readline()

base_list = base_line.split(' ')

var_date = base_list[0]
var_product = base_list[1]
var_price = base_list[2]

sales = {
'date' : var_date,
'product' : var_product,
'price' : var_price
}

print sales
Вот собственно запнулся на чтении из файла. В файле, выполняющем роль бд, данные это строки

20-01-2010 MacBook_Pro_2101 2.11
20-01-2010 player 2.11
20-01-2010 Miiiiih 2.11
20-01-2010 Harman_kardon 2.11
И не пойму как сделать вывод данных всех строк. получается нужно создавать новый словарь, под каждую строку? Подозреваю что проще вытаскивать данные, преобразовывать в список или кортеж, а вывод делать при помощи цикла for?

в любом случае запарился с написанием функции на эту процедуру.

Пробовал сделать так

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

def baseOut(baseName):
base_data = open(baseName)
base_data_line = base_data.readline()
base_list = base_data_line.split(' ')
var_date = base_list[0]
var_product = base_list[1]
var_price = base_list[2]
sales = {
'date' : var_date,
'product' : var_product,
'price' : var_price
}
print sales


print baseOut('base.txt')
print baseOut('bbb.txt')
что бы к разным файлам-базам можно было применить то же самое.. но все равно запинаюсь как сделать чтение и вывод всех строк. =(
expee
Открываешь файл, дальше читаешь все строки в список с помощью метода readlines. Дальше уже работаешь, как хочешь с ними:

items = open('base.txt').readlines()
for i in items:
...
Можешь разбивать строку и использовать по отдельности, или что тебе еще надо.
truporez
у файлового объекта есть метод readlines
base = [item.split() for item in open("base.txt").readlines()]
теперь в base список списков
[['20-01-2010', 'MacBook_Pro_2101', '2.11'], 
['20-01-2010', 'player', '2.11'],
['20-01-2010', 'Miiiiih', '2.11'],
['20-01-2010', 'Harman_kardon', '2.11']]
…но ничего не мешает сделать вместо списка словарь.
macgera
Всем уже спасибо =)!

@truporez а как словарь создать таким же способом? Ключи то не указаны.

По поводу примера я в итоге накрутил такой код

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

def baseGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
print base

def datesGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
for x in base:
print x[0]

def productGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
for x in base:
print x[1]

def priceGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
for x in base:
print x[2]

def paymentGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
prices = [item[2] for item in base]
print prices

paymentGet('base.txt')
при обработке функции paymentGet получаю список из цен. А при попытке сделать сумму..

def paymentGet(baseName):
base = [item.split() for item in open(baseName).readlines()]
prices = [item[2] for item in base]
sum = 0
for x in prices:
print x
не получается.. я так понимаю что элементы списка по умолчанию это строки.. а каким способом преобразовать не понял.

И еще вопрос, можно объединить все эти функции в класс, что бы при выводе присваивать имя продавца к примеру?
Ed
truporez
у файлового объекта есть метод readlines
base = [item.split() for item in open("base.txt").readlines()]
Не учите людей плохому. readlines читает все строки в список и его возвращает.
В данном случае это не нужно, а на больших файлах еще и вредно - напрасно расходуется память.
Достаточно этого:
base = [item.split() for item in open("base.txt")]
open возвращает итератор по строкам файла. Чтение происходит по мере необходимости.
Ed
macgera
@truporez а как словарь создать таким же способом? Ключи то не указаны.
Назначить самому:
data = [dict(zip(("date", "product", "price"), line.split())) for line in test]
По поводу примера я в итоге накрутил такой код
По-моему очень избыточен ваш код. Кроме того, в каждой функции происходит чтение файла, то есть если нужно вызвать две, то будете читать 2 раза одно и то же.
Проще прочитать один раз, а потом обрабатывать:

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

def get_data(baseName):
return [dict(zip(("date", "product", "price"), line.split())) for line in test]

def print_dates(data):
for item in data:
print item["date"]

def print_product(data):
for item in data:
print item["product"]

def print_prices(data):
for item in data:
print item["price"]

def print_payment(data):
print sum([float(item["price"]) for item in data])
Вышеизложенное тоже избыточно в общем.

И еще вопрос, можно объединить все эти функции в класс, что бы при выводе присваивать имя продавца к примеру?
Можно и нужно.
macgera
Спасибо.

Вот блин ну нету в 2-х книгах таких примеров =(
def print_payment(data):
print sum([float(item["price"]) for item in data])
В жизни бы не догадался =(

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

def get_data(baseName):
return [dict(zip(("date", "product", "price"), line.split())) for line in test] #что за мия test?

def print_dates(data): #Переменная data, я честно не понял откуда она и как потом вызывать функцию?
for item in data:
print item["date"]

def print_product(data):
for item in data:
print item["product"]

def print_prices(data):
for item in data:
print item["price"]

def print_payment(data):
print sum([float(item["price"]) for item in data])
Если объединить в класс?

class sales:

def __init__(self, name):
self.name = baseName

def get_data(baseName):
return [dict(zip(("date", "product", "price"), line.split())) for line in baseName] #с test выдает ошибку...

def print_dates(data):
for item in data:
print item["date"]

def print_product(data):
for item in data:
print item["product"]

def print_prices(data):
for item in data:
print item["price"]

def print_payment(data):
print sum([float(item["price"]) for item in data])
тут по идее то только одна не определенная переменная.. это имя файла.. как тогда вызывать функцию print_payment ? зхадать переменную а потом…
DimaBase = sales('base.txt')

DimaBase.print_payment()
так?

и ваш код почему-то выдает ошибку. что я не так делаю?

У меня стоит интерпритатор Python 2.6
Ed
macgera
def print_payment(data):
print sum([float(item["price"]) for item in data])
В жизни бы не догадался =(
А так?:
sum = 0
for item in data:
sum += item["price"]
print sum
def print_dates(data): #Переменная data, я честно не понял откуда она и как потом вызывать функцию?
for item in data:
print item
data - это то, что возвращает get_data
То есть делать нужно как-то так:
data = get_data('base.txt')
print_dates(data)
print_prices(data)
# и так далее
В get_data ошибка. Сорри, не проверял.
Нужно было так:
def get_data(baseName):
return [dict(zip(("date", "product", "price"), line.split())) for line in open(baseName)]
DimaBase = sales('base.txt')
DimaBase.print_payment()
так?
Это зависит от того, какая стоит задача.
Но вообще мне не нравится, когда в класс прибивают гвоздями вывод.
Я бы предложил нечто такое:
sales = Sales(open('base.txt'))
print sales.get_paiment()
print '\n'.join(sales.get_dates())
И соответствующие изменения в get_* функции, чтобы они не выводили ничего, а просто возвращали списки с данными.
macgera
Ed
А так?:
Код:

sum = 0
for item in data:
sum += item
print sum
Так вообщем-то получается все я так и делал, но в данном случае, выдает ошибку, насколько я понимаю что это не число.. вот и ломал голову как преобразовать. В любом случае спасибо! вы мне много пищи для размышления кинули.. а то блин времени много нет.. и в книгах не всегда понятные примеры.. Хороший форум!

Ed
Код:

sales = Sales(open('base.txt'))
print sales.get_paiment()
print ‘\n’.join(sales.get_da
Буду пробовать…

И еще вопрос, по поводу моего кода по классу, ткните на ошибки, кроме “прибить гвоздями вывод”. или вполне сносный код?
Ed
упс, это я ошибся. Я имел в виду это:
sum = 0.0
for item in data:
sum += float(item["price"])
print sum
Просто подумал, что вас смутила конструкция с использованием list comprehensions и развернул ее.
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