python-初始化命名元组的列表,然后将其传递到函数



我昨天问了我的第一个问题,希望我学会了如何更好地提出我的问题。下面的代码是一个简单的示例,其中包含我感兴趣的问题。它有一些我想问的缺陷。

from collections import namedtuple
Name = 'Square'
Point = namedtuple('Point', 'x y')
PointBegin = (0, 0)
PointList = (
                 (1, 0)
                 (1, 1)
                 (0, 1)
                 (0, 0)
             )
def move_to(pt)
    print('Begin at (', pt.x, ',', pt.y, ')')
def draw_to(pt)
    print('Draw to (', pt.x, ',', pt.y, ')')
def draw(name, bgn_pt *pt_list) :
    print 'Drawing object ', name
    move_to(bgn_pt)
    for pt in pt_list:
        draw_to(pt.x, pt.y)
#Call the draw function, passing the list of named tuples.
draw(Name, PointBegin, *PointList)

首先,尖端清单无法正确初始化,因为它无法知道每个子列表都是一个点。有什么方法可以用最小的详细性初始化它?我需要从外部数据中生成它。

第二,传递指数函数的语法不正确。谁能建议正确的语法?

在昨天我的问题中,我建议了一个课,而不是命名的元组。哪种类型的价值最适合此?

我不太关心任何其他语法或惯例错误。我可以弄清楚它们。顺便说一句,我正在使用带有实时功能扩展的铁蟒蛇。但是我不希望这与我的问题有关。

好吧,让我们快速摘要...

from collections import namedtuple
Name = 'Square'

Python中的约定是将all_lower_with_underscores用于可变和功能名称,并保留类的SnakeCase名称。所以这应该是

name = "Square"

...

Point = namedtuple('Point', 'x y')
PointBegin = (0, 0)

这里有两个点(la脚,对不起):

首先,上面的cf命名(应该是point_begin之类的东西 - 实际上start_pointorgin是更正确的,但无论如何)。

那么,如果您希望它是Point,则必须将其提出一个,而不是tuple

start_point = Point(0, 0)
PointList = (
                 (1, 0)
                 (1, 1)
                 (0, 1)
                 (0, 0)
             )

再次命名,加1/这不是list、2/它不是有效的python语法,而3/如果您想要Point的列表,则必须明确要求它。哦,是的:一个集合通常用复数形式表示,即"点"。

我认为在这种情况下,您想要类似的东西:

 coords = [(1, 0),  (1, 1), (0, 1), (0, 0)]
 points = [Point(x, y) for x, y in coords]

def move_to(pt)

语法:您需要":"此处:

def move_to(pt):

也是可读性是Python哲学的非常重要的一部分。如果您的意思是"点",则一定要拼写为"点":

def move_to(point): 
    print('Begin at (', point.x, ',', point.y, ')')

有怜悯并使用字符串格式

    print("Begin at ({}, {})".format(point.x, point.y))

def draw_to(pt)
    print('Draw to (', pt.x, ',', pt.y, ')')

didem

def draw(name, bgn_pt *pt_list) :

idem plus s/bgn_pt/start_point/g(或origin或其他任何有意义的东西,但无论如何都意味着不需要努力才能理解的东西),并且您需要参数之间的逗号,即def draw(name, start_point, *points)

另外,*args语法适用于varargs。在这里,您的功能期望Point的列表(或任何可观的)列表,因此使用此语法没有用:

def draw(name, start_point, points):
    print 'Drawing object ', name

在救援时期格式化:

   print("Drawing object {}".format(name))

...

    move_to(bgn_pt)
    for pt in pt_list:
        draw_to(pt.x, pt.y)

CF上方(命名等)。另外,您的draw_to功能期望单个Point,而不是两个xy参数

    move_to(start_point)
    for point in points:
        draw_to(point)

#Call the draw function, passing the list of named tuples.

这次我们确实通过了点列表;)

draw(name, start_point, points)

现在对于整个更正的代码:

from collections import namedtuple
# define data types and functions first   
Point = namedtuple('Point', 'x y')
def move_to(point)
    print('Begin at ({}, {})'.format(point.x, point.y))
def draw_to(point)
    print('Draw to ({}, {})'.format(point.x, point.y))
def draw(name, start_point *points):
    print('Drawing object {}'.format(name))
    move_to(start_point)
    for point in points:
        draw_to(point)
# now our variables. 
# NB we wrap this in a `if __name__ == "__main__"`
# to gard this part from being executed if this script
# is imported as a module
if __name__ === "__main__":    
    start_point = Point(0, 0)
    coords = [(1, 0),  (1, 1), (0, 1), (0, 0)]
    points = [Point(x, y) for x, y in coords]
    name = "square"
    draw(name, start_point, points)

最新更新