Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略

简介: Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略

yield


       带有 yield 的函数在 Python 中被称之为 generator(生成器)。

yield的作用:就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

       yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器。为了精通 yield ,你必须要理解:当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,这有点蹊跷不是吗。  那么,函数内的代码什么时候执行呢?当你使用for进行迭代的时候.  现在到了关键点了!  第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。  如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。


1、生成斐波那契數列


def fab(max):

   n, a, b = 0, 0, 1

   while n < max:

       yield b      # 使用 yield

       print(b, '-   T2、print输出代替yield的用法')

       a, b = b, a + b

       n = n + 1

for n in fab(5):

   print(n)

'''

输出结果:

1

1 -   T2、print输出代替yield的用法

1

1 -   T2、print输出代替yield的用法

2

2 -   T2、print输出代替yield的用法

3

3 -   T2、print输出代替yield的用法

5

5 -   T2、print输出代替yield的用法

'''


@property


@property的作用:@property广泛应用在类的定义中,既能检查参数,又可以用类似属性这样简单的方式来访问类的变量。Python内置的@property装饰器就是负责把一个方法变成属性调用的,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。


1、@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。


class Student(object):

   @property

   def score(self):

       return self._score

   @score.setter

   def score(self, value):

       if not isinstance(value, int):

           raise ValueError('score must be an integer!')

       if value < 0 or value > 100:

           raise ValueError('score must between 0 ~ 100!')

       self._score = value

>>> s = Student()

>>> s.score = 60 # OK,实际转化为s.set_score(60)

>>> s.score # OK,实际转化为s.get_score()

60

>>> s.score = 9999

Traceback (most recent call last):

 ...

ValueError: score must between 0 ~ 100!

2、神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性。

    下边的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。


class Student(object):

   @property

   def birth(self):

       return self._birth

   @birth.setter

   def birth(self, value):

       self._birth = value

   @property

   def age(self):

       return 2015 - self._birth

参考文章

廖雪峰的官方网站——使用@property



其他函数


后期更新……


 


相关文章
|
5月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
352 1
|
5月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
759 1
|
5月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
304 0
|
5月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
存储 数据采集 JavaScript
python语言简介及开发环境搭建的详细介绍
第一节:计算机是什么第二节:开发前的准备 第二章 python简介及环境搭建 完成了前面python开发前的准备,从这节课开始我们将会为大家介绍python语言是怎么编程的。 2.1计算机语言简介 之前的章节内容里面为大家介绍过,计算机就是一台用来计算的机器,执行人类发出的指令。
python语言简介及开发环境搭建的详细介绍
|
Java Linux C语言
Python 语言简介
Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等。 那Python是一种什么语言? 首先,我们普及一下编程语言的基础知识。
2125 0
|
开发工具 Python Windows
《Python参考手册(第4版•修订版)》——第一部分 Python语言 第1章 Python简介 1.1 运行Python
本节书摘来自异步社区《Python参考手册(第4版•修订版)》一书中的第1章,第1节,作者David M. Beazley,更多章节内容可以访问云栖社区“异步社区”公众号查看。 第一部分 Python语言 本部分内容 第1章 Python简介 第2章 词汇和语法约定 第3章 类型与对象
3356 0
|
6月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
796 102
|
6月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
413 104
|
6月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
331 103

推荐镜像

更多