[python] simple stuff2

Makc500

Как внутри цикла переходить к обработке следующей строчки?
line.next не хочет.

input_file = 'bird.inp'
f_in = open(input_file, "r")

lines=f_in.readlines
f_in.close

for line in lines:

pilot

continue

Makc500

ну это тоже не то
например, бывает нужно две строчки проскочить

klyv

явным образом получить итератор и играться с ним.

Makc500

А можно на примере? Ввести индекс что ли?

pilot

f.readlines это список. Возьми да сделай цикл for i in range(f.readlines
Если нужен итератор то можно xreadlines, а можно методами не заморачиваться:
no:~/tmp$ cat tmp.txt 
a
b
c
d
e
no:~/tmp$ cat tmp.py
f = open('tmp.txt')

for line in f:
print line
f.next
no:~/tmp$ python tmp.py
a

c

e

Traceback (most recent call last):
File "tmp.py", line 5, in <module>
f.next
StopIteration

klyv

ужас. 2. у тебя сдвигают итератор и for, и next, ты используешь то, что в данном случае файл сам себе итератор, ... в общем, ужас.
http://docs.python.org/lib/typeiter.html - ссылка по теме.

pilot

ужас. 2. у тебя сдвигают итератор и for, и next, ты используешь то, что в данном случае файл сам себе итератор, ... в общем, ужас.

А тебе священный ужас мешает пользоваться фичами языка? :smirk:
A file object is its own iterator, for example iter(f) returns f (unless f is closed). When a file is used as an iterator, typically in a for loop (for example, for line in f: print line the next method is called repeatedly. This method returns the next input line, or raises StopIteration when EOF is hit when the file is open for reading (behavior is undefined when the file is open for writing). In order to make a for loop the most efficient way of looping over the lines of a file (a very common operation the next method uses a hidden read-ahead buffer. As a consequence of using a read-ahead buffer, combining next with other file methods (like readline does not work right.

Ссылка по теме: http://docs.python.org/lib/bltin-file-objects.html

Makc500

ну это понятно, почему в примере в первом посте не предусмотрен переход к след. элементу внутри цикла?

pilot

Непонятно о чем это ты.
Переход к следующему элементу предусмотрен в языке — использованием итератора или слова continue, почему в твоем коде ничего этого нет — ну ты так его написал. :confused:

Makc500

я же написал, итератор не работает:

from math import *
input_file = 'bird.inp'
f_in = open(input_file, "r")

lines=f_in.readlines
f_in.close

for line in lines:
lines.next


File "test.py", line 9, in ?
lines.next
AttributeError: 'list' object has no attribute 'next'

Makc500

нашел

BILL64

ужас нах. зачем пользовать память под весь файл?

cat a.txt
1
12
13
1244
cat 1.py
f = open('a.txt')
a = f.readline

while a:
print a
a = f.readline

f.close


сорри за неактуальность. не выдержал.

klyv

именно этим занимались все уважаемые джентельмены в этом треде. почитай повнимательней.

sergeikozyr

Ну, и если пошла пьянка:

with open ('a.txt') as f:
a = f.readline
while a:
print a
a = f.readline

klyv

чем-таки вам не нравится итератор?..

BILL64

а) из всех предыдущих примеров только один не делал
readlines
б) чем with f = open... лучше f = open(..) бла бла бла?
в) итераторы здесь надо использовать и их используем, но не явно (по сути
readline - и есть метод .next который и есть итератор.

klyv

а) читай внимательней.

BILL64

прочитал. где там больше одного человека до меня не использовали readlines?

klyv

Использовали readlines:


Использовали/предлагали другое:



и тут ты на белом коне "я всё знаю, вы тут всё не так пишете", пишешь тоже самое, что и последние 2 человека.

Makc500

Если чо, там у меня файл был 6 мегабайт всего, поэтому я его в память зачитывал.

klyv

ну ит всё равно нехорошо - системные буфера лучше разберутся, сколько считывать, сколько не считывать.

Makc500

согласен, да

Makc500

Нашел еще один вариант замены сишного ? :
x=(OFF,ON)[y==OFF]

pilot

Что это за бяка?
Надо:

x = (ON if y==OFF else OFF)

slonishka

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

tipnote

Понятно, что можно, только такие хрени надо на этапе "увидел первый раз" сразу забывать, а то потом код обрастает таким говном так, что...

Andbar

Нашел еще один вариант замены сишного ? :
Если вместо ON и первого OFF поставить вызовы функций, они ведь обе выполнятся, в отличие от оператора ? :

Makc500

Так тоже пробовал, но такая шняга в моей версии питона к сожалению не работает.

klyv

обновляйся, если хочешь быть здоров...

Makc500

 Это от меня не зависит. :)

slonishka

нет, ну понятно, что всерьёз этим пользоваться — это все равно,
что один и тот же анекдот десять раз подряд рассказать.
я, кстати, как-то сгенерил для себя вот такую штуку:
res = exp and if_true or if_false

правда нужно, чтобы if_true было истинным (ну т.е. != 0, я так понимаю, если в питоне нет на это доп ограничений).

conv3rsje

обновляйся, если хочешь быть здоров...
Кстати про обновляйся
Может кто сталкивался с подобным глюком
import time, threading, atexit

l = threading.Condition
def f:
l.acquire
l.wait(10)
l.release

def stop:
l.acquire
l.notify
l.release

atexit.register(stop)
t = threading.Thread(target=f)
t.start

try:
time.sleep(10)
#f
finally:
stop

Вроде все в порядке? Ан нет, на линухе (debian) на 2.1 (чуть другой синтаксис 2.4, 2.5 работает на ура
на ОС (FreeBSD 6.3, 7.0) с 2.4 и 2.5 питоном не работает. На OC 4.11 с питоном 2.3 - работает
Что имеется ввиду под работает/не работает
Запускаем и посылаем SIGINT (KeyboardInterrupt). Если все в порядке - скрипт заканчивает свою работу
Если нет - висит 10 секунд и только потом со словами "а тут у тя KeyboardInterrupt был" выходит.
Причем вместо time.sleep можно поставить select.select([], [], [], 10) - тот же эффект
Срабатывает только если поставить l.wait(10). Тогда нормально выходит. Мистика...
upd
Если кому интересно сразу кучу тестов погонять - run.py и sleep.py
Оставить комментарий
Имя или ник:
Комментарий: