如何成为测试开发,第4天

迭代器 Iterable

迭代器就是遍历,从第一个到最后一个遍历出来,能够被迭代的对象(Iterable),都是有序的,好比如知道第一个是谁,下一个是谁。

能够被迭代的序列 list tuple string dict set,bytes

其中dict set都是无序的,无法控制顺序,比如dict 可以通过迭代key,通过key取到value

mylist=[1,2,3,4,5,6]
for i in mylist:
	print(i)
from collections import Iterable

mylist = [1, 2, 3, 4]
# for i in mylist:
#     print(i)
#
# print(isinstance(mylist, Iterable))
# print(isinstance('mylist', Iterable))
# print(isinstance(123, Iterable))

it = iter(mylist)
print(next(it))
print(next(it))

生成器 Generator

生成器也可以被迭代,可以实现按需求去执行,一边迭代,一边生成,一边输出

from collections import Iterable

gen = (g for g in range(1, 5))
print(isinstance(gen, Iterable))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen)) #已经停止迭代

比如:一边迭代,一边生成,一边输出

# 斐波那契数列(Fibonacci sequence)0、1、1、2、3、5、8、13、21、34
def  fibonacci(n):
    a,b=0,1
    count=0
    res=[]
    while True:
        if count >n:
            break
        res.append(a+b)
        a,b=b,a+b
        count+=1

    return res

print(fibonacci(10))
假设print(fibonacci(10000000000000000)),运行的话基本卡死了,于是有了yeild

虽然被调用,但实际还没有执行,和上面卡死的现象不同,上面的是直接计算好才输出的,和使用生成器区别就是用那个调那个,一边用一边算,串行变并行

# 斐波那契数列(Fibonacci sequence)0、1、1、2、3、5、8、13、21、34
def fibonacci(n):
    a, b = 0, 1
    count = 0
    while True:
        if count > n:
            break
        yield a + b
        a, b = b, a + b
        count += 1

gen = fibonacci(100000000000)  

for f in gen:
    if f > 500:
        break
    print(f)

装饰器 Decorator

# 没有调用装饰器,普通定义的函数
def show(me):
    print('我是')
    me()

def afun():
    print('A')

def bfun():
    print('B')


# afun()
# bfun()

show(afun)
show(bfun)

装饰器,其实就是闭包,函数里面套函数

# 装饰器,其实就是闭包,函数里面套函数
def show(me):
    def showtitle():
        print('I am')
        me()
    return showtitle

def showwhere(me):
    def showtitle():
        me()	# 先执行@show,后执行@showwhere
        print('where r u')
        # me() 如果写这里,和@show的顺序一样的那就看,你写的装饰器在哪里,谁在最头顶,就显示谁
    return showtitle


@showwhere
@show
def afun():
    print('A')

@show
def bfun():
    print('B')


afun()
bfun()

#------------------执行结果-------------
I am
A
where r u
I am
B

装饰器,传参使用,*args,**kwargs

def show(me):
    def showtitle(*args,**kwargs):	#python约定的*args可变参数,**kwargs关键类型可变参数
        print('I am')
        me(*args,**kwargs)
    return showtitle

def showwhere(me):
    def showtitle():
        me()
        print('where r u')
    return showtitle


# @showwhere
@show
def afun(x):
    print(x)

@show
def bfun(x,y,**kwargs):
    print(x,y)
    print(kwargs)


afun('acb')
bfun('hi','good job',a='py',b='th',c='on')

#------------------执行结果-------------
I am
acb
I am
hi good job
{
    
    'a': 'py', 'b': 'th', 'c': 'on'}

其他

TypeError: ‘NoneType’ object is not callable
理解Python装饰器(Decorator)
如何理解Python装饰器?
详解Python的装饰器
Python中*args和**kwargs的区别
Python的functools模块

猜你喜欢

转载自blog.csdn.net/qq_30864373/article/details/109614036