没有5年测开经验,还真说不清Python生成器、迭代器、装饰器

2007 篇文章 51 订阅
1227 篇文章 21 订阅

在这里插入图片描述

一、什么是生成器?

使用了yield函数 就被称之为生成器,生成器是一个返回迭代器的函数,说白了生成器就是迭代器,只能用于迭代操作。

不懂?没关系,下面就一个斐波那契数列为例来进行讲解:

依靠简单循环生成的一个“斐波那契数列”

a,b = 0,1                                                                                                                 
while a<100:
    a,b = b,a+b
    print(a)

程序运行结果如下:

图片

这段代码是通过非递归的方法实现斐波那契数列,接下来,我就用生成器的方式实现斐波那契数列

import sys
def fibonacci(n): #生成迭代器函数
    a,b,count = 0,1,0
     while True:
         if(count > n):
            return n              
        yield a #使用生成器(迭代器,当程序遇到yield函数时,会暂停并保存当前所有的信息——
      			 	# 并返回yield的值,然后程序运行到next()函数时,并从当前位置继续运行
        a,b = b,a+b
        count = count + 1

f = fibonacci(10) #f是一个迭代器,由生成器生成,10为递归结束的信号

while True:
    try:
        print(next(f),end=" ")
    except:
        sys.exit()

程序的运行结果如下:

图片

二、什么是迭代器?

迭代是Python众多强大的功能之一,它是访问集合元素的一种方式,它是可以记住遍历对象的位置,这点和for循环中enumerate关键字有点相似,不过enumerate其实是记住数组,元组,列表等等下标的一个函数。但是迭代器会从集合中的第一个元素开始访问,一直到最后一个元素,迭代器只能往前不会后退。

迭代器有两种方法:

iter()

next()

字符串,列表,元组,字典(键值)的对象都可以创建迭代器,下面是几个简单得实例

list = [2,1,4,6]
It = iter(list)
for i in It:
    print(i,end=" ")

图片

同理,也可以使用next() 函数

import sys
  list = [11,22,33,454]It = iter(list)
while True:
    try:
        print(next(It))
    except:
         sys.exit()

在这里插入图片描述

三、 什么是装饰器?

前面讲了生成器,迭代器怎么又来了个装饰器 ,装饰器的功能还是很强大的,它能够不改变函数本地的结构,却可以给函数增加额外的功能,下面就以实例来讲解

1、我们先用函数打印一句话

def sayHi():    print("Hi,man")
#sayHi()          #这是函数调用的方法#还有另一种输出的方法
x = sayHi
x()

现在我们希望可以在“sayHi”函数之前输入一句话,这种在代码运行期间动态增加功能的方式,称之为装饰器,下面我们就改改上面这个代码:

图片

2、改一改

def sayHello(func):
    def inner():
        print("Hello,I am Gorit")
        return func

    return inner()

  def sayHi():
    print("Hi,man")

 x = sayHello(sayHi)

s()

图片

这样的效果看起来不是很好,我们每次都要加个功能都要使用

x = sayHello(sayHi)

s()  

对于这种情况,Python提供了语法糖 —— “@”,这样我们就可以轻松的输出我们想要的语句

3、有了语法糖的加入,程序变得更简单

def sayHello(func):
    def inner():
        print("Hello,I am Gorit")
         return func
   return inner()

   @sayHellod

ef sayHi():
    print("Hi,man")
sayHi()

图片

在上面的代码中,我们定义了一个sayHello(func)函数,sayHello接受参数func,里面又内嵌一个 inner()函数,然后输出(“Hello,I am Gorit”,之后返回 func 参数,(也就是我们要传入的参数),然后再返回inner函数,然后我们发现这就是一个封闭的函数,也称为闭包函数

然后我们再sayHi()之前加入 @sayHello, 其目的使程序运行到这里会调用装饰器函数"sayHello",并把被装饰的函数"sayHi"作为参数传入,此时"sayHi"是指向sayHello.inner 的地址,然后再调用sayHi时,实则是调用sayHello.inner

最后: 可以加入群号:914172719 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值