• Python学习杂记


    Python中关键字yield有什么作用?

    首先得理解generators,而理解generators前还要理解iterables:

    你可以用在for...in...语句中的都是可迭代的:比如lists,strings,files...因为这些可迭代的对象你可以随意的读取所以非常方便易用,但是你必须把它们的值放到内存里,当它们有很多值时就会消耗太多的内存。

    生成器也是迭代器的一种,但是你只能迭代它们一次.原因很简单,因为它们不是全部存在内存里,它们只在要调用的时候在内存里生成。

    note:生成器和迭代器的区别就是用()代替[],还有你不能用for i in mygenerator第二次调用生成器。

    Yield的用法和关键字return差不多:

    >>> def createGenerator():

    ... mylist = range(3)

    ... for i in mylist:

    ... yield i*i ...

    >>> mygenerator = createGenerator() # 创建生成器

    >>> print(mygenerator) # mygenerator is an object!

    <generator object createGenerator at 0xb7555c34>

    >>> for i in mygenerator:

    ... print(i)

    0

    1

    4

    当你的函数要返回一个非常大的集合并且你希望只读一次的话,那么它就非常的方便了.

    要理解Yield你必须先理解当你调用函数的时候,函数里的代码并没有运行.函数仅仅返回生成器对象,这就是它最微妙的地方:-)

    然后呢,每当for语句迭代生成器的时候你的代码才会运转.

    编程练习:

    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

     解题思路:其实就是斐波那契数列问题。

    假设f(n)是n个台阶跳的次数。

    1. f(1) = 1

    2. f(2) 会有两个跳得方式,一次1阶或者2阶,这回归到了问题f(1),f(2) = f(2-1) + f(2-2)

    3. f(3) 会有三种跳得方式,1阶、2阶、3阶,那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3).因此结论是
      f(3) = f(3-1)+f(3-2)+f(3-3)

    4. f(n)时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

    f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1) == f(n) = 2*f(n-1)

    递归思想解法:  fib = lambda n: n if n < 2 else 2 * fib(n - 1)

  • 相关阅读:
    Vi 和 Vim
    The C Programming Language-Chapter 5 Pointers and Arrays
    C# 4.0开始,泛型接口和泛型委托都支持协变和逆变
    数据库中的锁 and java StampedLock ReadWriteLock
    NetCore and ElasticSearch 7.5
    网关项目 ReverseProxy
    异常捕获&打印异常信息
    刷新:重新发现.NET与未来
    2019 中国.NET 开发者峰会正式启动
    .NET开发者必须学习.NET Core
  • 原文地址:https://www.cnblogs.com/ylHe/p/6936320.html
Copyright © 2020-2023  润新知