Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Seltsames Verhalten bei If
Druckversion
Druckversion
Antworten
Antworten
Autor
Kein bestimmter Bereich Python: Seltsames Verhalten bei If
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 1876
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-03-25

Python 3
  1. from sympy import *
  2. >>> from sympy import primepi
  3. >>> from math import sqrt
  4.  
  5. Zahl=0
  6. b=[]
  7. GL=0 #Gesamtzahl echter Teiler.
  8.  
  9. for Zahl in range(1,33,2):
  10. #print(Zahl)
  11. i=1
  12. b=[]
  13. while i <= Zahl:
  14. if Zahl%i==0:
  15. Teiler=Zahl//i
  16. b.append(Teiler)
  17. i=i+1
  18.  
  19. else:
  20. i=i+1
  21.  
  22. b.reverse()
  23. if isprime(Zahl)== true & len(b) <=4:
  24. GL=GL+0
  25. else:
  26. GL=GL+len(b)
  27. print(Zahl, b, len(b), GL)

Bislang lief es. Nun hab ich diesen Befehl im 2. if eingefügt: \(  "& len(b) <=4" \).
Da sagte er:  jede Menge Kommentar (unten)

Ich will, daß er nur die echten Teiler zählt, also nicht bei Quadratzahlen und Primzahlen ..

Als ich das nicht drin hatte, lief es korrekt!

Kann mir jemand den Kommentar deuten?


TypeError                                 Traceback (most recent call last)
<ipython-input-54-df6ebbbd39f5> in <module>
     21
     22     b.reverse()
---> 23     if isprime(Zahl)== true & len(b) <=4:
     24         GL=GL+0
     25     else:

~/opt/anaconda3/lib/python3.7/site-packages/sympy/logic/boolalg.py in __and__(self, other)
     61     def __and__(self, other):
     62         """Overloading for & operator"""
---> 63         return And(self, other)
     64
     65     __rand__ = __and__

~/opt/anaconda3/lib/python3.7/site-packages/sympy/core/operations.py in __new__(cls, *args, **options)
    411             # is done so short-circuiting can be done
    412             # without having to sympify all values
--> 413             _args = frozenset(cls._new_args_filter(args))
    414         except ShortCircuit:
    415             return sympify(cls.zero)

~/opt/anaconda3/lib/python3.7/site-packages/sympy/logic/boolalg.py in _new_args_filter(cls, args)
    660         newargs = []
    661         rel = []
--> 662         args = BooleanFunction.binary_check_and_simplify(*args)
    663         for x in reversed(args):
    664             if x.is_Relational:

~/opt/anaconda3/lib/python3.7/site-packages/sympy/logic/boolalg.py in binary_check_and_simplify(self, *args)
    448     def binary_check_and_simplify(self, *args):
    449         from sympy.core.relational import Relational, Eq, Ne
--> 450         args = [as_Boolean(i) for i in args]
    451         bin = set().union(*[i.binary_symbols for i in args])
    452         rel = set().union(*[i.atoms(Relational) for i in args])

~/opt/anaconda3/lib/python3.7/site-packages/sympy/logic/boolalg.py in <listcomp>(.0)
    448     def binary_check_and_simplify(self, *args):
    449         from sympy.core.relational import Relational, Eq, Ne
--> 450         args = [as_Boolean(i) for i in args]
    451         bin = set().union(*[i.binary_symbols for i in args])
    452         rel = set().union(*[i.atoms(Relational) for i in args])

~/opt/anaconda3/lib/python3.7/site-packages/sympy/logic/boolalg.py in as_Boolean(e)
     51     if isinstance(e, Boolean):
     52         return e
---> 53     raise TypeError('expecting bool or Boolean, not `%s`.' % e)
     54
     55

TypeError: expecting bool or Boolean, not `2`.




-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
schnitzel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 26.02.2009
Mitteilungen: 174
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-03-25


Tag,
true sollte True heißen ?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 1876
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-03-25


2020-03-25 08:13 - schnitzel in Beitrag No. 1 schreibt:
Tag,
true sollte True heißen ?

1. Danke, True wird nun Grün!
seltsam in einem andern Programm läuft es so: (true)
Pathon
  1. from sympy import *
  2. >>> from sympy import primepi
  3. >>> from math import sqrt
  4. x=0
  5. nr=0
  6. nr1=0
  7. for x in range(0,10000,3):
  8. nr=nr+1
  9. if isprime((x**2)-2) == true & isprime((x**2)+2)== true:
  10. nr1=nr1+1
  11. print(nr1, nr-1, isprime(nr-1), x,(x**2), isprime((x**2)-2), isprime((x**2)+2))


2. Danke, es läuft jetzt so, daß das if nicht funktioniert. Es müßte bei 15 den ersten Wert erhalten.

1 [1] 1 GL: 1
3 [1, 3] 2 GL: 3
5 [1, 5] 2 GL: 5
7 [1, 7] 2 GL: 7
9 [1, 3, 9] 3 GL: 10
11 [1, 11] 2 GL: 12
13 [1, 13] 2 GL: 14
15 [1, 3, 5, 15] 4 GL: 14
17 [1, 17] 2 GL: 16


