2016-12-10 6 views
-1

私はこの関数をPythonで書いています。これは、リスト要素が数値かどうかをチェックし、リスト要素があればそれを返すように設計されています。構文エラー(Python番号チェック機能)が表示されるのはなぜですか?

def check_for_number(list): 
x = 0 
print(isinstance(list[x], (int, float)) 
true_or_false = False 
for x in range(len(list)-1): 
    if isinstance(list[x], (int, float) == True): 
     true_or_false = True 
     num = list[x] 
    x += 1 
print(true_or_false) 
return true_or_false 
return num 

私はそれを実行しようとするたびに、私はの最後にコロンが文は、最後の2行に「予期しないトークン」と、すべての項目であればという構文エラーを取得する:これはコードですif文は同じ予期しないトークンエラーを返します。私はインデントをチェックして、それに間違ったことは何も見えません。何が欠けていますか?ありがとう。

+0

'== true'をは不要です。それを取り除く。 –

+1

最初の印刷の最後に閉じ括弧がありません –

+0

また、返された後に戻ることはできませんので、実際にはよりわかりやすい名前を持つべきである「true_or_false」に戻るだけです –

答えて

1

あなたの関数のコードを指示し、if isinstance(list[x], (int, float) == True):の部分を修正し、最初のprint文のparanthesisを閉じる必要があります。

def check_for_number(list): 
    x = 0 
    print(isinstance(list[x], (int, float))) 
    true_or_false = False 
    for x in range(len(list)-1): 
     if isinstance(list[x], (int, float)) == True: 
      true_or_false = True 
      num = list[x] 
     x += 1 
    print(true_or_false) 

    # Decide what you want to return here 
    return true_or_false 
    return num 

あなたのコードの改善に興味を持っている場合は、同様のコメントに記載されているように、== True一部を除去。あなたの質問から、true_or_falseFalseまたはそれ以外の場合はnumである場合、あなたは仲間を返すと思っています。

ループにbreakステートメントを追加すると、最初の番号が見つかったときにループが終了します。したがって、コンピュータは完全なリストをループする必要はなく、実行時間を節約できます。

また、あなたのx += 1ステートメントは、あなたがしたいことではありません。 for ... in range ...ループでは、サイクルごとにxが増えます。そのため、x += 1は、2番目のリスト要素をスキップするコードになります。 xを最初に宣言する必要もありません。

def check_for_number(list): 
    print(isinstance(list[x], (int, float))) 
    true_or_false = False 
    for x in range(len(list)-1): 
     if isinstance(list[x], (int, float)): 
      true_or_false = True 
      num = list[x] 
      break 
    print(true_or_false) 

    if (true_or_false): 
     return num 
    else: 
     return False 

は不要== True一部についてのご質問をConcering:

ザ・if文は、以下の擬似コードのように働いています。だから、

if (CONDITION) == True then do something special 

あなたが== Trueを追加する場合、Pythonはそうのようにそれをチェックします:

if (valeu == True) == True then do something special 

と同じである:

if (value) == True then do something special 
+1

'== True'は[' PEP8'](https://www.python.org/dev/peps/pep-0008/)に準拠しておらず、代わりに 'is True'を使うか、何もしません! – ettanany

+0

ありがとう!それを最適化するためのヒントは非常に高く評価されています。私はなぜ== Trueを省略することができるのか興味がありますか?私はif文が別の方法では実行されないと考えていました。乾杯! – IH96

+0

ifステートメントは、条件がTrueかFalseかをチェックします。条件がTrueの場合、ifの後のブロック内のコードが実行されます。それ以外の場合は、そのブロックの後で実行が継続されます。より明確にするために、私の次の回答の更新を見てください。 – user2154065

0

Pythonは、タブに敏感と不寛容ですこの点に関する誤り。私はまた、次のことを試してみてください6.あなたは次の解決すべきで、より有益なエラーを取得する可能性がありますライン上で比類のないかっこのインスタンスを見ている:

def check_for_number(list): 
    x = 0 
    print(isinstance(list[x], (int, float)) 
    true_or_false = False 
    for x in range(len(list)-1): 
     if isinstance(list[x], (int, float) == True): # missing a parenthesis to close isinstance. 
     # "== True" is unnecessary because isinstance() will resolve to True or False 
      true_or_false = True 
      num = list[x] 
      x += 1 
      print(true_or_false) 
      return true_or_false 
    return num # this will result in unexpected behavior... 
     # ...because num will not be defined if this line is reached. 
     # Either the return inside the if will finish the method or num will never be defined. 

それはそれの一部がインデントどうあるべきか少しあいまいなのですあなたが何をしようとしているのか分からないからです。

値に戻そうとしている場合は、値を含むリストまたは辞書を返すことを検討してください。

+0

要素をスキップしない限り、範囲ループ内で 'x + = 1'を使うべきではない –

1

ここでは、リストの理解を使用したソリューションです。抽象基本クラスNumberに対して各要素をチェックします。 1つ以上の数値要素が存在する可能性があるので、数値のリストを返します。

import numbers 

def get_numbers(l): 
    return [x for x in l if isinstance(x, numbers.Number)] 

例:

>>> l = ['1', 4.0, 'abc', 'XYZ', 'test', 5] 
>>> nums = get_numbers(l) 
>>> print(nums) 
[4.0, 5] 
+0

助けてくれてありがとう。これは私が設定したタスクのために取り組んでいるコードの一部です。タスクのルールの1つは、外部ライブラリを使用できないということです。 Python標準ライブラリはこのルールから除外されますか?私は数字のようなモジュールをインポートできるかどうか疑問に思っていますか? – IH96

+0

標準ライブラリは外部(サードパーティ)ライブラリではないので、私はそう思っています。 –

+0

@ IH96これは[標準ライブラリ](https://docs.python.org/3/library/numbers.html)ですが、ここには何もありません –

関連する問題