在Python中传递变量

时间:2012-02-09 01:08:45

标签: python

我一直在网上搜索一段时间,似乎找不到任何东西。我基本上学习了几种语言,我只是想用不同的语言重新创建一个程序。

def read_one_file():
    f = open('C:\Python27\inventory.dat', 'r')
    invid = f.readline()
    stock = f.readline()
    published = f.readline()
    price = f.readline()
    invtype = f.readline()
    title = f.readline()
    author = f.readline()
    return invid, stock, published, price, invtype, title, author

read_one_file()

print "Update Number In Stock"
print "----------------------"
print "Item ID: ", invid

基本上我正在尝试读取文件,将数据吸收到变量中然后将这些变量传递给main(类?)。当我归还它们时,它们仍然无法打印。当我在read_one_file之外初始化它们时,它们仍然没有返回正确的东西。

5 个答案:

答案 0 :(得分:5)

您需要在某处存储read_one_file()的结果。你真的是什么 使用return语句创建结果元组。然后是你 调用read_one_file时必须解压缩该元组。这是一个例子:

(invid, stock, published, price, invtype, title, author) = read_one_file()

print "Item ID:", invid

这种语法正在执行一种称为“模式匹配”的功能及其功能 分解read_one_file返回的元组并为每个元组命名 元素在里面。我在这里添加了括号以使其更清楚 read_one_file正在返回一个元组,但你可以轻松地编写它 这样:

invid, stock, published, price, invtype, title, author = read_one_file()

这一切都很好,但实际上,这是回归事情的一种坏方法 从你的功能。如果你想要从a返回很多变量 像这样的功能,dict可能是一个更好的方法。还有,你会的 可能想要使用with语句来确保您的文件已关闭并清理 一旦你完成它就适当地完成。这是您的代码的样子 使用该策略:

def read_one_file():
    with open('C:\Python27\inventory.dat', 'r') as f:
        return dict(invid = f.readline().strip(),
                    stock = f.readline().strip(),
                    published = f.readline().strip(),
                    price = f.readline().strip(),
                    invtype = f.readline().strip(),
                    title = f.readline().strip(),
                    author = f.readline().strip())

results = read_one_file()

print "Update Number In Stock"
print "----------------------"
print "Item ID: ", results['invid']

编辑:我更改了上面的代码以使用.strip(),因为(正如@NiklasB。指出的那样),新行仍然包含在readline中。

答案 1 :(得分:4)

对于您似乎想要做的事情,这有点清洁。注意我假设您的inventory.dat文件不是很大,并且至少有7行。

def read_one_file(fname=r'C:\Python27\inventory.dat'):
  with open(fname) as f:
    spam = [line.strip() for line in f.readlines()]
  keys = ['invid', 'stock', 'published', 'price', 'invtype', 'title', 'author']
  inventory_item = dict(zip(keys, spam[:len(keys)]))
  return inventory_item

d = read_one_file()

print "Update Number In Stock"
print "----------------------"
print "Item ID: ", d['invid']

原始代码的更改细分:

  • fname作为默认参数传递,而不是硬编码到函数
  • fname字符串变成带有r前缀的r'raw string',这样可以防止错误地处理反斜杠转义(例如,如果您的文件名为ninventory.dat,则为{{1}作为Windows中的路径分隔符,如果使用普通字符串,则会在文件名中获得换行符)
  • 使用上下文管理器打开文件,以确保正确关闭。 google on python's与政治家了解详情。
  • \是一个列表解析,用于从数据中删除尾随换行符,并将这些行存储在名为[line.strip() for line in f.readlines()]的列表中。
  • 定义的键列表,然后使用python spam将文件的前n行映射为键的值。
  • dict将列表切片到前n个项目,其中n是上面声明的键数。
  • spam[:len(keys)]只需将2个迭代(在本例中为键和文件中的值)组合成一个可迭代的元组,这是创建新zip时可接受的形式之一。
  • dict将读取的文件结果存储到变量中。在你的代码中,这是因为没有引用所持有的函数的返回值而丢失。
  • d = read_one_file()访问存储在dict d['invid']中的键'invid'的值。您应该类似地访问其他值。

答案 2 :(得分:1)

这应该有效:

def read_one_file():
    f = open('C:\Python27\inventory.dat', 'r')
    invid = f.readline()
    stock = f.readline()
    published = f.readline()
    price = f.readline()
    invtype = f.readline()
    title = f.readline()
    author = f.readline()
    return invid, stock, published, price, invtype, title, author

invid, stock, published, price, invtype, title, author = read_one_file()

print "Update Number In Stock"
print "----------------------"
print "Item ID: ", invid

基本上,你从函数中返回所谓的变量“元组”并将其分配给主程序中变量的“元组”。他们被命名为同一事实的事实对该计划并不重要。

答案 3 :(得分:1)

另一种选择是在函数调用中传递字典,然后从dict中访问变量:

read_file_dict = {}

def read_one_file(some_dict):
    ...
    some_dict['invid'] = file.readline()
    some_dict['stock'] = file.readline()
    ...

运行功能:

read_one_file(read_file_dict)

然后访问变量(dict条目):

read_file_dict['invid']

答案 4 :(得分:0)

简短的回答:正如其他人所说的那样,你需要打开你要返回的元组,然后才能获得这些值:

    invid, stock, published, price, invtype, title, author = read_one_file()

答案很长:这可能有点长,但请耐心等待,因为它是理解各种编程语言如何工作的重要信息。您遇到的问题是了解范围,某些范围内变量的生命周期以及如何在两个不同范围之间传输变量。我将尽力触及其中的每一个,以及它与您的问题的关系。

范围本质上是程序的一部分,您声明的某些变量将存在于该部分中。定义函数时:

    def read_one_file():
        f = open('C:\Python27\inventory.dat', 'r')
        invid = f.readline()
        stock = f.readline()
        published = f.readline()
        price = f.readline()
        invtype = f.readline()
        title = f.readline()
        author = f.readline()
        return invid, stock, published, price, invtype, title, author

您定义了范围。变量invid,stock,published,price,invtype,title和author都存在于该函数中,并且一旦该函数终止就不再存在。 Python恰好是范围的可视化器,因为它依赖于空格/制表符。新的缩进级别定义了一个新的范围。

为了从函数范围中获取变量/值,您可以像在函数中一样返回它。但是程序中调用该函数的部分必须在其自己的作用域中指定变量,这些变量将接收函数返回的值。 (要接收数据,请将变量分配给函数的结果:var = function()

在您发布的代码中,您调用了read_one_file(),但没有为其返回的值分配任何变量。当您尝试访问其中一个您认为要返回的值时:

    print "Update Number In Stock"
    print "----------------------"
    print "Item ID: ", invid

invid在技术上不是read_one_file()之外的变量,因此会发生错误。

关键是返回的变量不会按名称自动将它们传递给被调用者的范围(调用该函数的代码)。您必须在被调用者中指定一个新变量才能接收返回的值。

希望这会有所帮助:)