Seite 1 von 1

Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Dienstag 3. November 2020, 20:32
von PythonerXY
Hallo,
gerade habe ich versucht ein Programm zur Primfaktorzerlegung zu schreiben.
Das Programm ist natürlich noch nicht fertig. Allerdings habe ich im Debugger versucht das Programm nur mit dem Teil, in dem ich alle Primzahlen in eine Liste schreibe auszuführen.
Das Ganze hat so lange geklappt bis ich versucht habe das mit Variablen etwas auszubauen. Allerdings kommt jedes mal der Fehler, dass ich einen String und keinen Integer verwenden würde. (Bei meiner Variable "inputNumb")

Ich bin noch ein Anfänger deshalb entschuldigt bitte, wenn der Fehler offensichtlich ist.

Hier der Code:

Code: Alles auswählen

import math

inputNumb = int(input("Bitte geben Sie die umzuwandelnde Nummer ein (Sie muss eine ganze Zahl sein)."))
primes = []

def isprime(number):
    if number <= 1:
        return False
    if number == 2:
        return True
    if number % 2 == 0:
        return False
    for ind in range(3, int(math.sqrt(number))+1):
     if number % ind == 0:
        return False
    return True

for i in range (1, inputNumb / 2):
    if isprime(i):
        primes.append(i)
    else:
        continue

print(primes)
Vielen Dank im Voraus für Eure Hilfe.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Dienstag 3. November 2020, 21:25
von sparrow
@PythonerXY: Poste immer die Fehlermeldung - also den kompletten Traceback - zu deinem Code. Denn der Fehler ist nicht der, den du beschreibst.

Code: Alles auswählen

    for i in range (1, inputNumb / 2):
TypeError: 'float' object cannot be interpreted as an integer
Range braucht zwei Ganzzahlen.
Das Ergebnis der Division von zwei Ganzzahlen ist in Python 3.x immer eine Fließkommazahl (float):

Code: Alles auswählen

>>> 5 / 2
2.5
>>> 6 / 2
3.0
Es gibt aber auch Ganzzahlige Division:

Code: Alles auswählen

>>> 5 // 2
2
>>> 6 // 2
3
Wobei hier immer abgerundet wird.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Dienstag 3. November 2020, 21:41
von __blackjack__
@PythonerXY: Anmerkungen zum Quelltext: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Namen sollten nicht kryptisch abgekürzt werden. Oder was ist eine indische Zahl (`ind`) und wie kann eine Eingabe taub oder gefühllos sein (`inputNumb`)?

Eingerückt wird mit vier Leerzeichen pro Ebene.

Das ``else: continue`` ist sinnfrei weil das an der Stelle nichts bewirkt. Mit ``continue`` würde ich auch eher sparsam umgehen weil das ein unbedingter Sprung ist, den man dem Code nicht an den Einrückungen ablesen kann. ``continue`` erschwert also die Lesbarkeit/das Verständnis von Code.

Bei der ``for``-Schleife in der Funktion könnte man die Anzahl der Durchläufe halbieren in dem man nur über die ungeraden Zahlen iteriert. Denn wenn die zu testende Zahl durch eine gerade Zahl teilbar währe, dann wäre sie ja davor schon durch 2 teilbar gewesen.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 12:51
von PythonerXY
@sparrow
@_blackjack_
Ok, vielen Dank.
Ich hatte einfach das 2. "/" vergessen.
Danke auch für die Vereinfachungshilfen.

Primfaktorzerlegung Funktionsfehler

Verfasst: Mittwoch 4. November 2020, 14:38
von PythonerXY
Hallo Forum,
ich hatte gestern ein Programmteil bereits veröffentlicht in dem ich jetzt auch alle Fehler beheben konnte.
Dieses Mal kann es sich allerdings nur um einen Anfängerfehler handeln, denn meine Calculator Methode kann ich keine Werte mitgeben was allerdings zwingend notwendig ist.
Hier das Programm:
import math

Code: Alles auswählen

