精华内容
下载资源
问答
  • 一、Theano的局限性Theano代码编写比较灵活,但是也存在一些局限性: 1、while和if循环必须通过theano.scan()操作...下面通过两种生成斐波那契数列的方法来讲解scan的使用:import theano import theano.tensor as T

    一、Theano的局限性

    Theano代码编写比较灵活,但是也存在一些局限性:
    1、while和if循环必须通过theano.scan()操作实现,从而循环的主体会受到一些限制;
    2、不支持goto和递归
    所以对于某些矩阵操作需要coder选择合适的方法解决。下面通过两种生成斐波那契数列的方法来讲解scan的使用:

    import theano
    import theano.tensor as T
    from theano import function
    import numpy

    二、迭代输出

    X = T.dvector('X')
    results, updates = theano.scan(lambda xtm2, xtm1: xtm2 + xtm1, n_steps = 20, outputs_info=[dict(initial=X, taps=[-2, -1])])  #在迭代过程中保存X[t-2],X[t-1]的值
    fibFn = function([X], results, updates = updates)
    xval = numpy.ones(2, dtype=theano.config.floatX)
    print xval
    print fibFn(xval)

    scan函数的第一个参数fn的输入依次为sequences、outputs_info、non_sequences。函数返回值:(outputs, updates)。
    变量X中保留了t-2和t-1时刻的结果,并且在初始化的时候这两个值都设置为1,所以可以在scan函数中计算X[t] = X[t-2] + X[t-1] (xtm2 + xtm1)。

    输出结果:

    [ 1.  1.]
    [  2.00000000e+00   3.00000000e+00   5.00000000e+00   8.00000000e+00
       1.30000000e+01   2.10000000e+01   3.40000000e+01   5.50000000e+01
       8.90000000e+01   1.44000000e+02   2.33000000e+02   3.77000000e+02
       6.10000000e+02   9.87000000e+02   1.59700000e+03   2.58400000e+03
       4.18100000e+03   6.76500000e+03   1.09460000e+04   1.77110000e+04]

    三、矩阵操作

    上面的代码每次迭代直接输出一个结果,也可以在矩阵中保留所有斐波那契数。

    X = T.dvector('X')
    def Fib(i,X):
    ....X = T.set_subtensor(X[i], X[i-1]+X[i-2])
    ....return X
    result, update = theano.scan(Fib , sequences = T.arange(2,X.size), outputs_info = [X])
    fibFunc = function([X], result[-1], updates = update)
    xval = numpy.zeros(20, dtype=theano.config.floatX)
    xval[0] = 1
    xval[1] = 1
    print fibFunc(xval)

    把sequences 和outputs_info的变量作为Fib(i,X)函数的输入,在Fib函数中计算下一个数组元素的值,function的result[-1]告诉Theano我们只需要最后一个向量。

    输出结果:

    [  1.00000000e+00   1.00000000e+00   2.00000000e+00   3.00000000e+00
       5.00000000e+00   8.00000000e+00   1.30000000e+01   2.10000000e+01
       3.40000000e+01   5.50000000e+01   8.90000000e+01   1.44000000e+02
       2.33000000e+02   3.77000000e+02   6.10000000e+02   9.87000000e+02
       1.59700000e+03   2.58400000e+03   4.18100000e+03   6.76500000e+03]
    展开全文
  • # 生成器:函数中如果出现yield,那么函数的返回值就是一个生成器; def fibonacci(num): # 定义变量 index = 0 n1 = 1 n2 = 1 # 循环获取下一项元素 while index < num: # 索引值自增 index += 1 ...
    # 生成器:函数中如果出现yield,那么函数的返回值就是一个生成器;
    
    
    def fibonacci(num):
        # 定义变量
        index = 0
        n1 = 1
        n2 = 1
        # 循环获取下一项元素
        while index < num:
            # 索引值自增
            index += 1
            value = n1
            # 把两个变量推向下一项
            n1, n2 = n2, n1 + n2
            # 出现yield,那么调用这个函数就会获取一个生成器;
            # return: 只能返回一次,程序就停止了,而yield可以返回多次;(阻塞)
            # yield: 可以返回一个值,然后停止,然后在通过next()调用再返回...
            yield value
    
    # 生成器
    generator = fibonacci(12)
    # print(next(generator))
    # print(next(generator))
    # print(next(generator))
    
    
    for i in generator:
        print(i, end=" ")  # 输出结果:1 1 2 3 5 8 13 21 34 55 89 144
    
    展开全文
  • 一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。 yield和return相同的是可以返回值,但是不同的是yield不会结束函数。 def fib(n): # 创建一个函数 a,b=1,1 ...

    一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。
    yield和return相同的是可以返回值,但是不同的是yield不会结束函数。

    def fib(n): # 创建一个函数
        a,b=1,1
        i=1 # 初始值
        while i<=n: # i小于等于n,n次数 循环的控制条件
            yield a # 返回a的值,但不结束函数
            a,b=b,a+b
            i+=1 # 步长值
    for x in fib(12): # 以for循环来获取yield每次的值
        print(x)
    
    展开全文
  • 上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以 a = (i for i in range(5)) for i in a: print(i) 0 1 2 3 4 # 执行结果 #和手动调的区别是没了的...

    上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以

    a = (i for i in range(5))
    for i in a:
       print(i)
    
    0
    1
    2
    3
    4   # 执行结果
    #和手动调的区别是没了的话就会自动终止循环。就跳出来了
    
    
    #换成while
    a = (i for i in range(5))
    while True:
       next(a)
    
    0
    1
    2
    3
    4
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    StopIteration    # 执行结果,会报错
    
    
    #所以一般会用for循环,相当于错误内部就给消化了  
    
    
    补充:其实range(10)底层就是用生成器实现的,也就是每循环一次加一,再python3.x里,range(10)的执行结果是range(0,10),而在python2.7里,结果是直接生成了一个列表[0,1,2,3,4,5,6,7,8,9],这是因为python3中他不是一个普通的range(),是一个公式,就根本没有创建,只有循环到了才创建这个值,但是再python2 里有和python3里range()方法相同的是xrange()。
    
    前面所讲的加1是最简单的,生成器是可以做复杂的算法的。再列表生成式里最复杂的最多写三元运算,而要是做更复杂的,就需要用函数来做这个生成器。
    
    
    
    比如,数学上著名的斐波那契数列,(除了第一个和第二个数之外,任意两个数都可由前两个数相加得到)1,1,2,3,5,8,13,21,34......(没什么用,就是一个规律)
    
    如果把前15个数相加,斐波那契数列用列表生成式写不出来,但是可以用函数把他轻松的打印出来
    
    def fib(max):
        n, a, b = 0, 0, 1
        while n< max:
            print(b)
            a, b = b, a+b
            n = n+1
        return 'done'
      
    
    注意赋值语句:a, b = b, a+b
    
    试一下:
    
    fib(15)
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
    377
    610
    'done'  # 执行结果
      
    
    把他变成生成器只需要一步
    
    def fib(max):
        n, a, b = 0, 0, 1
        while n< max:
            yield b
            a, b = b, a+b
            n = n+1
        return 'done'
    print(fib(15))
    
    <generator object fib at 0x0000019878D244C0>  #执行结果
    
    
    #接下来调用
    def fib(max):
        n, a, b = 0, 0, 1
        while n< max:
            yield b  #只要函数中出现了yield,就变成了一个生成器,它的作用就是把函数的执行过程冻结在这一步,并且把 b 的值返回给next
            a, b = b, a+b
            n = n+1
        return 'done'
    f = fib(15)
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    
    1
    1
    2
    3   # 执行结果
    
    
    # 换成循环的方式调用
    def fib(max):
        n, a, b = 0, 0, 1
        while n< max:
            yield b  
            a, b = b, a+b
            n = n+1
        return 'done'
    f = fib(15)
    for i in f:
       print(i)
    
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
    377
    610   # 执行结果
    
    #分析
    def fib(max):
        n, a, b = 0, 0, 1
        while n< max:
            print('yemao')
            yield b  #函数到这儿并没有返回就结束了,而是冻结了,接下来怎么继续往下走呢
            print(b)
            a, b = b, a+b
            n = n+1
        return 'done'
    f = fib(15)
    print(f)  并不会有执行结果,不会调用,只是生成了一个生成器
    
    next(f)# 调用next才会被执行

    #yield比之前的函数好的地方其实是,函数一执行,就会再函数里面打印等结果,不能往外返回, #而用yield就可以在执行的过程中把想要的值返回出来, #yield以后, 函数外面加()根本不会调用,而是生成了一个生成器

      

    #如果要中途终止这个生成器
    def range2(n): count = 0 while count < n: print('count', count) count += 1 sign = yield count #return if sign == 'stop': print('---sign', sign) break return 3333 new_range = range2(3) n1 = next(new_range) new_range.send('stop') #next只能是唤醒生成器并执行 #send可以是唤醒并执行,还可以发送给一个信息到生成器内部 count 0 Traceback (most recent call last): ---sign stop File "E:/pycharm/pyCharm/考核/lianxi.py", line 16, in <module> new_range.send('stop') StopIteration: 3333 # 执行结果

      

      

     

    转载于:https://www.cnblogs.com/xiaobai-yemao/p/8783932.html

    展开全文
  • range(start,end,step)这个序列生成器,和那个切片的语法一样,含头不含尾,step是步长,这里就不需要在对j进行判断了,对于这些简单求奇数和、求偶数和,就n的倍数和等等就可以这样做 for j in range(0,101,2): s ...
  • 把简单的循环放入一个...下面是一个生成斐波那契数列的简单例子: # 保留元素直至真值函数值为假。 from itertools import takewhile def fib(): """生成Fib数列的函数""" a = b = 1 while True: yield a a, b ...
  • while循环语句4. for循环语句5. break和continue语句6. pass语句7. 迭代器7.1 用标准数据类型创建迭代器7.2 自定义迭代器8. 生成器 Python3-流程控制语句、迭代器、生成器 1. 介绍几个基本的脚本 # 斐波那契数列 # ...
  • C#设计-5-数组和循环

    2018-10-17 22:43:56
    1、用C#编程实现,斐波那契数列:1 1 2 3 5 8 13 .....,打印显示   2、循环(for,while, foreach,do while) 3、如何生成一组随机数据? using System; using System.Collections.Generic; us...
  • 有了前面的基础,其实掌握的比较扎实的话还是能够做出一些简单的东西的,至少解决一些个基本的数学题还是问题不大,比如说实现一个斐波那契数列,杨辉三角什么的。多数情况下使用循环 for ... in 或者 while 再加上 ...
  • 微处理器实验室 练习的微处理器实验室代码。 使用模拟器8086 气泡分类组件x86 组装x86中的摄氏温度到华氏温度 在程序集x86中使用宏和换行命令的阶乘 华氏温度到摄氏温度x86 ...编写汇编程序以生成斐波那契数列
  • Python第四次笔记

    2020-11-23 22:35:55
    只有使用next()函数执行生成器对象或循环生成器对象时,才会一个一个返回数据。 g = func() for i in g: print(i) 使用生成器函数实现斐波那契数列 def fbnq(n): a,b=0,1 while a < n: yield a a...
  • 浅谈python迭代器

    2020-12-23 16:19:46
    例如:斐波那契数列 def fib(num): a, b, c = 1, 0, 1  while a <= num: yield c b, c = c, b + c a += 1 for n in fib(10): print(n, end=' ') # 1 1 2 3 5 8 13 21 34 55 2、Iterable 所有可以使用for...
  • 前言 一、Math概念 二、Math常用方法 1、随机生成一个数 2、取绝对值 3、取整 4、获取最值 5、圆周率Π ...5.1、递归函数、斐波那契数列计算 6、对象基础知识 7、数组、冒泡排序、选择排序 8、字符串的JS方法
  • 编译原理简易C编译器

    2017-02-17 20:53:39
    只能实现斐波那契数列,没有实现pi.c,得分五分 上机大作业——简化C编译器实现 总体要求 一、要求实现的语言特性 1. 基本要求 1数据类型:int,char 2语句:赋值(=),if,while,for;赋值 循环 条件判断 3算术...
  • 小练习

    2018-11-03 14:44:06
    生成前40个斐波那契数 (Fibonacci 数列) # 1 1 2 3 5 8 13 21 … L =[] a = 0 #a表示当前数b的前一个 b = 1 #b永远绑定当前的一个斐波那契while len(L)&lt;40: #需要向l中加一个是,每次循环加一个 L....
  • 编译原理 C编译器

    2017-02-17 21:18:01
    可将C语言的裴波纳契和pi.c的翻译为汇编语言。...3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。
  • 实例048 算法应用——斐波那契数列 实例049 算法应用——水仙花数 实例050 算法应用——素数 实例051 算法应用——汉诺塔 第3章 HTML/CSS技术 3.1 页面效果 实例052 统一站内网页风格 实例053 设置超链接...
  • 实例048 算法应用——斐波那契数列 实例049 算法应用——水仙花数 实例050 算法应用——素数 实例051 算法应用——汉诺塔 第3章 HTML/CSS技术 3.1 页面效果 实例052 统一站内网页风格 实例053 设置超链接...
  • 实例138 斐波那契数列 206 实例139 角谷猜想 207 实例140 哥德巴赫猜想 208 实例141 四方定理 209 实例142 尼科彻斯定理 210 4.5 逻辑推理与判断 211 实例143 魔术师的秘密 211 实例144 婚礼上的谎言...
  • 08 Python while循环语句以及练习题 09 练习题讲解 第10章 01 上节内容回顾以及补充 02 上周作业实现 03 Pycharm的安装和使用 04 Python 运算符 05 Python 运算符以及总结 06 Python 基本数据类型介绍 07 Python ...
  • while循环 - 基本结构 / break语句 / continue语句 for循环 - 基本结构 / range类型 / 循环中的分支结构 / 嵌套的循环 / 提前结束程序 应用案例 - 1~100求和 / 判断素数 / 猜数字游戏 / 打印九九表 / 打印三角形图案...
  • 达内 coreJava 习题答案

    2010-02-10 19:49:01
    12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

while循环生成斐波那契数列