Beste svaret
** Første ting **:
64-biters Python kan bare installeres på 64-biters system, som bare kan installeres på 64-biters datamaskin.
** Andre ting: **
Å si at datamaskin / program er n-bit betyr ikke at det bruker variabler av størrelse n. Det betyr at den kan adressere opptil 2 ^ n minnebiter (vanligvis byte). Dette er grunnen til at Windows XP eller et hvilket som helst annet 32-biters operativsystem ikke kan bruke mer enn ca 3,5 GB ram. La oss beregne det: vi har 32 binære biter, slik at vi kan adressere opptil 2 ^ 32 byte. 2 ^ 32 = 4294967296 [byte] = 4096 [MB] = 4 [GB]. Som du kan se, skal teoretisk systemet adressere opptil 4 GB ram. Denne «manglende» delen på omtrent 0,5 [GB] brukes til å adressere PCI-minne (AGP, USB osv.). Med 64-biters system kan vi adressere opptil 16777216 [TB] minne. Ganske kult, ikke sant?
** tl; dr **
Programmer kjøres med 32-biters forekomst av python kan bruke opptil (ideelt sett) 4 [GB] minne, som vanligvis er nok, men noen ganger kan det føre til problemer. På den andre måten kan 64-biters forekomst av python (slik at programmer kjører med den også) adressere og bruke ubegrenset * mengde minne, noe som er fint. Men igjen, til Adam Jorgensens svar: samme program som kjøres på 32 og 64-biters python vil bruke like mye minne, så lenge det ville være mindre enn omtrent 4 [GB]. Det ville ikke vært tregere på 64-bit. python også.
* det er ikke helt sant. Se den andre tingen hvis du er interessert.
Håper det hjelper. 🙂
Svar
Spørsmålet ditt viser manglende forståelse fra hva som skjer, så jeg tar meg tid til å snakke om dette alt i detalj.
I første linje skriver du for loop in range(1, 11).
Navnet loop
gir ikke mening i det hele tatt. Hele konstruksjonen er en sløyfe , dvs. at du bare sløyfer en gang gjennom tallene fra 1 til 10. Det du skrev, gjør at det virker som om du sløyfer 10 ganger, noe som ikke er sant. Så selv om koden din er riktig, indikerer navnet på variabelen manglende forståelse hva som skjer.
for number in range(1, 11):
print(number)
Det hele (de to fulle kodelinjene) er for loop
. Én for loop
.
Jeg don » t forstå hva du vil oppnå med while
løkken av flere årsaker. For det første, hvis du vil gjenta alle tallene og gi brukeren muligheten til å bryte ut av løkken etter hvert nummer, kan du ganske enkelt gjøre det med en for-løkke.
for number in range(1, 11):
print(number)
user\_input = input("Do you want to break? (Y/N)")
if user\_input.lower().startswith("y"): #allow for variations and upper/lower case
break
Du kan fikse utskriften av range(1, 11)
ved å pakke den inn i list()
, men det ser fremdeles ikke ut til å være det du vil ha. Jeg antar at du vil gjøre det samme som i for-sløyfen, nemlig å skrive ut hvert nummer, men å gi muligheten til å bryte ut av sløyfen etter hvert nummer. Hvorfor ville du ha en sløyfe ellers, å skrive ut det samme om og om igjen igjen?
Hvis du ikke vil bruke en for loop, kan du bruke noe sånt som:
current = 1
while True:
print(current)
current += 1
user\_input = input("Do you want to break? (Y/N)")
if user\_input.lower().startswith("y") or current == 10:
break
eller
numbers = iter(range(1, 11))
while True:
current = next(numbers)
print(current)
user\_input = input("Do you want to break? (Y/N)")
if user\_input.lower().startswith("y") or current == 10: #avoid StopIteration
break
Legg merke til bruken av iter
. range(1, 11)
er ikke og iterator , men en iterabel , som betyr et objekt som kan produsere en iterator . Dette er et veldig subtilt, men viktig skille. En list
er en iterabel, men ikke en iterator. En iterator holder tilstand, noe som betyr at den husker hvilken verdi som skal produseres neste. Du kan ikke gjøre det med en liste, men du kan gjøre en liste til en iterator.
For eksempel:
>>> my\_list = [1, 2, 3, 4, 5]
>>> my\_list\_iterator = iter(my\_list)
>>> first\_value = next(my\_list\_iterator)
>>>
>>> first\_value
1
>>> second\_value = next(my\_list\_iterator)
>>> second\_value
2
>>> type(my\_list)
>>> type(my\_list\_iterator)
Hvis du vil vite hvordan det fungerer» under panseret «, la oss se på følgende eksempler:
>>> class Counter:
... def \_\_init\_\_(self, start=1):
... self.current = start
... def \_\_next\_\_(self):
... value = self.current
... self.current += 1
... return value
... def \_\_iter\_\_(self):
... return self
...
>>> my\_counter = Counter()
>>> next(my\_counter)
1
>>> next(my\_counter)
2
>>> next(my\_counter)
3
my\_counter
er en iterator , siden den holder tilstand (den husker hvor den er, for å si det sånn). Spesielt har den definert en \_\_next\_\_()
-metode. Den kan produsere neste verdi når som helst. Det er også en iterabel , siden den har \_\_iter\_\_(
)
metode definert.
En generator er en iterator som lat produserer verdier, for eksempel:
def counter(current=1):
while True:
yield current
current += 1
Og ja, generatorer har altså tilstand:
>>> my\_counter = counter()
>>> next(my\_counter)
1
>>> next(my\_counter)
2
>>> next(my\_counter)
3
Det som er interessant nå, er at range
er ikke en generator , i motsetning til populær tro. range
er en iterabel , men ikke en iterator , og dermed definitivt ikke en generator . Dette kan virke irriterende, men det er noen gode grunner til dette (ekstra attributter som start
, stop
og step
, uforanderlighet (kan ikke endres; for at noe skal holde tilstand, trenger det tå være muterbart)). Det er selvfølgelig mulig å implementere range
generator:
>>> def my\_range\_generator(start, stop, step=1):
... current = start
... while current
... yield current
... current += step
...
>>> test\_range = my\_range\_generator(1, 11, 2)
>>> list(test\_range)
[1, 3, 5, 7, 9]
Jeg håper jeg har gitt nok bakgrunn til å begynne å forstå problemet ditt, i stedet for bare å rette det.