2015-11-13 3 views
3

У меня была задача написать функцию, которая сравнивает длину слов в файле с целым числом и затем возвращает все слова этого размера. Ответ, который я получил, был почти идентичны, за исключением я не включал string.strip(), как они сделали:String.strip() Важность

def get_words(dictfile,size): words = [] 
    for word in open(dictfile).readlines(): 
     word = word.strip() #this is the only bit I didn't have in my own code 
     if len(word) == size: 
      words.append(word) 
    return words 

Would оставив .strip() из реально изменить вывод этой функции, или это просто хорошо практиковать его при работе с файлами?

EDIT: Ввод будет файлом, в котором каждое слово является одной строкой, например.

a 
abandon 
abbey 
abdominal 

и размер как раз любое целое число

+0

Не то, что это не по теме, но это, кажется, больше [обзор кода] (ХТ ТПС: //codereview.stackexchange.com/). Будущая ссылка, по крайней мере, если вы не знали об этом сайте. –

ответ

1

Это может иметь эффект в зависимости от вашего входа. Это значит, что лучше всего иметь его там.

Учитывая, что вы читаете по одному слову в строке, существует strip(), чтобы удалить ведущие или завершающие пробелы. Например .:

word1 
    word2 
word3 

word2 покажет большую длину, чем другие без strip(). Это также относится и если пробелы приходят потом, что также гораздо труднее обнаружить, посмотрев на входном файле (я даже не могу найти хороший способ, чтобы представить его визуально в этом ответе)

Edit: Как @ Two-Bit Alchemist указал в комментариях, чтобы символ \n был лишен, иначе в противном случае у вас будет ошибка «вне игры». Этот символ используется как конец строки, поэтому мы обычно не замечаем людей, но интерпретатор Python учитывает это.

+1

Существует ошибка «один за другим», связанная с тем, что здесь не используется 'strip()', существует ли конечный пробел или нет, потому что он подсчитывает '' \ n'' как часть «длины слова». –

+0

Ты совершенно прав, не уверен, как я пропустил это ... Спасибо, я отредактирую, чтобы исправить. – Knells

+1

'trailing' означает нижеследующий, не предшествующий. Я знаю, что трейлеры фильма предшествуют выпуску фильма, но раньше они показывались как реклама * после * основной функции. –

3
def get_number_of_words(filename, size): 
    words = [] 
    with open(filename) as dictfile: 
     for line in dictfile: 
      word = line.strip() 
      if len(word) == size: 
       words.append(word) 
    return words 

Я переписал вашу функцию с некоторыми более «побуждающими а-лопата-а-лопату» имена переменных, чтобы выяснить, что происходит. Давайте поговорим о некоторых вещах я замененные:

  • for word in open(dictfile).readlines():

При открытии файла анонимно этот путь, вы выбросили вашу ссылку на объект файла, который вы будете использовать, чтобы закрыть его. Кроме того, вы без необходимости читаете весь файл в памяти с помощью readlines. Вместо этого я предпочитаю менеджер контекста with, который позволяет сохранить ссылку на дескриптор файла (с использованием as) и автоматически закрывает файл после того, как вы закончите работу, которую вы пренебрегли. (Технически Python сделает это для вас в конце концов, но это по-прежнему хорошая привычка.)

Обратите внимание, что я перебираю непосредственно файл for line in dictfile - это намного эффективнее, чем передняя загрузка всего файла в память.


Что касается вашего вопроса заголовка, это абсолютно необходимо, чтобы позвонить line.strip() здесь, если вы хотите для этой функции, чтобы обеспечить точный подсчет. Каждая строка в файле, который вы перебираете, содержит символ '\n' (новая строка), который подсчитывается len, так как он является частью строки.Как вы это делали, если бы вы спросили функцию, сколько слов длиной 4 было в файле, это даст вам все слова длины 3 (4-й символ - '\n', который обычно не считается человеком).

+0

К сожалению, извините, ребята. Благодарю. Это то, что я получаю для ввода кода здесь, а не в интерпретаторе: P –

1

Добавление еще несколько точек на вершине @Knells ответа, String.Strip() функции используется не только для удаления конечных пробелов, когда никто не предусмотрена в качестве аргумента для полосы, он может удалить любой список символов или символа, который вы указать в качестве аргументов от конца и начала строка для напр.

str1 = " Saltharion " 
//will result in "Saltharion" 
str1.Strip() 

str2 = "ooHow are yuoo" 
// Will result in "How are yu", here the char "o" at the `end and beginning` is stripped from string 
str2.strip("o") 

str3 = "ar How are you, I am good are" 
// will result in "How are you, I am good", here it will not strip occurrence of "are" it will strip occurrence of "a" "r" "e" from end and beginning 
str3.strip("are") 

Пожалуйста, смотрите в к документации here