Использование метода Ларсмана достаточно хорошо.Если вы действительно хотите использовать функцию scanf и, что наиболее важно, не хотите читать всю строку .Попробуйте, это может быть медленно, хотя.
import re
import sys
class Pin:
formatDict = {'%d': r'(\d+)', '%f': r'(\d+\.?\d*)'}
def __init__(self, input=sys.stdin):
self.input = input
def scanf(self, format):
# change the C style format to python regex
for a, b in self.formatDict.iteritems():
format = format.replace(a, b)
patt = re.compile('^\\s*%s$'%format, re.M)
buf = ''
matched = 0
while 1:
c = self.input.read(1)
if not c: break
buf += c
g = patt.match(buf)
if g:
# matched, but there may be more to match, so don't break now
matched = 1
matchedGroup = g
elif matched:
# the first unmatch after a match, seek back one char and break now
self.input.seek(-1, 1)
break
if matched:
return tuple(eval(x) for x in matchedGroup.groups())
scanf = Pin(open('in', 'r')).scanf
print scanf('%d %d')
print scanf('%f %f')
Уродливо, но интересно, верно?