在Python函数外返回计数器

2024-10-01 15:37:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一些代码,我定义了一个函数来测试计数器在函数内部的工作方式:

def errorPrinting(x):
    x += 1
    return x

然后我在一些条件逻辑中使用函数,如果条件满足,我希望计数器增加。在

^{pr2}$

我对使用函数还是相当陌生的,所以可能我不知道如何在for循环的下一次迭代中返回函数之外的值。它总是在我身上返回1。有谁能告诉我,当x增加一个x+=1后,如何返回函数外的x?在

谢谢, 迈克


Tags: 函数代码forreturn定义def方式计数器
3条回答

你不是在增加你的全局x,而是在增加局部参数,它恰好也被命名为x!(errorPrinting的参数可以命名为任何名称。我叫它xLocal。)

正如您在这里看到的,x不是由函数递增的。在

>>> def inc(xLocal):
...     xLocal += 1
...     return xLocal
... 
>>> x = 4
>>> inc(x)
5
>>> x
4

每次都需要将x的值重新指定给函数的返回值。像这样

^{pr2}$

在Python中,积分参数和其他原语通常不通过引用传递。(清单、口述等是。无意中修改列表实际上是Python中非常常见的错误。)

编辑:在Python中,传递“reference”和“value”并不正确。有关详细信息,请参见this好问题。在

所以,用我前面的例子:

>>> x = 4
>>> x = inc(x)
>>> x
5

请注意,如果这是一个通过引用传递的参数,比如一个列表,那么这个策略就会起作用。在

>>> def incList(xList):
...     for i in range(len(xList)):
...         xList[i] += 1
... 
>>> xList
[1]
>>> incList(xList)
>>> xList
[2]

请注意,正常的python语法:

for i in xList:
    i += 1

不会增加全局值。在

注意:如果您希望监视很多事情,我还建议使用logging模块@SB。提到。它非常有用,使调试大型程序更加容易。你可以得到时间,信息类型等

因为如果函数是一个新概念,那么我之前的评论可能有点难以理解。在

我个人认为解决这个问题最好的方法是将相关代码包装在一个对象中。在

Python在很大程度上基于对象的概念,可以将对象看作是使用对数据进行操作的函数对数据进行分组。一个对象可以表示一个事物,或者在某些情况下可能只是让一些相关函数共享一些数据的方便方法。在

对象被定义为“类”,它定义对象的类型,然后生成“实例”,每个实例都是类中定义的数据分组的单独副本。在

class MyPrint(object):

    def __init__(self):
        self.x = 1

    def errorPrinting(self):
        self.x += 1
        return self.x

    def myPrint(self):
        for row in arcpy.SearchCursor(fc):              

            if not row.INCLUSION_TYPE or len(row.TYPE.strip()) == 0:
                self.errorPrinting()
                print self.x

            elif len(row.TYPE) not in range(2,5):
                self.errorPrinting()
                print self.x

            elif row.INCLUSION_TYPE.upper() not in [y.upper() for y in TableList]:
                self.errorPrinting()
                print self.x

p = MyPrint()
p.myPrint()

函数__init__(self)errorPrinting(self)myPrint(self)都称为“方法”,它们是为类中任何对象定义的操作。为类的某个实例对象调用这些函数时,会自动在包含对调用该函数的特定实例的引用的任何参数前面插入一个self参数。self.x引用由该实例对象存储的变量,因此函数可以共享该变量。在

类似于对类名称的函数调用:

^{pr2}$

实际上创建一个类MyPrint的新实例对象,调用MyPrint.__init__(<instance>),其中<instance>是新对象,然后将实例分配给p

p.myprint()

调用MyPrint.myprint(p)。在

这样做有一些好处,因为只要需要对象,就可以使用这种方法使用的变量;可以为执行相同操作的不同任务使用多个计数器,并且范围都得到了处理,另外,您不会弄乱全局命名空间,也不必在函数之间传递值。在

你的范围有点小。你可能想看看这个link快速入门。在

你可以做一些简单的事情,在所有的情况下都可以说x = errorPrinting(x),然后得到你想要的。但我认为有更好的解决方案,你会学到更多。在

考虑实现一个为您维护计数的错误记录器对象。那你就可以了logger.errorPrinting()和您的logger实例将管理计数器。您可能还需要研究python的built in logging facilities。在

相关问题 更多 >

    热门问题