Jeg prøver å se etter et palindrom med Python. Koden jeg har er veldig for
-loop-intensiv.
Og det ser ut til at den største feilen folk gjør når de går fra C til Python, er å prøve å implementere C-logikk i Python, noe som gjør at ting går sakte, og det er ikke å få mest mulig ut av språket.
Jeg ser på dette nettstedet. Søk etter "C-style for", at Python ikke har for-løkker i C-stil. Kan være utdatert, men jeg tolker det som at Python har egne metoder for dette.
Jeg har prøvd å lete rundt, men finner ikke mye oppdatert (Python 3) råd for dette. Hvordan kan jeg løse en palindromutfordring i Python, uten å bruke for-løkke?
Jeg har gjort dette i C i undervisningen, men ønsker å gjøre det i Python, på personlig basis. Oppgaven er fra Euler Project, flott nettsted forresten.
def isPalindrome(n):
lst = [int(n) for n in str(n)]
l=len(lst)
if l==0 || l==1:
return True
elif len(lst)%2==0:
for k in range (l)
#####
else:
while (k<=((l-1)/2)):
if (list[]):
#####
for i in range (999, 100, -1):
for j in range (999,100, -1):
if isPalindrome(i*j):
print(i*j)
break
Jeg mangler mye kode her. De fem hashene er bare påminnelser til meg selv.
Konkrete spørsmål:
I C ville jeg laget en for-løkke som sammenligner indeks 0 med indeks max, og deretter indeks 0+1 med max-1, til noe noe. Hvordan gjør jeg dette best i Python?
Min for-løkke (in in range (999, 100, -1), er dette en dårlig måte å gjøre det på i Python?
Er det noen som har noen gode råd, eller gode nettsteder, eller ressurser for folk i min situasjon? Jeg er ikke programmerer, jeg har ikke ambisjoner om å bli det, jeg vil bare lære nok til at når jeg skal skrive bacheloroppgaven min (elektroteknikk), så slipper jeg å LÆRE meg et aktuelt programmeringsspråk samtidig som jeg prøver å oppnå gode resultater i prosjektet. "Hvordan gå fra grunnleggende C til god anvendelse av Python", den slags.
Noen spesifikke kodebiter for å lage en god løsning på dette problemet vil også bli verdsatt, jeg trenger å lære gode algoritmer ... Jeg ser for meg 3 situasjoner. Hvis verdien er null eller ett siffer, hvis den er av oddetallslengde, og hvis den er av jevn lengde. Jeg planla å skrive for løkker ...
PS: Problemet er: Finn det høyeste verdiproduktet av to 3-sifrede heltall som også er et palindrom.
En pythonisk metode for å avgjøre om en gitt verdi er et palindrom:
str(n) == str(n)[::-1]
Forklaring:
n
er lik den inverterte strengrepresentasjonen av n
.[::-1]
sørger for å invertere strengen.==
.Et alternativ til den lite intuitive syntaksen [::-1]
er denne:
>>> test = "abcba"
>>> test == ''.join(reversed(test))
True
Funksjonen reversed
returnerer en omvendt sekvens av tegnene i test
.
''.join()
setter disse tegnene sammen igjen uten noe i mellom.
Det fantastiske med python er alt du kan gjøre med det. Du trenger ikke å bruke indekser for strenger.
Følgende vil fungere (ved hjelp av slices)
def palindrome(n):
return n == n[::-1]
Den reverserer ganske enkelt n, og sjekker om de er like. n[::-1]
reverserer n (-1 betyr å dekrementere)
"2) Min for loop (in in range (999, 100, -1), er dette en dårlig måte å gjøre det på i Python?"
Når det gjelder det ovennevnte, vil du bruke xrange
i stedet for rekkevidde (fordi rekkevidde vil opprette en faktisk liste, mens xrange er en rask generator)
Mine meninger om spørsmål 3.
Jeg lærte C før Python, og jeg leste bare dokumentasjonen og lekte meg med det ved hjelp av konsollen. (og ved å gjøre Project Euler-problemer også :)