Базовый питон. Быстрый вопрос относительно вызова функции - PullRequest
0 голосов
/ 14 апреля 2009

У меня есть основная проблема в Python, и я был бы рад за некоторую помощь: -)

У меня есть две функции. Тот, который преобразует текстовый файл в словарь. И тот, который разбивает предложение на отдельные слова:

(это функция doc.txt)

def autoparts():

    list_of_parts= open('list_of_parts.txt', 'r')
    for line in list_of_parts:
        k, v= line.split()
        list1.append(k)
        list2.append(v)

    dictionary = dict(zip(k, v))

def splittext(text):
    words = text.split()

    print words

Теперь я хочу сделать программу, которая использует эти две функции.

(это программа.txt)

from functiondoc import *

# A and B are keys in the dict. The values are 'rear_bumper' 'back_seat'
text = 'A B'    # Input

# Splits the input into separate strings.
input_ = split_line(text)

Вот часть, которую я не могу понять правильно. Мне нужно использовать функцию autoparts для вывода значений (rear_bumper back_seat), но я не уверен, как вызвать эту функцию, чтобы она это сделала. Я не думаю, что это так сложно. Но я не могу понять это ...

С уважением,

Th

Ответы [ 6 ]

4 голосов
/ 14 апреля 2009

Некоторые быстрые очки:

  • Вы не должны называть исходные файлы Python ".txt", вы должны использовать ".py".
  • Ваши отступы выглядят неправильно, но это может быть просто переполнение стека.
  • Вам нужно вызвать функцию autoparts(), чтобы настроить словарь.
  • Функция autoparts(), вероятно, должна возвращать словарь, чтобы его можно было использовать другим кодом.
  • При open текстовом файле следует использовать спецификатор режима t. На некоторых платформах низкоуровневый код ввода-вывода должен знать, что он читает текст, поэтому вам нужно сообщить об этом.
3 голосов
/ 14 апреля 2009

Как уже отмечали люди, вам нужно использовать расширение py для исходных файлов Python. Ваши файлы станут «functiondoc.py» и «program.py». Это заставит ваши import functiondoc работать правильно (если они находятся в одном каталоге)

Самая большая проблема с функцией autoparts заключается в том, что вы никогда ничего не возвращали. Другая большая проблема в том, что вы использовали неправильную переменную ..

for line in list_of_parts:
    k, v = line.split()
    list1.append(k)
    list2.append(v)

# k and v are now the last line split up, *not* the list you've been constructing.
# The following incorrect line:
dictionary = dict(zip(k, v))
# ...should be:
dictionary = dict(zip(list1, list2))
# ..although you shouldn't use zip for this:

Вы почти никогда не должны использовать zip, бывают случаи, когда это может быть полезно, но для создания простого диктанта это неправильно .. Вместо того чтобы делать ..

for line in list_of_parts:
    ...
dictionary = dict(zip(k, v))

.. просто создайте пустой dict перед циклом, затем выполните mydict [key_variable] = value_variable

Например, как я мог написать функцию ..

def autoparts():
    # open() returns a file object, not the contents of the file,
    # you need to use .read() or .readlines() to get the actual text
    input_file = open('list_of_parts.txt', 'r')
    all_lines = input_file.read_lines() # reads files as a list (one index per line)

    mydict = {} # initialise a empty dictionary

    for line in list_of_parts:
        k, v = line.split()
        mydict[k] = v

    return mydict # you have to explicitly return stuff, or it returns None
2 голосов
/ 14 апреля 2009

В дополнение ко всем другим подсказкам и советам, я думаю, что вы упускаете что-то важное: ваши функции на самом деле должны вернуть что-то.

Когда вы создаете autoparts() или splittext(), идея заключается в том, что это будет функция, которую вы можете вызывать, и она может (и должна) вернуть что-то.

Как только вы выясните, какой вывод вы хотите получить от своей функции, вам нужно поместить его в оператор return.

Например, если вы хотите splittext вернуть список слов, а не печатать их, вам понадобится строка return words. Если вы хотите, чтобы ваш autoparts возвратил созданный вами словарь, вы должны использовать return dictionary.

Чтобы быть более точным (и ответить на ваш комментарий / вопрос ниже): вы не хотите «возвращать функцию, которая составляет словарь»; Вы хотите вернуть словарь внутри функции. Итак, последняя строка вашей функции должна быть return dictionary (внутри функции!) См., Например, (принято!) Решение из dbr, выше.

Я думаю, вам нужно вернуться к началу и прочитать книгу или веб-сайт о питоне в частности и программировании в целом, так как вы немного устали от некоторых концепций. Один хороший (другие доступны, конечно) http://diveintopython3.ep.io/

1 голос
/ 14 апреля 2009

Сначала не создавайте списки, просто перейдите прямо к словарю:

parts_dict={}
list_of_parts = open('list_of_parts.txt', 'r')
for line in list_of_parts:
        k, v = line.split()
        parts_dict[k] = v

Кроме того, эти ключи уникальны? Потому что если не некоторые значения будут перезаписаны.

0 голосов
/ 14 апреля 2009

Вот самый простой способ сделать это:

def filetodict(filename):
    return dict(line.split() for line in open(filename))

parts = filetodict("list_of_parts.txt")
print parts

Вот вывод:

{'a': 'apple', 'c': 'cheese', 'b': 'bacon', 'e': 'egg', 'd': 'donut'}

Содержимое файла:

a apple
b bacon
c cheese
d donut
e egg
0 голосов
/ 14 апреля 2009

Есть много проблем с тем, что вы уже написали, но ваш вопрос состоял в том, как вызвать функцию автозапчастей. Вот как; во-первых, переименуйте ваши файлы в functiondocs.py и program.py - они являются python, поэтому сделайте их файлами python.

Далее, чтобы вызвать функцию автозапчастей, вы просто измените свой основной список программ с:

from functiondoc import *

# A and B are keys in the dict. The values are 'rear_bumper' 'back_seat'
text = 'A B'    # Input

# Splits the input into separate strings.
input_ = split_line(text)

до:

from functiondoc import *

# Call the autparts function
autoparts()

По-моему, похоже, что вы просите нас сделать домашнее задание по КС ... но, может быть, я просто циничен;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...