我昨天问了我的第一个问题,希望我学会了如何更好地提出我的问题。下面的代码是一个简单的示例,其中包含我感兴趣的问题。它有一些我想问的缺陷。
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_point
或orgin
是更正确的,但无论如何)。
那么,如果您希望它是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
,而不是两个x
和y
参数
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)