python-3.x 有没有一种方法可以在函数中使用“静态”变量来稍后返回值?

uplii1fm  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(82)

我有以下输入:

[['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '10', '10', '0', '0', '10', '10', '0', '0', '0', '10', '10', '10', '10', '10', '0', '0', '0'],
['0', '0', '10', '10', '0', '0', '10', '10', '0', '0', '0', '0', '0', '0', '0', '10', '10', '0', '0'],
['0', '0', '10', '10', '0', '0', '10', '10', '0', '0', '0', '0', '0', '0', '0', '10', '10', '0', '0'],
['0', '0', '10', '10', '10', '10', '10', '10', '0', '0', '0', '0', '10', '10', '10', '10', '0', '0', '0'],
['0', '0', '0', '10', '10', '10', '10', '10', '0', '0', '0', '10', '10', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '10', '10', '0', '0', '0', '10', '10', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '10', '10', '0', '0', '0', '10', '10', '10', '10', '10', '10', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']]

字符串
对于以下功能:

def assign_points(lists):
    """
    Assigns points from a list of lists to Vec4 objects.
    ...
    """
    z_max = float('-inf')
    z_min = float('inf')
    
    points = []
    for y, l in enumerate(lists):
        for x, point in enumerate(l):
            try:
                z, color = parse_point(point)
                if color is None:
                    color = no_color(z)
                points.append(Vec4(x, y, z, 0, color))
                
                # Update z_max and z_min if necessary
                if z > z_max:
                    z_max = z
                if z < z_min:
                    z_min = z

            except MyWarning as e:
                exit(f"Error on line {str(y)}, item {str(x)}: {e}")
    
    return points, z_max, z_min


但是,
我的问题是:
1.我觉得assign_points太臃肿,做/返回太多。
1.输入列表可能会变得相当大,我认为在它们中循环不止一次是浪费的
1.我不确定global vars是最佳实践
我想做一个函数来存储值,并(取决于作为参数的标志)返回在assign_points之外调用的最大值。但我很确定python没有静态变量(对吧?)
你将如何处理这个问题?我应该让它保持原样,还是做全局变量,还是做第三个选项?

vuv7lop3

vuv7lop31#

正如注解中所建议的,定义自己的类将允许您根据自己的喜好示例化和操作对象。
因为似乎有三个相关的值(pointsz_maxz_min),所以可以让类继承namedtupleassign_points可以创建为类的方法:

from collections import namedtuple

class Vec4Obj(namedtuple('Vec4Obj', ['points', 'z_max', 'z_min'])):
    def __new__(cls):
        return super().__new__(cls, [], float('-inf'), float('inf'))

    def assign_points(self, lists: list):
        for y, l in enumerate(lists):
            for x, point in enumerate(l):
                try:
                    z, color = parse_point(point)
                    if color is None:
                        color = no_color(z)
                    self.points.append(Vec4(x, y, z, 0, color))
                    
                    # Update z_max and z_min if necessary
                    if z > self.z_max:
                        self.z_max = z
                    if z < self.z_min:
                        self.z_min = z

                except Warning as e:
                    exit(f"Error on line {str(y)}, item {str(x)}: {e}")

字符串
您可以定义其他方法。例如,一个只需要一个列表和一个y值,以避免在所有列表上循环,因此一次添加更少的点。
使用你的类看起来像:

my_obj = Vec4Obj() # instantiate with value Vec4Obj(points=[], z_max=-inf, z_min=inf)

my_obj.assign_points(lists) # add points to my_obj.points and set my_obj.z_min and my_obj.z_max

相关问题