---
# System prepended metadata

title: Iterator and Generator

---

# Iterator and Generator
## Iterator迭代器
  - 迭代：從某個地方（string,list...等）一個一個取出元素的過程
  - Iterator的用法：物件-> iter()-> iterator(可以用next()呼叫)
  - for loop 就是一種將物件變成iterator的過程
  
-- 範例
```python=
String = "Hello"
iString = iter(String)
print(next(iString))
print(next(iString))
print(next(iString))#若超過範圍（Ex.輸出第六次），會出現“StopIteration"錯誤

#H
#e
#l
```
- 應用

自己製作含有funtion的for迴圈
```python3=
def myfor(i,fx):
	iterator = iter(i) #設一個變數給iter完的參數
	while True:#在遇到終止條件之前可以不斷重複
		try:
			a = next(iterator)#用next一次呼叫一個數值來iterate
		except StopIteration:#全部interate完成即停止
			break
		else:#如果沒有遇到except,執行完try之後就執行else的指令
			fx(int(a))

def triple(x):#設計一個可以產生三次方的函數
	print(x**3)

myfor("13453", triple)#放入iterable的數值與函式，注意int等數字不可以迭代！
```
## Generator 產生器
- 是一種iterator(一樣可以支援for loop與呼叫next)
- 由generator function產出
- function vs generator function
-- Function 用return回傳值，只能回傳一次
-- Generator function 用yield回傳generator,可以yield很多次

範例
```python=
def count_up_to(max):
	count = 1
	while count <=max:
		yield count #generator function的特徵
		count +=1
#因為yeild出的是generator,無法直接輸出值，但可以跑for loop或呼叫next
Ｃ = count_up_to(21) #用Ｃ來儲存這個generator
print(next(C))
print(next(C))#第二次呼叫的時候會記住上次的狀態，從停止的地方執行

#1
#2
```

製作'yes/no' generator
```python=
def yn():
	ans = "yes"
	while True:
		yield ans
		ans = "no" if ans == "yes" else "yes"	

yn_gen = yn() #一定要有這個指定參數給Generator的步驟

print(next(yn_gen))#next()內放的是參數
print(next(yn_gen))
print(next(yn_gen))

#yes
#no
#yes
```
- Generator Expression
-- 類似list comprehension用[],Generator Expression用()

完整寫法
```python=
def nums():
    for num in range(1,10)#generator可以支援for loop
        yield num #會產生1-10的generator
    new_gen = nums()
```
Generator expression
```python3=
new_gen = (num for num in range(1,10))
```

Generator expression 也可以帶入sum
```python=
Ans = sum(num for num in range(1,10))#寫在sum()內部用特別多加括號
print(Ans)#從1加到9
#45
```



