簡體   English   中英

將文件和值作為參數傳遞給python中的函數

[英]passing files and values as parameter to a function in python

我是一個蟒蛇新手。 我正在嘗試運行這個簡單的 python 示例。 我希望將文件和某些值作為參數傳遞給我的函數 latcalc()。 誰能建議我如何將我的文件和值作為參數傳遞。 或者有沒有更好的方法/方法來做這些事情。

#!/usr/bin/python

# include the constants

min_length = 1
max_length = 30


# delays

delay = 100

# Speed of light 

c_vaccum = 3e8

global filename1
global filename2
global filename3

def openfiles():

    filename1 = open("file1.txt", "w")
    filename2 = open("file2.txt", "w")
    filename3 = open("file3.txt", "w")

def latcalc(filename,target_name,vf):


    target_name = 0

    for length in range(min_length, max_length):
            if length < 2:
                    target_name += (length/(vf * c_vaccum))
            elif length == 2:
                    target_name += delay
            else:
                    target_name = target_name

            myline="%s\t%s\n" % (length, target_name)
            filename.write(myline)


openfiles()
latcalc(filename1,lat40,0.4)
latcalc(filename2,lat80,0.8)
latcalc(filename3,lat100,1)

我會創建一個小類(給它一個有用的名字)來封裝你的數據。 如果您的文件增長,您只需更改create_lats

min_length = 1
max_length = 30

# delays
delay = 100

# Speed of light
c_vaccum = 3e8

#Little class to keep our data in one place 
class Lat:
    def __init__(self, filename, factor):
        self.filename = filename
        self.factor = factor
        self.file = open(filename, "w") #let the class open the file


#now our function needs only one parameter, neat!
def latcalc(lat):
    target_name = 0

    for length in range(min_length, max_length):
        if length < 2:
            target_name += (length / (lat.factor * c_vaccum)) #acces the class variable
        elif length == 2:
            target_name += delay
        else:
            target_name = target_name

        myline = "%s\t%s\n" % (length, target_name)
        lat.file.write(myline)


def create_lats():
    lats = []
    lats.append(Lat("file1.txt", 0.4))
    lats.append(Lat("file2.txt", 0.8))
    lats.append(Lat("file3.txt", 1))
    return lats


#loop over your lats created in create_lats
for lat in create_lats():
    latcalc(lat)
    lat.file.close() #close the file

嘗試這樣的事情(注意全局變量不見了):

def openfiles(namelist):
    ret = []
    for name in filelist:
        fi = open(name, 'w')
        ret.append(fi)
    return ret

filelist = ['file1.txt', 'file2.txt', 'file3.txt']
handles = openfiles(filelist)
for handle in handles:
    <do what ever you want>

handles 將是與名稱文件列表相對應的文件句柄列表

請注意,文件句柄是您傳遞的用於讀取和寫入的內容

也可以在對 latcalc 的調用中完成打開,因為顯然每次調用都會執行一個文件

正如一些評論指出的那樣,您不需要全局變量,您應該在完成寫入文件后關閉文件處理程序對象,這最方便使用 'with' 完成(關閉已為您完成,即使出現意外異常) :

#!/usr/bin/python

min_length = 1
max_length = 3
delay = 100
c_vaccum = 3e8

def latcalc(filename, vf):
    target_name = 0
    for length in range(min_length, max_length):
        if length < 2:
            target_name += (length/(vf * c_vaccum))
        elif length == 2:
            target_name += delay
    myline="%s\t%d\n" % (length, target_name)

    with open(filename, "w") as f:
        f.write(myline)
    return target_name

latcalc(filename1,lat40,0.4)
latcalc(filename2,lat80,0.8)
latcalc(filename3,lat100,1)

你對待參數target_name 的方式,我假設,你已經習慣了 C 類型的指針,這些指針在 Python 中不以這種形式存在。 如果您在 latcalc() 的第一行中將其設置為新值,則該參數在此處毫無意義。 此外,當target_name是 int 時,您似乎將其視為字符串:

myline="%s\t%s\n" % (length, target_name)

如果在方法完成后需要 target_name,則必須返回它。

1) open() 為您提供文件處理程序,而不是文件名 2) 使用“with”語句打開文件,以避免在完成時“忘記”關閉文件。

#!/usr/bin/python

# include the constants
min_length = 1
max_length = 30


# delays
delay = 100

# Speed of light 
c_vaccum = 3e8


def latcalc(filename, target_name, vf):

    with open(filename, "w") as openedFile:
        target_name = 0
        for length in range(min_length, max_length):
                if length < 2:
                        target_name += (length/(vf * c_vaccum))
                elif length == 2:
                        target_name += delay
                else:
                        target_name = target_name

                myline="%s\t%s\n" % (length, target_name)
                openedFile.write(myline)


latcalc("file1.txt", "lat40", 0.4)
latcalc("file2.txt", "lat80", 0.8)
latcalc("file3.txt", "lat100", 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM