A Python for loop iterates directly over each item in a sequence or iterable such as a list, string, tuple, set, dictionary, or file. You never have to initialize i = 0 or increment index counters manually.
When you also need the numeric position or want to walk two lists side by side, Python's built-in enumerate() and zip() helpers keep your loop body clean.
range(), enumerate(), and zip()range(start, stop, step) generates numbers lazily without storing a huge list in memory. enumerate(items, start=1) yields (index, value) pairs cleanly.
servers = ["web-01", "web-02", "db-01"]
cpu_loads = [42, 68, 31]
for idx, (server, load) in enumerate(zip(servers, cpu_loads), start=1):
status = "HIGH" if load > 60 else "OK"
print(f"{idx}. {server}: {load}% ({status})")
for ... elseJust like while, break exits a for loop early, and continue jumps to the next item. A trailing else: runs only if the loop finished without hitting break, which is handy for search loops.
for n in [4, 6, 8, 9]:
if n % 2 != 0:
print(f"Found odd number: {n}")
break
else:
print("All numbers were even")
for i in range(len(items)):: Iterate directly with for item in items: or enumerate(items) unless you are overwriting indices in place.range(1, 5) to include 5: range stops before the end argument, yielding 1, 2, 3, 4.zip() lengths: By default zip() stops at the shortest iterable; pass strict=True in Python 3.10+ to catch mismatched lengths.Yes. Wrap the sequence in reversed(items), which iterates in reverse without copying the list.
Call for key, value in my_dict.items(): to unpack both parts on each iteration.
range(1_000_000) use lots of memory?No. range computes each number on demand, using the same tiny memory regardless of how large the range is.
Sign in to track your learning journey, earn industry-recognized certificates, and join our elite developer community.
Quick Access With
Experiment with the code from this lesson in our interactive playground.