生成器

迭代取值与索引取值的对比

迭代取值不能重复取值,但是索引取值可以重复取值,但是索引取值必须是一个容器类型,但迭代取值不一样,只要是个迭代器就可以。

生成器(就是自定义的迭代器)

在函数中,有yield的就是一个生成器,一个函数在遇到yield时会停住,不是停止,知道下一个__next__时才会接着往下走,直到遇到下一个yield。这样做的好处就是省内存。

生成器实现range功能

def age(strat, end=None, add=1):
    if not end:
        end = strat
        strat = 0
    while True:
        if strat < end:
            print(strat)
            strat += add

 yield传值

def age(name):
    while True:
        print("111")
        food = yield
        print('我的名字是%s,喜欢吃%s' % (name, food))


res = age('bxf')
res.__next__()


res.send('apple')
res.send('banana')

yield与return的对比

函数遇到yield不会停止,而是会停住,但是函数遇到return会立马停止,下面的代码都不会运行,yield可以传值,yield后也可以传值,不过可以传多个值,以元组的形式。

生成表达式

def add(n, i):
    return n + i


def test():
    for i in range(4):
        yield i


g = test() 
for n in [1, 10]:
    g = (add(n, i) for i in g)
res = list(g)
print(res)

常见的内置函数

# print(abs(123))
# print(abs(-123))  # 求绝对值

# l = [1, 2, 3, 4,5,6,7]
# print(all(l))
# print(any(l))
# print(sum(l)) # 求和

# print(divmod(100,10))
# print(divmod(101,10))
# print(divmod(99,10))

'''
    100条数据,10条  10
    101条数据,10条  11
    99条数据   10条  10
'''
# num,mod = divmod(100, 10)
# if not mod:
#     page = num+1


string = """
# hahahahh
print('hello world')
"""
# eval(string)
# exec(string)

# a = 123
# s = 'aaaa'
# print(type(a) is int)
# print(type(s) is str)
# print(isinstance(s, int))  # 判断某个数据是不是某个实例

# print(chr(68))
# print(ord('A'))

# print(pow(2,3))  # 2
# print(pow(3,3))  # 2
# print(round(4.3))
# print(round(4.5))
# print(round(4.8))

# bytes()
s = 'aaa'
print(s.encode('utf8'))
res=bytes(s, 'utf8')
print(res)
print(res.decode('utf8'))
print(str(res,'utf8'))

 

上一篇:C# 迭代器 Iterator


下一篇:生成器