十二、函数part3

一、迭代器

1、什么是迭代器

    器=》工具

    迭代:是一个重复的过程,但每次重复都是基于上一次的结果而来的

    names=["egon",'lqz','yj']

    count = 1

    while count < len(names):

        print(names[count])

        count+=1

    迭代器:就是一种不依赖于索引的取值工具

2、为何要有迭代器

    特性:

        1、是一种通用的迭代取值方案

        2、惰性计算,节省内存

3、如何用迭代器

dic = {"name":"egon", 'age':18, 'gender':"male"}

while True:

    try:

        dic_iterator = dic.__iter__()

        res1 = dic_iterator.__next__()

        print(res1)

        res2 = dic_iterator.__next__()

        print(res2)

        res3 = dic_iterator.__next__()

        print(res3)

        res4 = dic_iterator.__next__()

    except StopIteration:#此功能旨在当值取空时直接跳出,不至于报错

        break

 内置有__iter__方法的类型称之为:可迭代的对象/类型

1、字典dict

2、集合set

3、文件对象(也是迭代器对象)

4、字符串str

5、列表list

6、元组tuple

迭代器对象: 内置有__next__方法、内置有__iter__方法

dic = {"name":"egon", 'age':18, 'gender':"male"}

dic_iterator1 = dic.__iter__()

dic_iterator1.__next__()

dic_iterator2 = dic_iterator1.__iter__().__iter__().__iter__()

print(dic_iterator1.__iter__().__iter__().__iter__()is dic_iterator1)

print(dic_iterator1)

print(dic_iterator2)

for循环的工作原理

dic = {"name":"egon", 'age':18, 'gender':"male"}

dic_iterator = dic.__iter__()

while True:

    try:

        res = dic_iterator.__next__()

        print(res)

        res1 = dic_iterator.__next__()

        print(res1)

    except StopIteration:

        break

用for改写:

dic = {"name":"egon", 'age':18, 'gender':"male"}

for kin dic:

print(k)

实现代码的逻辑步骤:

步骤1 dic_iterator = dic.__iter__()

步骤2 k=dic_iterator.__next__(),执行循环体代码

步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环

dic = {"name":"egon", 'age':18, 'gender':"male"}

for nin dic:

print(n)

dic_iterator = dic.__iter__()

for kin dic_iterator:

print(k)

二、自定义迭代器来实现惰性计算,从而达到节省内存的效果

1、什么是生成器

但凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值

就是我们自定义的迭代器,称之为生成器

def fuc():

    print("hello1")

    yield 111

    print("hello2")

    yield 222

    print("hello3")

res = fuc()

print(res)#得出他的类型为generator生成器

arg =next(res)

print(arg)#迭代器循环取值的方法

bes =next(res)

print(bes)

2、yield VS return

(1)相同点:都可以用来返回值

(2)不同点:

return只能返回一次值,函数就立即结束了

yield能返回多次值,yield可以挂起函数

案例

def func():

    i =0

    while True:

        i +=1

        yield i #将i值全部存进去

g = func() #调用func()存的值

for k in g:

if k <9999:

print(k)


总结迭代器的优缺点

优点:

1、是一种通用的迭代取值方案

2、惰性计算,节省内存

缺点:

1、取值不如索引、key的取值方式灵活

2、取值是一次性的,只能往后取,不能预估值的个数

练习:模拟range工作的过程

def inp_range(start,end,step): #定义三个参数开始值,末尾值和步数

while start < end:

    yield start

    start += step

for xin inp_range(1, 5, 2):

print(x)

三、面向过程:

核心是“过程”二字,过程指的就是做事的步骤

也就是先干什、再干什么、后干什么。。。

基于该思想写程序就好比设计一条条的流水线

优点:

可以把复杂的问题流程化,进而简单化

缺点:

    牵一发而动全身,扩展性差

四、生成式

1、列表生成式

l = [] #定义一个空的列表

names=['lqz_nb','yj_nb','jason_nb','egon']

for namein names:

if name.endswith('nb'):

l.append(name)

print(l)

方案二:

names=['lqz_nb','yj_nb','jason_nb','egon']

names = [namefor namein namesif name.endswith("nb")]

print(names)

2、集合生成式

l = {resfor resin range(1,5,1)}

print(l)

3、字典生成式

l = {f'k{i}': i**2 for iin range(5)}

print(l)

4、生成器表达式

nums=(i for i in range(200000))

res=sum(nums)

print(res)

五、内置函数

详情见https://www.cnblogs.com/linhaifeng/articles/7580830.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。