-----------------
Das Schwierige ist nicht die Mathematik. Schwierig ist es zu formulieren, daß man selber versteht, was man sieht und die anderen auch!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
schnitzel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 26.02.2009
Mitteilungen: 174
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-03-25


Hi,
du musst einiges beachten:
- True, False ist direkt in python
- true, false kommt von sympy
- isprime liefert True oder False zurück
- Reihenfolge in der Operatoren ausgewertet werden:
    hier

Beachte, dass & ein bitweiser Operator ist, der nach == ausgewertet wird. Du solltest and und or verwenden, die vor == ausgewertet werden. So etwas wie == True kann man sich ganz sparen: if isprime(5): ...

Gruß



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 46143
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2020-03-25


Hi Bekell,
verwende nicht &, sondern &&.
Ersetze true durch True.
Gruß Buri



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 1073
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-03-25


2020-03-25 16:26 - Buri in Beitrag No. 4 schreibt:
verwende nicht &, sondern &&.

Was soll && sein? Willst du auf das hinaus, was schnitzel oben gesagt hat?

2020-03-25 09:30 - schnitzel in Beitrag No. 3 schreibt:
Beachte, dass & ein bitweiser Operator ist, der nach == ausgewertet wird. Du solltest and und or verwenden, die vor == ausgewertet werden.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 46143
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2020-03-25


2020-03-25 17:23 - zippy in Beitrag No. 5 schreibt:
Was soll && sein?
Hi zippy,
ich habe nachgeschaut: in Python gibt es die Operatoren &&, || und ! nicht.
Sorry für die Verwirrung.
Für logische Verknüpfungen kann man auch den Operator and verwenden, das funktioniert genau so wie && in C/C++/Java.
Gruß Buri



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
emmi82
Senior Letzter Besuch: im letzten Monat
Dabei seit: 06.05.2013
Mitteilungen: 410
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2020-03-29


Hi Buri,

"and" verhält sich in Python bei mir ganz anders als "&&" in C++:
C++: nicht bitweise, sondern immer False, wenn wenigstens eins davon echter Nullwert ist, sonst True.
C++
void test(int x, int y){
    std::cout << x << ", " << y << ", " << (x && y) << " vs. " << (y && x) << "\n";
}

Zu "and": für mich unerklärlicherweise asymmetrische Ergebnisse, auch für gleich lange Bitzahlen, wie man sieht:
Python
>>> 255 and 254
254
>>> 254 and 255
255
>>> 0b11111111 and 0b11111110
254
>>> 0b11111110 and 0b11111111
255
>>> -999.999 and 34.344545
34.344545
Es scheint zu gelten x and y == y. Das passiert auch, wenn x und y Strings sind. Bei or wird immer das erste ausgegeben.

Den "!=" gibt es in Python, aber den ! nicht. Dann behilft man sich eben mit not. False ist 0, 0x0, True ist z.B. 88, -7, "txt".

emmi



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 1073
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2020-03-30


2020-03-29 23:43 - emmi82 in Beitrag No. 7 schreibt:
Es scheint zu gelten ...

Man muss diese Regeln nicht erraten. Sie sind dokumentiert.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27254
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2020-03-30


2020-03-29 23:43 - emmi82 in Beitrag No. 7 schreibt:
"and" verhält sich in Python bei mir ganz anders als "&&" in C++:
C++: nicht bitweise, sondern immer False, wenn wenigstens eins davon echter Nullwert ist, sonst True.
C++
void test(int x, int y){
    std::cout << x << ", " << y << ", " << (x && y) << " vs. " << (y && x) << "\n";
}

Was will uns dieses Programm sagen ?

emmi82 schreibt:
Zu "and": für mich unerklärlicherweise asymmetrische Ergebnisse, auch für gleich lange Bitzahlen, wie man sieht:
and wird normalerweise für Boole'sche Werte verwendet, nicht für Zahlen.

emmi82 schreibt:
Python
>>> 255 and 254
254
>>> 254 and 255
255
>>> 0b11111111 and 0b11111110
254
>>> 0b11111110 and 0b11111111
255
>>> -999.999 and 34.344545
34.344545
Es scheint zu gelten x and y == y. Das passiert auch, wenn x und y Strings sind. Bei or wird immer das erste ausgegeben.

Den "!=" gibt es in Python, aber den ! nicht. Dann behilft man sich eben mit not. False ist 0, 0x0, True ist z.B. 88, -7, "txt".
Siehe die von zippy verlinkte Doku.

emmi82 schreibt:
emmi
1/4


-----------------
Bild



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3082
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2020-03-30


2020-03-30 00:24 - zippy in Beitrag No. 8 schreibt:
2020-03-29 23:43 - emmi82 in Beitrag No. 7 schreibt:
Es scheint zu gelten ...

Man muss diese Regeln nicht erraten. Sie sind dokumentiert.
Die sind von LISP übernommen, wie es scheint. Gute Wahl 🙂



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]