Well, almost in one line (if you allow me to import the itertools module):
[ x for x in itertools.takewhile(
lambda line: sync(line) == 0, # <- predicate
open("file.txt")) ] # <- iterable
Example w/o file:
>>> import itertools
>>> def sync(n):
... if n == 3: return -1 # error
... return 0
>>> lines = [1, 2, 3, 4, 5, 6]
>>> [ x for x in itertools.takewhile(lambda x: sync(x) == 0, lines) ]
[1, 2]
But you really should not obscure things, so why not just:
with open("file") as fh:
for line in fh:
if not sync(int(line)) == 0:
break
solved One-liner for calling a function for each line in a file [closed]