课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Python编程开发语言的学习与应用是目前大多数软件编程开发程序员都需要熟练掌握的一个编程技术,下面我们就通过案例分析来简单了解一下,Python生成器原理与运行。
1、生成器的使用
在Python中,如果一个函数定义的内部使用了yield关键字,那么在执行函数的时候返回的是一个生成器,而不是常规函数的返回值。
2、生成器的原理
要理解Python中生成器的原理其实就是要搞清楚下面两个问题
调用包含yield语句的函数为什么同普通函数不一样,返回的是一个生成器对象,而不是普通的返回值
next()函数驱动生成器执行的时候为什么可以在函数体中返回yield后面的表达式后暂停,下次调用next()的时候可以从暂停处继续执行
这两个问题都跟Python程序运行机制有关。Python代码先会经过Python编译器编译成字节码,然后由Python解释器解释执行,机制上跟其他解释型语言一样。Python编译器和解释器配合,就能完成上面两个问题中的功能,这在编译型语言中很难做到。像C、Golang会编译成机器语言,函数调用通过CALL指令来完成,被调用的函数中遇到RET指令就会返回,释放掉被调用函数的栈帧,无法在中途返回,下次继续执行。
虽然操作系统在线程切换的时候也会中断正在执行的函数,再次切换回来的时候继续执行,但是被中断的函数在切换的时候并没有返回值产生,这点与Python生成器是不同的,不要混淆了。
3、生成器的创建
Python编译器在编译Python代码的时候分为词法分析、语法分析、语义分析和字节码生成这几个阶段,在进行语义分析的时候有一项重要的工作是构建符号表,主要用于确定各个变量的作用域,顺带做了一件跟生成器相关的事,也就是在分析过程中如果遇到了yield语句就将当前代码块的符号表标记为是生成器。
4、生成器的运行
Python解释器用软件的方式模拟了CPU执行指令的流程,每个代码块(模块、类、函数)在运行的时候,解释器先为其创建一个栈帧,主要用于存储代码块运行时所需要的各种变量的值,同时指向调用方的栈帧,使得当前代码块执行结束后能够顺利返回到调用方继续执行。与物理栈帧不同的是,Python解释器中的栈帧是在进程的堆区创建的,如此一来栈帧就完全是解释器控制的,即使解释器自己的物理栈帧结束了,只要不主动释放,代码块的栈帧依然会存在。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。