python函数(下)

一、迭代器

for 变量 in 可迭代:
    pass
    
iterable :可迭代的东西,比如str,list,tuple,set,dict,open()
iterator:迭代器
可迭代的数据类型都会提供一个叫迭代器的东西,这个迭代器可以帮我们把数据类型中的所有数据逐一的拿到
获取迭代器的两种方案:
    1.iter()内置函数可以直接拿到迭代器
    2.__iter__(): 特殊方法 迭代.__iter__()
    
从迭代器中拿到数据:
    1.next()
    2.__next__() 特殊方法,迭代.__next__()
    
for里面一定是要拿迭代器的,所以所有不可迭代的东西不能用for循环
for循环里面一定有__next__出现

总结:迭代器统一了所有不同数据类型的遍历工作

迭代器本身也是可迭代的
迭代器本身的特性:
    1.只能向前不能反复
    2.特别节省内存
    3.惰性机制

iter()内置函数可以直接拿到迭代器
next()

# for i in 123:# 'int' object is not iterable
#     pass

it = iter("你好啊,我叫甄嬛")
print(it)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
# StopIteration,迭代已经停止,不能再从迭代器里面拿东西了
# print(next(it))

在这里插入图片描述
__ iter__(): 特殊方法 迭代.__ iter__()
__ next__() 特殊方法,迭代.__ next__()

it = "好困呀啊啊啊啊啊".__iter__()
print(it)

print(it.__next__())
print(it.__next__())
print(next(it))
print(next(it))

在这里插入图片描述
模拟for循环的工作原理

# 模拟for循环的工作原理

s = "我是数据"
it = s.__iter__()
while 1:
    try:
        print(next(it))
    except StopIteration:
        break
print(1223456)
# #上面的迭代完成后it已经是一个空的迭代器了,所以要重新给数据,否则for循环没有结果
s = "我是数据"
it = s.__iter__()
for i in it:
    print(i)

在这里插入图片描述

二、生成器

生成器:(generator)
    生成器的本质就是迭代器
    
    创建生成器的两种方案:
        1.生成器函数
        2.生成器表达式
    生成器函数
        生成器函数中有一个关键字yield
        生成器函数执行的时候得到的是生成器,并不会执行函数
    yield:只要函数中出现了yield,他就是一个生成器函数
        作用:
            1.可以返回数据
            2.可以分段执行函数的内容,通过__next__()可以执行到下一个yield内容
            
    优势:用好了特别节省内容
def func():
    print(1111)
    return 999

ret = func()
print(ret)
print("---分隔线----")
def func():
    print(1111)
    print(333)
    yield 999# yield也有返回的意思
    print(333333)
    yield

ret = func()
# print(ret)
# yield会执行上面所有的函数(如果他上面有yield就停止),并且返回yield后面跟的内容
print(ret.__next__())#  yield只有执行next的时候才会返回数据,以及执行函数
# ret.__next__()
print(ret.__next__())

在这里插入图片描述
举例:去工厂定制10000件衣服,但是不想库存一下子放10000件,于是分批分批的拿

def order():
    for i in range(1, 10001):
        if i  % 50 == 0:
            print(f"这是这批的最后一件,第{i}件")
            yield
        else:
            print(f"这是第{i}件",end=' ')

ret = order()
ret.__next__()
ret.__next__()

def order2():
    lst = []
    for i in range(10000):
        lst.append(f"衣服{i}")
        if len(lst) == 50:
            yield lst
            lst = []

print(order2().__next__())

在这里插入图片描述

三、推导式

推导式:
    简化代码
    语法:
    列表推导式:[数据 for循环 if判断]
    集合推导式:{数据 for循环 if判断}
    字典推导式:{key: value for循环 if判断}
    
    不要把推导式妖魔化
    (数据 for循环 if判断) ->不是元组推导式,根本没有,他是生成器表达式
    
生成器表达式:-->一次性的
    语法:   (数据 for循环 if判断)

列表推导式

lst = []
for i in range(10):
    lst.append(i)

print(lst)

lst = [i for i in range(10)]
print(lst)

在这里插入图片描述
举例3:

# 请创建一个列表【1,3,5,7,9】
lst = [i for i in range(10) if i % 2 != 0]
print(lst)

# 生成50件衣服
lst = [f"衣服{i}" for i in range(50) ]
print(lst)

# 将如下列表中所有的英文字母修改成大写
lst = ["allen", "tony", "kevin"]
lst1 = [i.upper() for i in lst]
print(lst1)

在这里插入图片描述
集合推导式

s = {i for i in range(10)}
print(s)

在这里插入图片描述
字典推导式

lst = ["甄嬛", "沈眉庄", "年世兰", "叶澜依"]
dic = {i: lst[i] for i in range(len(lst)) }
print(dic

在这里插入图片描述
生成器表达式

gen = (i**2 for i in range(10))

for item in gen:
    print(item)

lst = list(gen)
print(lst)
print(gen)
# list()里有for循环,有for循环就有迭代器和next,把里面的值一个个拿出来
s = list({1:333, 7:444, 3:555, 4:666})
print(s)

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值