2017-08-10 5 views
0

私はリスト内包表記と入れ子リスト内包表記を練習しています。私の練習の一環として、私は同等のforループを書いています。このforループは正しいことができません。関数呼び出しで変数ではなく値を代入しようとしているからです。私は受信エラーがある:ループの場合、SyntaxError:関数呼び出しに割り当てることができません

File "<stdin>", line 4 
SyntaxError: can't assign to function call 

私はこのループのために書かれているコードは次のとおりです。この関数は、根の範囲1における素数完璧な正方形のリストを作成しようとしている

import math 

def squared_primes(): 
    list = [] 
    for x in range(1,1000000): 
     for q in range(2,math.sqrt(x)+1): 
      if all(x % q != 0): 
       list.append(x**2) 
    print(list) 

私のループの構文が正確にどこで分かったのか誰かがわかりますか?また、ネストされたリストの理解としてこれを行うことはできますか?私のループ構文を正しく取得できないため、明らかに私のリストの理解力は崩壊しています...

解決策:ユーザー@Evanのおかげで、変数と構文の問題を修正できました。 'all()'ステートメントをthis threadから修正してください。

このコードは正しく1,1000から二乗素数のリストを返します。

def squared_primes(): 
    list1 = [] 
    for x in range(1,1000): 
     if all(x%q !=0 for q in range(2,int(math.sqrt(x)+1))): 
      list1.append(x**2) 
    print(list1) 
+0

floatをrange()ビルトインの第2引数として渡すことを意味しますか? – Evan

+0

@エヴァン・ノー、私は整数を渡すことを意味します。私はint(q)を範囲に入れようとしました...しかし、それはまだ動かないでしょう。それはエラーのように見えないので、多分私はそれを残しておくべきでしたが。私は確かにそれをもう一度試みます。 – Hanzy

+0

また、あなたのコードでsquared_primes()関数をインデントしたが、ここに投稿するときに余分な4つのスペースを追加するのを忘れたと仮定します。私は関数呼び出しエラーなしであなたのコードを実行することができますが、インデントを削除すると、間違ってインデントの構文エラーが発生します。型エラーを回避するために、再度テストするためにint()でmath.sqrt(x)+1式を型キャストします。 – Evan

答えて

0

This code will properly return a list of the squared primes from 1,1000:

。のは、そのグリッチを修正し、適切な機能として、コードを書き換えてみましょう:

ところで
from math import sqrt 

def squared_primes(maximum): 
    primes = [] 

    for number in range(2, maximum): 
     if all(number % divisor != 0 for divisor in range(2, int(sqrt(number)) + 1)): 
      primes.append(number ** 2) 
    return primes 

print(squared_primes(1000)) 

、このはリスト内包ではありません。

all(x % q !=0 for q in range(2, int(math.sqrt(x) + 1))) 

それは発電機です!あなたが行っているだろうリストの内包たい場合:

all([x % q !=0 for q in range(2, int(math.sqrt(x) + 1))]) 

をしかし、それはより少ない労力で複合体を失敗したとして、発電機にこだわります。

1000000(100万)以上の正方形のリストを要求すると、コードが不調になります。我々のような、より効率的なふるいベースのアルゴリズムたいと思うとき、それはです:百万のまわりで

def squared_primes(maximum): 
    sieve = [True] * maximum 

    if maximum > 0: 
     sieve[0] = False # zero is not a prime 
     if maximum > 1: 
      sieve[1] = False # one is not a prime 

    for index in range(2, int(maximum ** 0.5) + 1): 
     if sieve[index]: 
      prime = index 
      for multiple in range(prime + prime, maximum, prime): 
       sieve[multiple] = False 

    return [index * index for index in range(maximum) if sieve[index]] 

を、このコードは、あなたの部門ベースのソリューションよりも20倍高速化についての結果を返します。それはあなたのmath.sqrt()最適化を欠いているので、どちらか(私はまだそれが百万のために終了するのを待っている)と、2つの誤った結果でリストを開始しますよりも遅い桁違いになります

そしてエヴァンさん栄光の理解 @

、。

from math import sqrt 

def squared_primes(maximum): 
    return [number ** 2 for number in range(2, maximum) if all(number % divisor for divisor in range(2, int(sqrt(number)) + 1))] 

print(squared_primes(1000)) 
をそしてこの リスト内包です:私たちは実行して、改訂されたコードと同等時間的にそれを置くことができます。しかし、やはり間違ったアプローチはふるい分けに戻り、ふるいに基づく実装を見てください。

+0

これはありがとうございます。私はちょっと不注意で、1がリストの最初の要素であることを見ましたが、あなたは正しいです。それはプライムではありません。いいキャッチ! – Hanzy

+0

私はふるいアルゴリズムを調べましたが、私はこの解決法を検討するつもりですが、これは非常に効果的です。私は当初、自分のコードから1000000まで整数を求めていましたが、時間がかかっていることに気付きました... – Hanzy

+0

私はふるいアルゴリズム(基本を理解するために外部リソースに行きました)を見ていて、ループ。私は、number = = set(...)は、最初の複数の元のprime(2)で始まり、その素数で最大までカウントし、次に元のフルセットから減算することを示します。私が得られないことは、繰り返しごとに素数がどのように増加するかです。私はprime = numbers.pop()がマークされていない素数から値を引きますが、これは積み重ねの上から引っ張られません。それは最初に2をポップしてから、whileループの3 b/cを続けますか? – Hanzy

0

これはかなり簡潔です。リスト内包は栄光です。それは、リストの最初の要素として1を返し、1の平方根が素数でないことを除いて

def squared_primes(maximum): 
    return([ x**2 for x in range(0,maximum) if all(x % i for i in range(2, x)) ]) 

print(squared_primes(1000000)) 
+0

リスト変数名をlist1に置き換えてコードを更新し、範囲関数にint(q)を渡しましたが、同じエラーが返されます... – Hanzy

+0

int(q)を渡すことで、組み込みのrange()によって生成される整数です。浮動小数点エラーを修正するには、int(math.sqrt(x)+1)を型キャストする必要があります。あなたはまだ関数呼び出しエラーへの代入を取得していますか?あなたのコードを実行する際にエラーが発生することはないので、私はまだ非常に混乱しています。 – Evan

+0

私はまだ関数呼び出しエラーに同じ割り当てを取得していましたが、typecasting int(math.sqrt(x)+1)は、変数名を変更するだけでなく、それを修正したようです。ご協力いただきありがとうございます! – Hanzy

関連する問題