Nejlepší odpověď
** První věc **:
64bitový Python lze nainstalovat pouze na 64bitový systém, který lze nainstalovat pouze na 64bitový počítač.
** Druhá věc: **
Říct, že počítač / program je n-bit, neznamená, že používá proměnné velikosti n. To znamená, že dokáže adresovat až 2 ^ n paměťové bloky (obvykle bajty). Proto Windows XP nebo jakýkoli jiný 32bitový operační systém nemůže použít více než přibližně 3,5 GB paměti RAM. Pojďme to vypočítat: máme 32 binární bity, takže můžeme adresovat až 2 ^ 32 bajtů. 2 ^ 32 = 4294967296 [bajty] = 4096 [MB] = 4 [GB]. Jak vidíte, teoreticky by systém měl řešit až 4 GB paměti RAM. Tato „chybějící“ část přibližně 0,5 [GB] se používá k adresování paměti zařízení PCI (AGP, USB atd.). U 64bitového systému můžeme adresovat až 16777216 [TB] paměti. Docela v pohodě, co?
** tl; dr **
Programy běží s 32bitovou instancí python mohl použít až (v ideálním případě) 4 [GB] paměti, což je obvykle dost, ale někdy to může způsobit problémy. Na druhou stranu, 64bitová instance pythonu (takže s ní běží i programy) dokáže adresovat a využívat neomezené * množství paměti, což je hezké. Ale znovu, k odpovědi Adama Jorgensena: stejný program spuštěný na 32 a 64 bitovém pythonu použije stejné množství paměti, pokud by to bylo méně než asi 4 [GB]. Na 64bitových to nebude pomalejší python taky.
* není to úplně pravda. Pokud máte zájem, podívejte se na druhou věc.
Doufám, že to pomůže. 🙂
Odpověď
Vaše otázka ukazuje nedostatek porozumění tomu, co se děje, takže si udělám čas a promluvím si o tom podrobně.
V prvním řádku napíšete for loop in range(1, 11).
Název loop
nemá vůbec smysl. Celá konstrukce je jedna smyčka , tj. smyčkou procházíte pouze jednou čísly od 1 do 10. To, co jste napsali, vám připadá, jako byste opakovali smyčku 10krát, což není pravda. Takže i když je váš kód správný, název proměnné naznačuje, že o co jde.
for number in range(1, 11):
print(number)
Celá ta věc (ty dva celé řádky kódu) je for loop
. Jeden for loop
.
Já ne “ Nechápete, čeho chcete ve smyčce while
dosáhnout, z mnoha důvodů. Nejprve, pokud chcete iterovat všemi čísly a dát uživateli možnost vymanit se ze smyčky po každém čísle, můžete to jednoduše udělat pomocí smyčky pro.
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
Můžete opravit tisk range(1, 11)
zabalením do list()
, ale zdá se, že to není to, co chcete. Předpokládám, že chcete dělat to samé jako ve smyčce for, jmenovitě tisk každého čísla, ale možnost po každém čísle se vymanit ze smyčky. Proč byste jinak měli smyčku, tisknout pořád dokola to samé znovu?
Pokud nechcete použít smyčku for, můžete použít něco jako:
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
nebo
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
Všimněte si použití iter
. range(1, 11)
není není iterátor , ale iterovatelný , což znamená objekt, který může vytvořit iterátor . Jedná se o velmi jemný, ale důležitý rozdíl. list
je iterovatelný, ale ne iterátor. Iterátor má stav, což znamená, že si pamatuje, jakou hodnotu má dále produkovat. Nelze to udělat se seznamem, ale ze seznamu můžete udělat iterátor.
Například:
>>> 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)
Pokud chcete vědět, jak to funguje„ pod kapotou “, podívejme se na následující příklady:
>>> 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
je iterátor , protože má stav (pamatuje si, kde je, abych tak řekl). Konkrétně má definovanou metodu \_\_next\_\_()
. Může vytvořit další hodnotu v kterémkoli bodě. Je to také iterovatelný , protože má \_\_iter\_\_(
)
metoda definována.
Generátor je iterátor, který líně vytváří hodnoty, například:
def counter(current=1):
while True:
yield current
current += 1
A ano, generátory tedy mají stav:
>>> my\_counter = counter()
>>> next(my\_counter)
1
>>> next(my\_counter)
2
>>> next(my\_counter)
3
Co je nyní zajímavé, je to, že range
není a generátor , na rozdíl od všeobecného přesvědčení. range
je iterovatelný , ale nikoli iterátor , a tedy rozhodně ne generátor . Může se to zdát nepříjemné, ale má to několik dobrých důvodů (další atributy jako start
, stop
a step
, neměnnost (nelze jej změnit; aby něco mělo stát, musí být proměnlivé), je samozřejmě možné implementovat range
jako generátor:
>>> 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]
Doufám, že jsem dostal dostatečné zázemí k tomu, abych vašemu problému začal rozumět, a ne jej pouze opravovat.