[Tutor] code review please

Kent Johnson kent37 at tds.net
Wed Dec 28 05:29:12 CET 2005


Eakin, W wrote:
> The code follows, so any comments and/or suggestions as to what I did 
> right or wrong, or what could be done better will be appreciated.

> def fileScramble(fileName):
>     newFile = file('scrambled.txt', 'w')
>     newRow = ''
>     for line in fileName:
>         newRow = ''
>         tempList = line.split(' ')
>         for word in tempList:
>             newRow = newRow + ' ' + wordScramble(word)
>         newRow = newRow + '\n'
>         newFile.write(newRow)

This seem pretty verbose to me. Using tempList doesn't IMO add anything, 
it might as well be
   for word in line.split(' '):
or
   for word in line.split():
since you probably want to split on tabs also and this will strip the 
trailing newlines as a bonus.

I usually prefer a list comprehension to an accumulation loop when 
possible so I would actually write it as
   newWords = [ wordScramble(word) for word in line.split() ]
   newRow = ' '.join(newWords) + '\n'

or even
   newRow = ' '.join(wordScramble(word) for word in line.split()) + '\n'

though that might be a little too terse for easy comprehension.

>     newFile.close()
> 
> 
> def wordScramble(word):
>     punctuation = ['.', ',', ':', ';', '(', ')']
>     if len(word) < 4:
>         return word
>     elif len(word) == 4 and word[-1] in punctuation or word[0] in 
> punctuation:
>         return word
>     elif len(word) == 4:
>         word = word[0] + word[2] + word[1] + word[3]
>         return word

Rather than repeating the test for len(word) == 4, I would write

     elif len(word) == 4:
       if word[-1] in punctuation or word[0] in punctuation:
         return word
       else:
         word = word[0] + word[2] + word[1] + word[3]
         return word

This also breaks up the long conditional that Danny complained about.

>     else:
>         (fCut, fLetter) = getLetter(word, 0, 'forward')
>         (lCut, lLetter) = getLetter(word, -1, 'back')
>         tempWord = list(word)
>         del tempWord[:fCut + 1]
>         del tempWord[lCut:]

I think this is the same as
   tempWord = list(word[fCut+1:lCut])

>         random.shuffle(tempWord)
>         middleString = "".join(tempWord)
>         scrambledWord = fLetter + middleString + lLetter
>         return scrambledWord
> 
> 
> def getLetter(string, number, direction):

I found it very hard to understand what this function does. A better 
name and a comment would help a lot. You might consider having separate 
getFirstLetter() and getLastLetter() since much of getLetter() is taken 
up with the conditionals and compensating for trying to do two things.

def getFirstLetter(string, number=0):
     if string[number].isalpha() == True:
         return (number, string[:number + 1])
     else:
         return getFirstLetter(string, number + 1)

Even better would be to use a simple loop to find the index of the first 
letter, and split the string into three sections in the caller.

BTW thinking of writing this as a loop brings to mind some problems - 
what will your program do with 'words' such as 555-1212 or "Ha!" ?

>     if direction == 'forward':
>         increment = 1
>     else:
>         increment = -1
>     if string[number].isalpha() == True:
>         if direction == 'forward':
>             return (number, string[:number + 1])
>         else:
>             return (number, string[number:])
>     elif string[number].isalpha() == False:
>         return getLetter(string, number + increment, direction)
> 
> 
> if __name__ == "__main__":
>     try:
>         if sys.argv[1].isspace() == True:
>             print "No file was given to the program to 
> process.\n<----------> Program quitting <---------->\n"
>         else:
>             try:    
>                 f = open(sys.argv[1])
>                 fileScramble(f)
>                 f.close()
>             except IOError:
>                 print "That file does not exist, or you do not have 
> permission to access it.\n<----------> Program quitting <---------->\n"
>     except IndexError:
>         print "No file was given to the program to 
> process.\n<----------> Program quitting <---------->\n"
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor




More information about the Tutor mailing list