Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Как упростить код?


Автор: proDiva 10.10.2006, 10:52
Парни, вот еще один код в тему:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            i=1
            for x in line:
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None

В общем, содержимое файла состоит из блоков (начало блока "К...."), каждый блок - из некоторого количества строк. Нужно первый блок оставить в файле, остальное переписать в другой файл. 
Как переписать код покрасивее и поумнее?))))

Автор: pythonwin 10.10.2006, 11:30
proDiva, ты конечно молодец, но твой код много памяти кушает + кажется не отвечает заданию (дай пожалуйста содержимое файла)

Автор: proDiva 10.10.2006, 11:49
Цитата(proDiva @ 10.10.2006,  10:52)
Парни, вот еще один код в тему:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            i=1
            for x in line:
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None

В общем, содержимое файла состоит из блоков (начало блока "К...."), каждый блок - из некоторого количества строк. Нужно первый блок оставить в файле, остальное переписать в другой файл. 
Как переписать код покрасивее и поумнее?))))

Пжалуйста, но все работает как надо))

Автор: proDiva 10.10.2006, 13:13
Вот мои пояснения к тому, что я пыталась сделать:
Код

def zamena(self, file1, file2):
        """self написала, т.к. функция принадлежит классу, кажется это обязательно, но не уверена
        эта функция - часть программы........ опять-таки если мне нужна функция, 
        обязательно ли создавать класс?"""
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()    # не знала, что файл не надо закрывать, чтобы переоткрыть его в режиме записи
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0    #использую для счетчика блоков, 1й блок в 1й файл, остальные во 2й
        for line in list:
            i=1
            for x in line:
                """этот цикл использую только для того чтобы определить 1й символ строки
                     если буква К, значит эта строка - начало очередного блока"""
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None    #тоже думала, что return должен завершать функцию

Автор: setq 10.10.2006, 14:58
Создавать класс необязательно.

Код

def f():  # просто функция
    ...


Файлы можно явно не закрывать (если конечно это не JPython).

Что делает твой код, я не понимаю. Кроме того, что исходный файл весь прочитывается в память, а она, как сказал классик, не резиновая.

Успехов.

Автор: proDiva 10.10.2006, 16:01
Цитата(setq @  10.10.2006,  14:58 Найти цитируемый пост)
исходный файл весь прочитывается в память

а как по-другому запомнить его содержимое?

Автор: setq 10.10.2006, 16:21
Ну никак в общем. Либо в память, либо в другой файл. Возможно, что задачу, о которой идёт речь в первом посте, проще решить с помощью модуля mmap, но автор уже наверно нашёл решение (судя по галке).

Автор: proDiva 10.10.2006, 16:49
а можно как-нибудь упростить этот вложенный цикл? он нужен только для определения первого символа строки.... может лучше представить строку списком и вытащить первый символ? хотя в количестве строк кажется оба способа равноценны smile 

Автор: proDiva 10.10.2006, 19:24
Модераторам:
Спасибо за выделение темы. Еще вопрос: нельзя вернуть мой статус новичка?)) Чё-то я себя еще не ощущаю "шустрым" smile 
В очередной раз извиняюсь за оффтоп...... ну не могут девушки не отвлекаться от основной темы разговора)))

Автор: setq 11.10.2006, 00:01
Цитата(proDiva @  10.10.2006,  16:49 Найти цитируемый пост)
а можно как-нибудь упростить этот вложенный цикл?


Убрать его) Вам для проверки нужен только первый символ сторки? Воспользуйтесь line[0].

Автор: Cr@$h 11.10.2006, 01:17
Цитата(proDiva @  10.10.2006,  20:24 Найти цитируемый пост)
Еще вопрос: нельзя вернуть мой статус новичка?)) Чё-то я себя еще не ощущаю "шустрым"

Только божей волей это возможно, но есть вариант, http://forum.vingrad.ru/index.php?act=Help&CODE=01&HID=20.
Да, теперь proDiva шустрый  smile Ничего, это тоже хорошо.

Автор: FunnyFalcon 11.10.2006, 09:15
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            if line[0] == 'К':
                k+=1
            if k==1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()

f.close() не убирай! Мало ли на каком питоне будешь програмировать, а JPython, IronPython не считают ссылки, и фаил еще долго открытым валяться будет.

Еще вариант:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        it, line = list.iter(), None
        for line in it:
              if line[0]=='К':
                   break
              f2.write(line)
        f1.write(line)
        for line in it:
              if line[0]=='K':
                  break
              f1.write(line)
        f2.write(line)
        f2.writelines(it) 
        f1.close()           
        f2.close()
        return None


Автор: proDiva 11.10.2006, 12:05
Я нашла другой вариант:
Код

def zamena(self, file1, file2):
    f1=open(file1, "r")
    list=f1.readlines()
    f1=open(file1, "w")
    f2=open(file2, "w")
    numb=map(list.index, [line for line in list if ord(line[0]) == 138])
    k=numb[1]
    f1.writelines([line for line in list[:k]])
    f2.writelines([line for line in list[k:]])
    f1.close()
    f2.close()

