Python check digit

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • JamieVD
  • Registratie: Oktober 2020
  • Laatst online: 09-04-2021
Ik ben een tijdje geleden begonnen met Python.

Nu ben ik bezig met een code waarbij een input een getal is, bijvoorbeeld 24545 of 123 etc
Daar moet het laatste cijfer vanaf gehaald worden
Vervolgens moeten de overige cijfers bij elkaar opgeteld worden (2 + 4 + 5 + 4 = 15)
Hierna volgen nog wat meer stappen maar die begrijp ik.

Waar ik nu op vast loop is het uitrekenen van de overige cijfers, hoe kan ik dat doen zonder dat hij het laatste cijfer er ook bij optelt?

Mijn code tot nu toe:
num = int(input("Enter a positive integer number: "))
result = 0
lastdigit = int(repr(num)[-1]) #laatste getal detecteren
for i in range(len(str(num))): #cijfers bij elkaar optellen
digit = num%10
result = result + digit
num = num//10

print(lastdigit)

print("sum is: ",result)

------
Groet Jamie

Alle reacties


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je kunt het op twee manieren oplossen:
1. Het laatste getal niet optellen. Dat kan met een if in de for-loop.
2. Het laatste getal van de uitkomst aftrekken.

Je berekening van lastdigit is trouwens niet zo mooi. Kan dat ook niet met de modulo-operator?

Acties:
  • 0 Henk 'm!

  • CB32
  • Registratie: November 2011
  • Laatst online: 27-07 19:37
Je for loop telt alle cijfers op het zou tot strlen-1 moeten lopen maar ik spreek geen python.

Acties:
  • +1 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 25-07 17:37
Met input krijg je een reeks karakters als string terug. Over deze string kun je direct loopen. Binnen de loop kun je (proberen) het karakter naar een getal te casten en op te tellen. Dat lijkt me veel efficiënter.

Python:
1
2
3
4
5
6
7
8
9
user_input = input("...")
output = 0
for char in user_input:
    try:
        output += int(char)
    except ValueError:
        raise ValueError(f"Karakter {char} is niet numeriek!") 

print(output)


Met try...except kun je het probleem afvangen dat de gebruiker een niet-numeriek karakter intypt ("a" bijvoorbeeld). Dit is nodig omdat een str meer waardes kan bevatten dan een int (ook wel narrowing cast genoemd).

[ Voor 53% gewijzigd door Morrar op 12-10-2020 19:53 ]


Acties:
  • 0 Henk 'm!

  • JamieVD
  • Registratie: Oktober 2020
  • Laatst online: 09-04-2021
Dankjewel voor jullie hulp ik ga het toepassen in mijn code

Acties:
  • +2 Henk 'm!

  • JJ16v
  • Registratie: Augustus 2005
  • Laatst online: 11-05 07:57
Python is de king of one-liners :)

return sum(int(c) for c in input('...')[:-1])

Acties:
  • +3 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 25-07 17:37
JJ16v schreef op maandag 12 oktober 2020 @ 19:51:
Python is de king of one-liners :)

return sum(int(c) for c in input('...')[:-1])
Nice! Op zich waar, maar voor de leesbaarheid / onderhoudbaarheid van code vind ik one liners niet altijd de beste oplossing... ;)

Acties:
  • +1 Henk 'm!

  • JJ16v
  • Registratie: Augustus 2005
  • Laatst online: 11-05 07:57
Morrar schreef op maandag 12 oktober 2020 @ 19:52:
[...]


Nice! Op zich waar, maar voor de leesbaarheid / onderhoudbaarheid van code vind ik one liners niet altijd de beste oplossing... ;)
vooral met list comprehension of generators werken dat scheelt enorm in de performance.
je kunt het altijd nog netter opschrijven, bv:

code:
1
2
3
4
5
user_input = input('...')
value = sum(
  int(c)
  for c in user_input[ : -1]
)

[ Voor 17% gewijzigd door JJ16v op 12-10-2020 20:01 ]


Acties:
  • 0 Henk 'm!

  • NMH
  • Registratie: Oktober 2015
  • Nu online

NMH

Moderator General Chat
JJ16v schreef op maandag 12 oktober 2020 @ 19:51:
Python is de king of one-liners :)

return sum(int(c) for c in input('...')[:-1])
Dat zou ook mijn oplossing zijn, maar ik vermoed dat de TS wel gebaat zou zijn bij wat uitleg wat de code precies doet. :)
Morrar schreef op maandag 12 oktober 2020 @ 19:52:
Nice! Op zich waar, maar voor de leesbaarheid / onderhoudbaarheid van code vind ik one liners niet altijd de beste oplossing... ;)
Heh, dan moet je mijn "oneliners" maar niet zien, ik heb hier een expressie die met nette indentatie 26 regels beslaat. O-)

Acties:
  • 0 Henk 'm!

  • JJ16v
  • Registratie: Augustus 2005
  • Laatst online: 11-05 07:57
NMH schreef op maandag 12 oktober 2020 @ 20:00:
Dat zou ook mijn oplossing zijn, maar ik vermoed dat de TS wel gebaat zou zijn bij wat uitleg wat de code precies doet. :)
oke dan:

(x for x in y): is een generator, wat betekent dat tijdens het uitvoeren over elk element in y (y moet wel iterable zijn) gestapt wordt, wat je met elk element doet kun je zelf bepalen. In dit geval casten naar int dus,
maar je kunt natuurlijk ook een random andere functie of berekening aanroepen.

variable[x : y]: wordt een slice genoemd, elke iterable kun je op deze manier "opdelen". De x bepaald het eerste element van variable in de slice (0 als x weg gelaten word bv: variable[ : y] = vanaf 0 tot y), de y bepaald het laatste element in de slice (len(variable) als y weg gelaten word, bv variable[x : ] = vanaf x tot het eind). Hierbij kun je voor y ook relatieve indices gebruiken door er een - teken voor te zetten, bv variable[:-1] betekent vanaf 0 t/m len(var) - 1 dus slaat het laatste element over.

de sum functie neemt een iterable van scalars (int, long, float, etc) en telt deze op, als je daar dus een generator of een slice van een iterable in stopt zal het resultaat de som van die elementen zijn.
Pagina: 1