Für Loop iterate über Potenzen von 2

Ich möchte eine für Schleife schreiben, die über die Potenzen von 2 für jede Schleife iterieren wird.

Zum Beispiel möchte ich eine solche Strecke:

2, 4, 8, 16, ... , 1024 

Wie könnte ich das machen?

5 Solutions collect form web for “Für Loop iterate über Potenzen von 2”

 counter = 2 while counter <= 1024: print counter counter *= 2 

Du musst deine eigene Funktion erstellen:

 def doubling_range(start, stop): while start < stop: yield start start <<= 1 

Dies verwendet einen Linksschaltvorgang; Du könntest auch start *= 2 benutzen, wenn du das klarer findest.

Demo:

 >>> def doubling_range(start, stop): ... while start < stop: ... yield start ... start <<= 1 ... >>> for i in doubling_range(2, 1025): ... print i ... 2 4 8 16 32 64 128 256 512 1024 

Sie sagen, Sie wollen über die Kräfte von 2 für jede Schleife zu iterieren,

Wenn Sie Ihr Beispiel sehen, könnte die Formulierung sein:

Machen Sie eine Schleife, die die Initiale mit 2 multiplizieren, bis sie 1024 erreichen.

 ii = 2 while ii <= 1024: print ii ii = ii*2 

Sie können einen Generatorausdruck verwenden, damit er die Zahlen nach Bedarf erzeugt und sie nicht Speicher entpacken:

 >>> for x in (2**p for p in range(1, 11)): ... print(x) 2 4 8 16 32 64 128 256 512 1024 

In Python 2 können Sie xrange anstelle von range , um es als Generator zu halten und vermeiden, unnötige Listen zu erzeugen.

Wenn du den eigentlichen Stopppunkt anstelle der Macht betätigen willst, ist das wohl der einfachste Weg:

 from itertools import count for x in (2**p for p in count(1)): if x > 1024: break print(x) 

Du könntest alles in einer Zeile setzen:

 from itertools import count, takewhile for x in takewhile(lambda x: x <= 1024, (2**p for p in count(1))): print(x) 

Aber das wird dumm (und nicht sehr lesbar).

Sie brauchen nicht Ihre eigene Funktion für diese, verwenden Sie einfach ein Lambda

 import sys from math import log for i in map(lambda v : pow(2,v), range(0,log(1024, 2))): print i 

Ausgabe sieht aus wie

 1 2 4 8 16 32 64 128 256 512 1024 

Wenn Sie wissen, welche Kraft von 2 Sie gehen müssen. Wenn du es nicht tust, könntest du einfach auf den größten speicherbaren int gehen, so:

 from math import log import sys for i in map(lambda v : pow(2,v), range(0,int(log(sys.maxint, 2)))): print i 

Ausgabe sieht aus wie

 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 2147483648 4294967296 8589934592 17179869184 34359738368 68719476736 137438953472 274877906944 549755813888 1099511627776 2199023255552 4398046511104 8796093022208 17592186044416 35184372088832 70368744177664 140737488355328 281474976710656 562949953421312 1125899906842624 2251799813685248 4503599627370496 9007199254740992 18014398509481984 36028797018963968 72057594037927936 144115188075855872 288230376151711744 576460752303423488 1152921504606846976 2305843009213693952 4611686018427387904 
Python ist die beste Programmiersprache der Welt.