Парни, ну теперь Вы можете сказать, что стиль функционального программирования выдержан?))

Автор: pythonwin 11.10.2006, 12:26
Цитата(Cr@$h @  11.10.2006,  08:17 Найти цитируемый пост)

Только божей волей это возможно, но есть вариант, посмотри.
Да, теперь proDiva шустрый  smile Ничего, это тоже хорошо. 

и сколько раз в год можно менять статус, если есть 2000 постов?

Добавлено @ 12:28 
Цитата(setq @  10.10.2006,  23:21 Найти цитируемый пост)
Ну никак в общем. Либо в память, либо в другой файл. Возможно, что задачу, о которой идёт речь в первом посте, проще решить с помощью модуля mmap, но автор уже наверно нашёл решение (судя по галке).


можно и компромис - первый блок в переменную, а все остальное в во второй файл, а потом очистить первый файл и записать в него переменную. smile

Автор: proDiva 11.10.2006, 13:17
Цитата(pythonwin @  11.10.2006,  12:26 Найти цитируемый пост)
можно и компромис - первый блок в переменную, а все остальное в во второй файл, а потом очистить первый файл и записать в него переменную. 

Ну а на фига в данном случае такие усилия? Входящий файл не такой большой. С памятью ничего страшного не случится из-за каких-то 60-ти строчек, и побольше сохраняли)))

Автор: proDiva 11.10.2006, 15:47
Ну вот, сама нашла компактный вариант кода, и никто не похвалил smile  закрываю тему

Автор: pythonwin 11.10.2006, 15:51
Цитата(proDiva @  11.10.2006,  22:47 Найти цитируемый пост)
Ну вот, сама нашла компактный вариант кода, и никто не похвалил smile  закрываю тему 

репу смотри smile

Автор: proDiva 11.10.2006, 15:59
Цитата(pythonwin @  11.10.2006,  15:51 Найти цитируемый пост)
репу смотри smile

какую-такую репу?))

Автор: dvska 11.10.2006, 17:17
Цитата(proDiva @  11.10.2006,  15:47 Найти цитируемый пост)
Ну вот, сама нашла компактный вариант кода, и никто не похвалил smile  закрываю тему 

Брааааавооооо, proDiva!!!!! smile Брааааавооооо!!!!!
    

А так?
Код

blocks = open('in.txt').read().split(')(')    # TL091618.TXT
open('out1.txt', "w").write(blocks[0]+')('+'\n')
open('out2.txt', "w").write( ')('.join(blocks[1:])[1:] )

Автор: Cr@$h 11.10.2006, 20:14
Цитата(pythonwin @  11.10.2006,  13:26 Найти цитируемый пост)
и сколько раз в год можно менять статус, если есть 2000 постов?

Сколько угодно.
Да, жалко, что все слова-статусы в мужском роде написаны. Это уже избитая тема.


Добавлено @ 20:18 
Цитата(proDiva @  11.10.2006,  16:59 Найти цитируемый пост)
какую-такую репу?))

У тебя: Репутация: 6.

Автор: dvska 11.10.2006, 20:53
proDiva, http://web-brains.com/archives/11

Автор: proDiva 12.10.2006, 08:13
Цитата(dvska @  11.10.2006,  17:17 Найти цитируемый пост)
Брааааавооооо, proDiva!!!!! smile Брааааавооооо!!!!!

 smile  вот теперь я довольна))) Кстати, отличный вариант....... я зациклилась на букве К и не подумала, что можно найти разделитель блоков))

Добавлено @ 08:15 
Цитата(Cr@$h @  11.10.2006,  20:14 Найти цитируемый пост)
Да, жалко, что все слова-статусы в мужском роде написаны. Это уже избитая тема.

А для кого тут нужен статус в женском роде? меня в мужском роде абсолютно устраивает smile 

Автор: FunnyFalcon 12.10.2006, 09:44
proDiva молодец, конечно. НО НЕ СТОИТ ПЕРЕОПРИСВАИВАТЬ ИМЕНА ВСТРОЕННЫХ ФУНКЦИЙ/ТИПОВ (я имею в виду list).
Кроме того проще (и эфектвнее) сделать без map:
Код

def zamena(self, file1, file2):
    f1=open(file1, "r")
    list1=f1.readlines()
    f1=open(file1, "w")
    f2=open(file2, "w")
    k = list1.index([line for line in list if ord(line[0]) == 138][1])
    f1.writelines([line for line in list1[:k]])
    f2.writelines([line for line in list1[k:]])
    f1.close()
    f2.close()

А совсем правильно:
Код

def zamena(self, file1, file2):
    f1=open(file1, "r")
    list1=f1.readlines()
    f1=open(file1, "w")
    f2=open(file2, "w")
    try:
        k = list1.index([line for line in list1 if ord(line[0]) == 138][1])
        f1.writelines([line for line in list1[:k]])
        f2.writelines([line for line in list1[k:]])
    except IndexError:
        f1.writelines(list1)
    f1.close()
    f2.close()

Но все-равно, спасибо за урок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)