0

この問題には多少の困難があります。プログラムはユーザーから番号を取得する必要があります。三角形の量になります。最初の三角形には 2 つの行が必要です。新しい各三角形には、最後の三角形よりも 1 行余分に含まれます。これは私が持っているものです:

numTri = input('Please umber of triangles: ')
numTri = eval(numTri)
numRow = 2
x = 0
while j<numTri:
   y = '*'
   z = 0
   while z<numRow:
         print y
         y = y + *
         z  += 1
    x += 1
    numRow += 1

印刷行で無効な構文エラーが発生しました。他に何か間違っているかどうかはわかりません。誰でも何か考えがありますか?

4

4 に答える 4

6

Python 3 を使用していると仮定すると、コードには多くのエラーがあります。それらを見てみましょう:

主な問題

j変数_

jループ条件で、設定も使用もされていない変数を使用します。これにより、エラーが発生します。

while j<numTri:

x変数を使用したいと思います:

while x<numTri:

print()関数です

Python 3 では、print()関数のパラメーターを括弧で囲む必要がありますが、そうではありません。

         print y

解決するのが簡単すぎる:

         print(y)

Python 2 では括弧はオプションであることに注意してください。

'*'引用符なしの文字:

'*'char を文字列 fromに追加しようとしましyたが、char を引用符で囲みませんでした:

         y = y + *

インタープリターは、このアスタリスクを乗算演算子として認識し、エラーが発生します。引用符で囲みます (一重か二重かは関係ありません)。

        y = y + '*'

インデントの問題

コードの特に有害な問題は、2 番目のwhileループの後、コードがループの同じインデント レベルに戻らないことです。以下のスペースを開いているボックスに置き換えて、それらを数えられるようにしました。

␣␣␣while z<numRow:
␣␣␣␣␣␣␣␣␣print y
␣␣␣␣␣␣␣␣␣y = y + *
␣␣␣␣␣␣␣␣␣z  += 1
␣␣␣␣x += 1
␣␣␣␣numRow += 1

残念ながら、行と比較すると、最後の 2 行には 1 つ多くのスペースがありwhileます。これらの偽のスペースを削除する必要があります。

結果のコードは次のようになります。

numTri = input('Please umber of triangles: ')
numTri = eval(numTri)
numRow = 2
x = 0
while x<numTri:
   y = '*'
   z = 0
   while z<numRow:
         print(y)
         y = y + '*'
         z  += 1
   x += 1
   numRow += 1

マイナーな問題

コードには、悪い習慣と見なされるその他の詳細もあります。あなたは本当に初心者なので、それらはまだあまり重要ではありませんが、それらのいくつかを探ることができます.

避けるeval()

eval()は強力ですが危険な機能であるため、使用を避けています。int()問題なく読み取り文字列を整数に変換するため、あなたの場合は特に簡単です。

numTri = input('Please umber of triangles: ')
numTri = int(numTri)

非標準のインデント

場合によっては、ループ内にあるものを 4 つのスペースでインデントします。

␣␣␣y = '*'
␣␣␣z = 0
␣␣␣while z<numRow:

次に6つのスペースで

   ␣␣␣␣␣␣print(y)
   ␣␣␣␣␣␣y = y + '*'
   ␣␣␣␣␣␣z  += 1

4 つのスペースがある場合でも、エラーが発生します。

␣␣␣␣x += 1
␣␣␣␣numRow += 1

最善の方法は、常に同じインデント サイズを使用することです。PEP 8 (すべての Python プログラマ向けの一連の推奨事項) では、各インデントに 4 つのスペースを使用することを推奨しています。

␣␣␣␣y = '*'
␣␣␣␣z = 0
␣␣␣␣while z<numRow:
    ␣␣␣␣print(y)
    ␣␣␣␣y = y + '*'
    ␣␣␣␣z  += 1
␣␣␣␣x += 1
␣␣␣␣numRow += 1

whileそれ以外のfor

これは初心者にとっては難しいことですが、それにもかかわらず、指摘することは役立つかもしれません. 関数forでループを使用すると、コードははるかに優れたものになります。range()

for x in range(0, numTri+1):
    y = '*'
    for z in range(0, numRow+1):
        print(y)
        y = y + '*'
    numRow += 1

ただし、あなたは学生なので、この機能については将来学習することになると思いますので、安心してください :)

結果のコード:

numTri = input('Please umber of triangles: ')
numTri = int(numTri)
numRow = 2
for x in range(0, numTri+1):
    y = '*'
    for z in range(0, numRow+1):
        print(y)
        y = y + '*'
    numRow += 1
于 2012-07-04T20:18:01.950 に答える
1

jwhileループに到達する前に定義されることはありません。多分あなたはwhile x < numTri:代わりに意味しましたか?

また、

x = 0
while x < numTri:
    # do something
    x += 1

構造はあまり Pythonic ではありません。試す

for x in range(numTri):
    # do something

代わりは。

于 2012-07-04T20:00:01.803 に答える
1

しかし、構文エラー(したがって質問への回答)は、print丸括弧が必要なPython 3を使用しているためだと思います。そう :

print ( y )

また、プログラミング タスクに最高の成績が必要な場合は、次のようにします。

print('\n'.join('*'*y for x in range(int(input('Please umber of triangles: '))) for y in range(1,x+3)))
于 2012-07-04T19:58:22.090 に答える
0
numTri = int(raw_input('Please umber of triangles: '))

またはpython 3.xで

numTri = int(input('Please umber of triangles: '))
于 2012-07-04T19:55:16.827 に答える