搞清什么是杨辉三角

每行是一个数组,

第一行: [1]
第二行: [1, 1]
第三行: [1, 2, 2, 1]
...

画的好看点就是,不过没啥卵用

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

打印杨辉三角

首先要解决一个函数,多次返回值, 我们知道py函数返回多个值,没啥问题. 但是要多次返回值呢?需要借助生成器来完成, 生成器的好处是可以保留现场,延迟操作

套路是 函数里使用yield关键字,相当于return, 不过可以有多个yield,但是不可以有多个return.

yield可以返回一个generator类型的值, 可以for in遍历

那么可不可以手动创建一个yield值呢? 可以

方法: 将列表推导式(一股脑生成所有值,为了简化for代码)的方括号改成圆括号即可.

x = [x * x for x in range(10)]
g = (x * x for x in range(10)) #2种遍历方法: 法1: next(g) 需处理StopIteration异常,  法2: for i in g

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
...

生成器小结:

小结

  • 凡是可作用于for循环的对象都是Iterable类型;

  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

  • Python的for循环本质上就是通过不断调用next()函数实现的,例如:
for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

先搞清楚生成器-用在函数里,多次返回值,具有保留现场,延迟操作的功效

这个程序执行过程, for语句一股脑构造好arr数据后一次性返回

def sc(N):
    arr = []
    for i in range(N):
        arr.append(i**2)
    return arr

for i in sc(10):
    print(i)

改成yield(相当于return,所以一定写在函数里,但可以写多条.)
执行过程: 遇到yield即刻保留现场,yield的内容返回给调用者. 再次调用函数时,从上次yield下一条语句开始执行,遇到下一个yield直接返回内容.

def sc(N):
    for i in range(N):
        yield i ** 2

for i in sc(10):
    print(i)

如果还不太清楚,且看

yield返回的是generator

def odd():
    print('step 1')

g = odd()
print(type(odd)) #<class 'function'>
print(type(g))   #<class 'NoneType'>
def odd():
    print('step 1')
    yield (1)
    print('step 2')
    yield (2)
    print('step 3')
    yield (3)

g = odd()
print(type(odd))#<class 'function'>
print(type(g))  #<class 'generator'>

yield调用过程, 和调用的2种方法

def odd():
    print('step 1')
    yield (1)
    print('step 2')
    yield (2)
    print('step 3')
    yield (3)

g = odd()
print(type(g))
print(type(odd))

#遍历生成器,方法1: 最后没值了后异常(StopIteration)
next(g)
next(g)
next(g)

#遍历生成器,方法2: 不用关心StopIteration异常
for i in g:
    print(g)

---
step 1
1
step 2
2
step 3
3

打印杨辉三角

# 期待输出:

# [1]
# [1, 1]
# [1, 2, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

- 首先构造这样的数列
#第1次返回[1]
#第2次返回[1, 1]
#第3次返回[1, 2, 1]
# 每行的模式
[1, 2, 2, 1] = [1,2]+[2,1]

for i in range(n):
    i=i+1
    arr = list(range(1, i))
    arr = arr + list(reversed(arr))

- 其次yield实现多次返回

def yanghui():
    yield [1]
    yield [1, 1]
    yield [1, 2, 2, 1]

for i in yanghui():
    print(i)

---
[1]
[1, 1]
[1, 2, 2, 1]

最终实现

def yanghui(n):
    for i in range(n):
        #
        i=i+1
        arr = list(range(1, i))
        arr = arr + list(reversed(arr))
        # list(range(1, 1)) ==> []
        if arr == []:
            arr = [1]
        yield arr

for i in yanghui(10):
    print(i)

[py]函数中yield多次返回,延迟计算特性-杨辉三角的更多相关文章

  1. Python使用函数实现杨辉三角

    运行效果: 可在函数中指定阶层数,输出对应的杨辉三角 源代码如下: 1 # -*-coding:utf-8 -*- 2 ''' 3 chapter4_do.py 4 函数yanghui(n)用于输出n ...

  2. js中实现杨辉三角

    实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...

  3. 理解 ES6 语法中 yield 关键字的返回值

    在 ES6 中新增了生成器函数的语法,本文解释了生成器函数内 yield 关键字的返回值. 描述 根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数.当外部调用生成器的 next() 方 ...

  4. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

  5. 【Python入门学习】列表生成和函数生成器的方式实现杨辉三角

    列表生成: L = [i for i in range(10)] 列表生成器: g = (i for i in range(10)) 函数生成器使用的关键字yield实现 例如fib生成器 def f ...

  6. 利用yield关键字输出杨辉三角

    最近学习了下python,发现里面也有yield的用法,本来对C#里的yield不甚了解,但是通过学习python,对于C#的yield理解更深了!! 不多说了,小学生水平的表达能力伤不起.... 直 ...

  7. 返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。

    错误写法: 正确写法:

  8. 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

    从第0行开始,输出第k行,传的参数为第几行,所以在方法中先将所传参数加1,然后将最后一行加入集合中返回. 代码如下: public static List<Integer> generat ...

  9. Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制

    1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你电脑磁盘上的路径 位置:C:\Program Files\Java\jdk1.8.0_112\bin\javah.exe ...

随机推荐

  1. C语言变量的存储布局

    分析以下代码中变量存储空间如何分配: //MemSeg.c: 代码无意义,仅供分析用 #include <stdio.h> #include <stdlib.h> //mall ...

  2. 【架构师之路】 LVS+Keepalived实现高可用负载均衡

    一.原理        1.概要介绍        如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态, ...

  3. linux多行注释

    1.多行注释:   1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;   2. 在行首使用上下键选择需要注释的多行;   3. 按下键盘(大写)“I”键,进入插入模式 ...

  4. WP8.1学习系列(第二十五章)——控件样式

      XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...

  5. openlayers中利用vector实现marker的方式

    项目需要一个小型的gis.openlayers,geoserver,postgres组合是比较好的选择. openlayers的marker层好像不支持拖动操作.通过研究api发现,可以利用vecto ...

  6. webpack4 优化记录

    webpack4.0优化那些事儿 一 缩小文件搜索范围 1 include & exclude 1) action 限制编译范围 2) useage module: { rules: [ { ...

  7. jQuery属性操作(三)

    在阅读attr.remove方法时,看到一些对浏览器兼容性做处理的hooks.接下来看一下这些hooks都做了哪些兼容性处理 1.attrHooks.主要处理IE6-9 input的type属性无法写 ...

  8. 理解 ARC 下的循环引用

    本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚 ...

  9. iOS - 音乐播放器之怎么获取音乐列表

    方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager ...

  10. Java--static、final、static final的区别

    一.final final修饰类:表示该类不能被继承:final类中的方法默认是final的: final修饰方法:表示该方法无法被重写: final修饰方法参数:表示在变量的生存期中它的值不能被改变 ...