关于python语法的一些问题

1.python生成器,以下是书上的一个例子:

 >>>def my_range(first=0,last=10,step=1):
 ...            number=first;
 ...            while number<last:
 ...                  yield number
 ...                  number+=step
 ...


调用这个函数:

 >>>range=my_range(1,5) 
 >>>for x in ranger:
  ...         print(x)
    ...
    1
    2
    3
    4

这里我就想问问yield number那里,这里应该是返回number的值,可是下面为什么还会有代码,python的函数的返回值可以不放在函数最后吗?另外看不明白my_range函数的意思,有没有大神能解释一下?

2.python命名空间和作用域的问题

>>>animal='fruitbat'
 >>>def change_and_print_global():
 ...            print('inside change_anf_print_global:',animal)
 ...            animal ='wombat'
 ...            print('after the change:',animal)
 ...
 >>>change_and_print_global()

执行上面这段代码会报错,local variable 'animal' referenced before assignment
然而,执行下面这段代码却不会报错

 >>>def change_local():
 ...            animal='wombat'
 ...            print('inside change_local:',animal,id(animal))
 ...
 >>>
 change_local()
 inside change_local: wombat  4330406160

以上这2段都是书上的代码,第一段代码会报错,可是第二段同样是在函数中使用了一个同名的变量,并给其附了值,第一段也是在函数内使用了同名变量,改变值。我看不出这2段代码有什么不同,可是为什么一段会报错,而另一段不会报错?求大神解析解析

这就是yield的特殊 它会返回数据 同时保存函数栈其它数据 下次调用的时候会直接从yield开始继续计算