An iterator returns a sequence through next calls, each with a value and a done flag. A for-of loop performs those calls for you. A generator creates an iterator from a function that suspends at yield and resumes when the next value is requested. That lets you describe a range or delegate to another iterable with yield*. Consumption still needs a stopping rule. A manual loop must respect done, and a for-of loop that breaks closes its generator so a finally block can release local state. You will practice inclusive bounds, empty groups, and early termination. Keep the distinction between a yielded value and the generator's final return value.