[Tutor] Diamond Equivalent

Michael Sparks zathras at thwackety.com
Fri Sep 23 21:15:03 CEST 2005


On Thursday 22 September 2005 23:46, kim.d at tesco.net wrote:
> I am coming to Python from Perl. Does Python have anything like the diamond
> operator found in Perl?

The correct answer is not really no, but you can manually perform the
same tasks. For those who don't know perl, <> is an incredibly useful
little operator that does some really wierd and wonderful things :-)

(That said, I don't think I'd like a magic operator like this in python :-)

If you want to do this:

@a = <>;

The equivalent is probably best expressed thus:

def diamond_array():
# Note, untested...
   import sys
   if len(sys.argv ==1):
      return sys.stdin.readlines()
   else:
      result = []
      for file in sys.argv[1:]:
         try:
            file = open(file)
            result.extend(file.readlines())
         except IOError:
            pass
      return result

a = diamond_array()


If however you want to do the equivalent of:

while ($line = <>) {
   ...
}

That mode of <> probably best equates to this:

for line in diamond_lines():
   ....

def diamond_lines():
# Note, untested...
   import sys
   if len(sys.argv ==1):
      for line in sys.stdin.xreadlines():
         yield line
   else:
      for file in sys.argv[1:]:
         try:
            file = open(file)
            for line in file.xreadlines():
                yield line
         except IOError:
            pass

As for this idiom:

while(1) {
   $line = <>;
   ...
}

That probably matches best to this:

diamond_iterator = diamond_lines() # same function as above
while 1:
    line = diamond_iterator.next()

Whereas this kind of trick:

$firstline = <>;
@remaining_lines = <>;

Would map to this: (using the functions above)

diamond_iterator  = diamond_lines() 
firstline = diamond_iterator.next()
remaining_lines = list(diamond_iterator.next())

Or to show a relatively common perl idiom:

$firstline, @remaining_lines= <>,<>;

Maps to:

diamond_iterator  = diamond_lines() 
firstline,remaining_lines = diamond_iterator.next(), list(diamond_iterator.next())

Best Regards,


Michael.




More information about the Tutor mailing list