0

関数と while ループを使用して数値を表す記号を出力できるようにしたい

元:

number = 250
# symbols 
C = 100
^ = 50

印刷する必要があります

CC^

1 つの関数を印刷することはできますが、2 つ以上の印刷関数を連結しようとすると、型エラーが発生します。

TypeError: can't multiply sequence by non-int of type 'function'

number = 251;
def numeral_C(number_par):
  while number_par >=100:
    numeral_C = number_par / 100
    print "C"*numeral_C,
    number_par = number_par - numeral_C*100
  return ""
def numeral_UpArrow(number_par):
  while number_par >=50:
    numeral_upArrow = number_par / 50
    print "^"*numeral_UpArrow, #error
    number_par = number_par - numeral_UpArrow*50
  return ""
etruscan_C = str(numeral_C(number))
etruscan_UpArrow = str(numeral_UpArrow(number)) #error

print etruscan_C+etruscan_UpArrow

Traceback (most recent call last):
  File "/Applications/Wing IDE/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 15, in 
  File "/Applications/Wing IDE/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 11, in numeral_UpArrow

**TypeError: can't multiply sequence by non-int of type 'function'

エラーが発生せずに2つ以上の関数を印刷できる方法はありますか?

4

2 に答える 2

0

他の人が述べているように、割り当てで既に関数と同じ名前のものを再利用する際に問題があります。

def numeral_C(number_par):
   while number_par >=100:
      #this numeral_C is already a known function name, now youre reusing it as an int
      numeral_C = number_par / 100
      #you're using print inside a function, not a best practice, but.....
      print "C"*numeral_C,
      #uncomment the below line to see why the loop is unnecessary
      #print '%d = %d - %d' % (number_par - numeral_C*100, number_par, numeral_C*100)
      number_par = number_par - numeral_C*100
   return ""
   #you're printing, rather than returning, making this useless, and you're str()-ing the "" on return

number = 25101;
etruscan_C = str(numeral_C(number))
print

def numeral_c(number_par):
   num_c = number_par / 100
   return 'C'*num_c

print numeral_c(number)

コメントからわかるように、関数の名前を変更するだけでこれが解決し、おそらく変数の名前を変更することさえできます。しかし、私が考える「より大きな」問題については...

あなたの元の数学は不必要なループを作っているように感じます。あなたの numeric_C の動作を私の numeric_c と比較してください: どちらも同じ数値 C になりますが、1 つの方が (「C」を文字列として返すことにより) より再利用可能であり、ループと多くの再割り当てがありません。

現実的には、number_par を再割り当てして最も近い FLOORED の 100 の倍数を減算することに基づいて、ループが 2 度目に発生するケースを見つけることができません。つまり、そのロジックの多くは役に立たないということです。次のようにして、その機能全体を合理的に達成できます。

'C'*int(number/100)
于 2012-04-18T18:02:56.497 に答える
0

あなたは両方とも、その関数内で関数名 numeric_UpArrow (関数である) に & を割り当てています。

于 2012-04-18T16:51:47.753 に答える