def isprime(number):
    if number <= 1:
        return False
    if number == 2:
        return True
    if number % 2 == 0:
        return False
    for int_numb in range(3, int(math.sqrt(number))+1):
        if number % int_numb == 0:
            return False
        else:
            return True


def calculator(primes, input_numb, solution):
    solution = input_numb
    while solution > 2 and solution != primes.index():
        laufvariable = 0
        if True == isinstance(solution / primes[laufvariable], int):
            endergebnis = endergebnis + laufvariable + ["*"]
            solution = solution / primes.index(laufvariable)
            laufvariable = 0
        else:
            laufvariable = laufvariable + 1

    return endergebnis




while bool(input("Wenn Sie das Programm starten wollen bestätigen Sie mit *True* (Ohne *)")):
    input_numb = int(input("Bitte geben Sie die umzuwandelnde Nummer ein (Sie muss eine ganze Zahl sein)."))
    primes = []
    for i in range(1, input_numb // 2):
        if isprime(i):
            primes.append(i)
    solution = 0
    calculator(primes, input_numb, solution)

    print("Dies ist eine Liste mit allen benötigten Primzahlen für die Rechnung: ")
    print(primes)
Hier der Fehler:
Traceback (most recent call last):
File "C:/Users/foer1/PycharmProjects/ZahlenInPrimzahlen/main.py", line 41, in <module>
calculator(primes, input_numb, solution)
File "C:/Users/foer1/PycharmProjects/ZahlenInPrimzahlen/main.py", line 20, in calculator
while solution > 2 and solution != primes.index():
TypeError: index expected at least 1 argument, got 0

PS: Ich weiß auch, dass die Bedingung der while Schleife noch nicht ausgereift ist.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 14:47
von Jankie
Die index Methode wendet man z.B. auf Strings an um zu schauen an welcher Stelle sich das erste Zeichen befindet, nachdem man sucht. Das ist auch der Paramter der übergeben werden muss, das Zeichen welches in einem String gesucht werden soll. Was soll das denn deiner Meinung nach machen oder was hast du vor?

Code: Alles auswählen

sentence = "Das ist ein Beispieltext."

print(sentence.index("B"))


Die Zeile

Code: Alles auswählen

if True == isinstance(solution / primes[laufvariable], int)
ist genau wie, da isinstance schon einen Wahrheitswert zurückgibt.

Code: Alles auswählen

if isinstance(solution / primes[laufvariable], int)

Statt

Code: Alles auswählen

laufvariable = laufvariable + 1
kannst du auch

Code: Alles auswählen

laufvariable += 1
schreiben.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:20
von PythonerXY
Kurze Korrektur von dem letzten Beitrag, da ich diesen nicht mehr ändern kann.
Anstatt Methode war natürlich Funktion gemeint.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:22
von PythonerXY
@Jankie
Im Index Teil soll eigentlich nach dem Element der Liste gesucht werden.
Habe ich dafür INDEX falsch verwendet?

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:26
von PythonerXY
@Jankie
Mit dem ersten Index will ich sagen, dass die Zahl kein Element der Liste primes[] sein darf.
Mit dem 2. hatte ich vor das Element "Laufvariable" von Liste auszulesen.

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:34
von Jankie
Zum prüfen ob ein Element in einer Liste oder einem String vorkommt benutzt man in.

Code: Alles auswählen

sentence = "Das ist ein Beispieltext."

print("a" in sentence)
print("y" in sentence)

Hier teilst du solution durch den index der Zahl 0 in der Liste primes.

Code: Alles auswählen

solution = solution / primes.index(laufvariable)

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:35
von PythonerXY
Ok vielen Dank

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:37
von PythonerXY
Und wenn man nach einem bestimmten Element in der Liste sucht?

Re: Stings und Integar in Bedingungen (Initialisierungsfehler)

Verfasst: Mittwoch 4. November 2020, 15:39
von __blackjack__
@PythonerXY: Dann benutzt man immer noch ``in``.