2017-10-03 20 views
-4

私は最初の質問に昨日尋ねましたが、今日私の問題をより良く伝える方法を学んだことを願っています。以下のコードは、私にとって興味深い問題を含む簡単な例です。それは私が尋ねたいと思っているいくつかの欠陥があります。それは、各サブリストがポイントであることを知っているための方法はありませんよう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) 

まず、PointListが正しく初期化されていません。これを最小限の冗長さで初期化する方法はありますか?私は外部データからこれを生成する必要があります。

第2に、PointListを描画関数に渡す構文が正しくありません。誰でも正しい構文を提案できますか?

私の質問では、昨日、名前付きタプルではなくクラスを提案しました。これにはどんな価値がありますか?

私は他の構文や慣習の誤りについてあまり心配していません。私はそれらを理解することができます。ところで、私は、リアルタイムPython関数Pythonを使っています。しかし、私はそれが私の質問に関連するとは思わない。

+1

多くのカンマがありません。また、 'PointList = [Point(1,0)、...]'はポイントのリストです。あなたはタプルを作成しようとしているようです。 – jonrsharpe

+0

あなたの 'PointList'はリスト型ではありません。(ちょうどいくつかのコンマを使わずに有効なコードでもありません)、' draw'の署名にはカンマがありません。また、リストを '*'引数とみなすのではなく、 'def draw(name、bgn_pt、pt_list)'のようにしたいと思うでしょう。 – birryree

+5

*「他の文法や慣習の誤りについてあまり心配していない」*基本的な構文が間違っていても、他の誰かがあなたを助けることにどのように関わってくると思いますか? – SiHa

答えて

0

もOKですが、簡単に説明するために行ってみよう... Pythonで

from collections import namedtuple 

Name = 'Square' 

条約は、変数名や関数名のためall_lower_with_underscoresを使用して、クラスのためSnakeCase名を維持することです。だから、これはここに

name = "Square" 

...

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

PointBegin = (0, 0) 

2点でなければなりません(ラメしゃれ、申し訳ありません):

まず、ネーミング、上記CFは(あるべきpoint_beginのようなもの - 実際にstart_pointまたはorginはより正確ですが、とにかくです)。

start_point = Point(0, 0) 

PointList = (
       (1, 0) 
       (1, 1) 
       (0, 1) 
       (0, 0) 
      ) 

が再び命名、プラス1 /これは、2 /そうではありません、listではありません:あなたは、これがPointになりたい場合は

その後、あなたはそれを代わりにtuple点を確認する必要があります有効な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, ')') 

同上

def draw(name, bgn_pt *pt_list) : 

同上プラスS/bgn_ptのフォーマットを使用する文字列/ start_point/g(または原点など何でも意味が分かりますが、意味が分かりませんが何かを理解する必要はありません)、パラメータの間にカンマが必要です。つまり、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関数は2 xy引数まあ

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


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

我々は確かにポイントのリストを渡す。この時、単一Point、ない見込ん;)全体のために今

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) 
+0

非常に広範な答えに感謝します。 @eyllanescの最初の答えについて以前はコメントしていなかったので、今は気分が悪いです。私はコードを実行していたが、昼食に行きました。私が戻ったとき、私はあなたの答えを見つけました。私はあなたが私の例をあまりにも真剣に受けたことを心配しています。私の実際の仕事は、ポイントや描画やプリントのステートメントとは関係ありません。私の重要な必要性は、名前付きタプルのリストを作成し、そのリストを引数として渡すための正しい構文を得ることでした。私は昨日提出した最初の質問で私の経験に基づいてこの例を作りました。 – NorseMN

+0

あなたが手伝ってくれるように全力で取り組んできたので、私は実際に車両制御ソフトウェアをテストして、ハードウェア・イン・ザ・ループで実行し、フィードバックを提供する車両のシミュレーションを運転していると分かります。私は各検出可能な故障状態を刺激し、測定された応答を検証する必要があります。私は障害とハードウェアピンと他の値のリストを識別する引数を持つTest()関数が必要です。適用する電圧、障害が宣言されるまでの遅延、障害ID、重大度など。Test()関数は応答を期待と比較します。いくつかの電圧。いくつかの結果。多くの障害原因。 – NorseMN

+0

@NorseMNは心配していません - 答えはあなた自身のためだけでなく、この記事を読んでいる人にとってです。それで私は技術的には正しくありませんが、pythonの "訂正された"バージョンを投稿しました。 –

関連する問題