2016-09-19 11 views
1

RGB値を16進数に変換する電卓を作っています。私がコーディングしていたときに、同じコードを3回書いて赤、緑、青のユーザー入力を確認したことが分かりました。だから私は、私の変数をチェックするための関数を使わないでください!ここに私のコードです:変数をチェックして変更する機能

invalid_msg = 'Whoops looks like you have entered incorrect information' 
def check_rgb(var): 
    while var > 255 or var < 0: 
     print invalid_msg 
     var = int(raw_input('Please enter a value between 0 and 255:')) 
    return var 

def rgb_hex(): 
    red = int(raw_input('Enter your value for red.')) 
    check_rgb(red) 
    green = int(raw_input('Enter your value for green.')) 
    while green > 255 or red < 0: 
     print invalid_msg 
     green = int(raw_input('Enter your value for green.')) 
    blue = int(raw_input('Enter your value for blue.')) 
    while blue > 255 or red < 0: 
     print invalid_msg 
     blue = int(raw_input('Enter your value for blue.')) 
    val = (red << 16) + (green << 8) + blue 
    print '%s' % (hex(val)[2:]).upper() 

rgb_hex() 

問題は変数を再宣言することです。今は、関数に入力された値を赤ではなく変数 'var'に格納します。

+2

pastebinにiframeではなく、質問にコードを貼り付けます。 – Li357

答えて

0

、単にcheck_rgb(red)を行うと、元の値を変更しません。 redcheck_rgbが返す値を保存するのを忘れてしまったためです。

ヘルパー関数を拡張してユーザー入力を取得し、それを検証することをお勧めします。入力が正しい範囲内の有効な整数であることを確認する例もあります。このコードは、RGB値の16進表示を印刷する簡単な方法も示しています。

def get_color_byte(name): 
    while True: 
     s = raw_input('Enter a value from 0 to 255 for %s: ' % name) 
     try: 
      v = int(s) 
      if not 0 <= v <= 255: 
       raise ValueError('Out of range') 
      return v 
     except ValueError as e: 
      print e 

r, g, b = [get_color_byte(name) for name in ('red', 'green', 'blue')] 
rgb = (r << 16) | (g << 8) | b 
print '%06X' % rgb 

あなたはより近代的なformat機能を使用できprint '%06X' % rgbに代わるものとして、テスト

Enter a value from 0 to 255 for red: hello 
invalid literal for int() with base 10: 'hello' 
Enter a value from 0 to 255 for red: 12.5 
invalid literal for int() with base 10: '12.5' 
Enter a value from 0 to 255 for red: -5 
Out of range 
Enter a value from 0 to 255 for red: 300 
Out of range 
Enter a value from 0 to 255 for red: 240 
Enter a value from 0 to 255 for green: 13 
Enter a value from 0 to 255 for blue: 7 
F00D07 

:それらの両方で

print format(rgb, '06X') 

は、資本金はX資本を使用することを言います16進文字列の文字。

+0

これはかなり鮮明ですが、どうしてintの呼び出しを変数定義に含めなかったのですか? – Joe

+0

ああ私は見る!ユーザーが整数に変換できないものを入力すると、エラーが発生します。 tryで変数を再定義すると、エラーを除きます! ...なぜvar宣言全体をtry文の中に移動しないのですか? – Joe

+0

@Joe一般的なルールは、 'try'ブロックの中に入るコードを最小限にすることです。そうすれば、キャッチしたいエラーだけをキャッチし、対処方法を知ることができます。他の予期しないエラーが発生した場合、通常はプログラムロジックに問題があることが示されます。その場合は、プログラムが騒々しく失敗し、エラートレースバックを出力してコードを修正するのに役立つ情報を提供します。 –

2

あなたは、あなただけの戻り値が使用されていない

check_rgb(red) 

を行うと

red = check_rgb(red) 

のようなもののような何かをする必要があります。

0

あなたは別に関数を呼び出す三色で状態を確認し、同じ文の中のすべてのそれらを比較することができます:デイビス吉田が言及したよう

red_ok = check_rgb(red) 
green_ok = check_rgb(green) 
blue_ok = check_rgb(blue) 
if (red_ok and green_ok and blue_ok) : 
    val = (red << 16) + (green << 8) + blue 
    print '%s' % (hex(val)[2:]).upper() 
関連する問題