```
"""
** 历史
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)
以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,
斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以
《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
** 数列内容
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,
610,987,1597,2584,4181,6765,10946,17711,28657,46368........
"""
# yield: 当函数中包含yield关键字, 返回值是一个生成器, 如果要执行函数内容.需要调用next方法, 或者for循环.
# 运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,
# 从上一次停止的yield处继续执行,遇到yield停止运行.
# return: 遇到return函数执行结束;
# num=1
def fib(num):
"""将来显示几个fib数列"""
# count代表显示的已经
# a代表第一个数, b代表第二个数, count代表已经显示的fib个数,当前为0.
a,b,count = 0,1,0
# 如果当前显示的个数小于需要显示的格式, 则显示b, 并且计算出下一个要显示的数。
while count < num:
yield b
a, b = b, a+b
# 已经显示的次数加1;
count += 1
# 生成器: 如果函数中有yield, 那么这个函数的返回值就是一个生成器;
res=fib(100)
print(next(res))
print(next(res))
# 生成器fib()执行的过程分析:
# 执行语句 f = fab(100) 时,并不会马上执行 fib() 函数的代码块,而是首先返回一个 iterable 对象(即生成器)!
# 在 for 循环语句执行时或者next(),才会执行 fib() 函数的代码块。
# 执行到语句 yield b 时,fib() 函数会返回一个迭代值,直到下次迭代前,
# 程序会回到 yield b 的下一条语句继续执行,然后再次回到 for 循环,如此迭代直到结束。
# 看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
# 由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,
# 从而节省内存空间。
`# 生成器可以使用的方法:
# - next(g)
# - g.send(''), 给生成器传递值;
# 给yield所在位置发送一个数据, 直到遇到下一个yield停止.
# def fun():
# while True:
# print("welcome......")
# receive = yield "hello"
# print(receive)
# # ***fun返回值是一个生成器对象.(因为函数中包含yield关键字)
# f = fun()
# print(f)
# print(next(f))
# f.send("微信") chat_robot():
res = ''
while True:
receive = yield res
if 'age' in receive:
res = "年龄保密"
elif 'name' in receive:
res = "siri"
else:
res = "i don't know what you say"
def main():
# 生成器对象
Robot = chat_robot()
next(Robot)
while True:
send_data = input("粉条>>:")
if send_data == 'q' or send_data == 'bye':
print("不聊了, 我也撤了.....")
break
print(Robot.send(send_data))
main()``
def fun():
print('step 1')
yield "yield1"
print('step 2')
yield 'yield2'
print('step3')
res = yield 'yield3' # res = "hello"
print("生成器接收了一个值:", res)
yield "yield4"
#
1. 函数中有yield, 返回值是一个生成器.
g = fun()
print(g)
# 2. 生成器函数默认不执行函数内容, 当next(g)时, 才执行函数内容.
# 3. 执行函数时, 一直执行, 遇到yield停止。 默认情况不会显示yield后面的内容,
# 如果要显示print(next(g))
next(g)
print(next(g))
print(next(g))
# 4. 如果需要给生成器函数传值
# 1). 必须有变量接收传递的值: res = yield 'yield3'
# 2). 通过g.send("hello")
# 3). send方法, 给yield所在位置传值, 接收值之后, 直到遇到yield停止.
g.send("hello")这里写代码片
“`