A question about yield

chad cdalten at gmail.com
Sun Nov 7 12:34:48 EST 2010


I have an input file named 'freq' which contains the following data

123 0

133 3
146 1
200 0
233 10
400 2


Now I've attempted to write a script that would take a number from the
standard input and then
have the program return the number in the input file that is closest
to that input file.

#!/usr/local/bin/python

import sys

def construct_set(data):
    for line in data:
        lines = line.splitlines()
        for curline in lines:
            if curline.strip():
                key = curline.split(' ')
                value = int(key[0])
                yield value

def approximate(first, second):
    midpoint = (first + second) / 2
    return midpoint

def format(input):
    prev = 0
    value = int(input)

    with open("/home/cdalten/oakland/freq") as f:
        for next in construct_set(f):
            if value > prev:
                current = prev
                prev = next

        middle = approximate(current, prev)
        if middle < prev and value > middle:
            return prev
        elif value > current and current < middle:
            return current

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print >> sys.stderr, "You need to enter a number\n"
        sys.exit(1)

    nearest = format(sys.argv[1])
    print "The closest value to", sys.argv[1], "is", nearest


When I run it, I get the following...

[cdalten at localhost oakland]$ ./android4.py 123
The closest value to 123 is 123
[cdalten at localhost oakland]$ ./android4.py 130
The closest value to 130 is 133
[cdalten at localhost oakland]$ ./android4.py 140
The closest value to 140 is 146
[cdalten at localhost oakland]$ ./android4.py 146
The closest value to 146 is 146
[cdalten at localhost oakland]$ ./android4.py 190
The closest value to 190 is 200
[cdalten at localhost oakland]$ ./android4.py 200
The closest value to 200 is 200
[cdalten at localhost oakland]$ ./android4.py 205
The closest value to 205 is 200
[cdalten at localhost oakland]$ ./android4.py 210
The closest value to 210 is 200
[cdalten at localhost oakland]$ ./android4.py 300
The closest value to 300 is 233
[cdalten at localhost oakland]$ ./android4.py 500
The closest value to 500 is 400
[cdalten at localhost oakland]$ ./android4.py 1000000
The closest value to 1000000 is 400
[cdalten at localhost oakland]$

The question is about the construct_set() function.

def construct_set(data):
    for line in data:
        lines = line.splitlines()
        for curline in lines:
            if curline.strip():
                key = curline.split(' ')
                value = int(key[0])
                yield value

I have it yield on 'value' instead of 'curline'. Will the program
still read the input file named freq line by line even though I don't
have it yielding on 'curline'? Or since I have it yield on 'value',
will it read the entire input file into memory at once?

Chad



More information about the Python-list mailing list