在python中将文件和值作为参数传递给函数

在python中将文件和值作为参数传递给函数,python,Python,我是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 g

我是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)
#/usr/bin/python
#包括常数
最小长度=1
最大长度=30
#耽搁
延迟=100
#光速
c_真空=3e8
全局文件名1
全局文件名2
全局文件名3
def openfiles():
filename1=open(“file1.txt”,“w”)
filename2=open(“file2.txt”,“w”)
filename3=open(“file3.txt”,“w”)
def latcalc(文件名、目标名称、vf):
目标名称=0
对于范围内的长度(最小长度、最大长度):
如果长度小于2:
目标_名称+=(长度/(vf*c_真空度))
elif长度==2:
目标名称+=延迟
其他:
target\u name=target\u name
myline=“%s\t%s\n”%(长度、目标名称)
filename.write(myline)
openfiles()
latcalc(文件名1,lat40,0.4)
latcalc(文件名2,lat80,0.8)
latcalc(文件名3,lat100,1)
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)
#/usr/bin/python
#包括常数
最小长度=1
最大长度=30
#耽搁
延迟=100
#光速
c_真空=3e8
def latcalc(文件名、目标名称、vf):
打开(文件名为“w”)作为openedFile:
目标名称=0
对于范围内的长度(最小长度、最大长度):
如果长度小于2:
目标_名称+=(长度/(vf*c_真空度))
elif长度==2:
目标名称+=延迟
其他:
target\u name=target\u name
myline=“%s\t%s\n”%(长度、目标名称)
openedFile.write(myline)
latcalc(“file1.txt”,“lat40”,0.4)
latcalc(“file2.txt”,“lat80”,0.8)
latcalc(“file3.txt”,“lat100”,1)
试试这样的方法(注意,globals不见了):

def openfiles(名称列表):
ret=[]
对于文件列表中的名称:
fi=打开(名称“w”)
ret.append(fi)
回程网
filelist=['file1.txt','file2.txt','file3.txt']
handles=openfiles(文件列表)
对于句柄中的句柄:
句柄是与文件名列表相对应的文件句柄列表

注意,文件句柄是用来执行读写操作的


此外,打开也可以在调用latcalc时完成,因为每次调用都要执行一个文件显然

我会创建一个小类(给它一个有用的名称)来封装数据。 如果您的文件增长,您只需更改
create\u 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
最小长度=1
最大长度=30
#耽搁
延迟=100
#光速
c_真空=3e8
#将数据保存在一个地方的小类
等级Lat:
定义初始化(self、文件名、因子):
self.filename=文件名
自我因素
self.file=open(filename,“w”)#让类打开该文件
#现在我们的函数只需要一个参数,整洁!
def latcalc(纬度):
目标名称=0
对于范围内的长度(最小长度、最大长度):
如果长度小于2:
target_name+=(length/(lat.factor*c_vaccum))#访问类变量
elif长度==2:
目标名称+=延迟
其他:
target\u name=target\u name
myline=“%s\t%s\n”%(长度、目标名称)
lat.file.write(myline)
def create_lats():
lats=[]
附加(Lat(“file1.txt”,0.4))
附加(Lat(“file2.txt”,0.8))
附加(Lat(“file3.txt”,1))
返回lats
#在“创建”lats中创建的lats上循环
对于create_lats()中的lat:
latcalc(lat)
lat.file.close()#关闭文件

正如一些评论所指出的,您不需要全局变量,您应该在完成对filehandler对象的写入后关闭它们,这是使用“with”最方便的方式(即使发生意外异常,也会为您关闭):


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

为什么不在
latcalc
中打开文件,然后删除
openfiles()
?通常应避免使用
global
。首先,您没有传递文件名,它们是文件句柄-您打开的对象,名称是类似“file1.txt”的字符串,
lat40
也是一个变量吗?它似乎没有定义。你的第一点有点误导。变量名是OP使人困惑的地方,但他们正确地使用了文件处理程序(尽管不是以最安全的方式)。此外,我不确定您想对“target_name”做什么,但输入参数“target_name”总是被丢弃,并且输出文件在第2列中从第二行开始保持相同的值。点take。目标名称实际上是不必要的。我将删除它。还要注意,所有
句柄
都应该关闭。一个问题是,一旦删除对象,文件是否会干净地关闭?目前不是,我更新了循环。我认为这不是最美的接近,但它的作品。你可以在你的类中添加函数
open\u file
close\u file
,这样就可以按照你的意愿打开和关闭它们了,我想看看。
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
#!/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)
myline="%s\t%s\n" % (length, target_name)