老男孩day15学习

1.迭代器

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"}
dic_iterator = dic.__iter__()
res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
dic_iterator.__next__()  # StopIteration

while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break

2.可迭代对象与迭代器对象

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

1、字典dict
2、集合set
3、文件对象(也是迭代器对象)
4、字符串str
5、列表list
6、元组tuple

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

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

dic_iterator1 = dic.__iter__()
dic_iterator1.__next__()
print(dic_iterator1.__iter__().__iter__().__iter__() is dic_iterator1)

dic_iterator2 = dic.__iter__()

三:for循环的工作原理

dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
for k in dic:
    print(k)

步骤1 dic_iterator = dic.iter()
步骤2 k=dic_iterator.next(),执行循环体代码
步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环

dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
for k in dic_iterator:
    print(k)
print(dic_iterator)

四:基于同一迭代器的重复取值,效果如何????
示例1:同一迭代器取完值后不能再次取值。

dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()

while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break

print('='*20)
dic_iterator = dic.__iter__()
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
示例2:
dic = {"name": "egon", 'age': 18, 'gender': "male"}
for k in dic:  # dic.__iter__()
    print(k)

for k in dic:  # dic.__iter__()
    print(k)

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

1、什么是生成器

但凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值
就是我们自定义的迭代器,称之为生成器

def func():
    print("hello1")
    yield 111
    print("hello2")
    yield 222
    print("hello3")
    yield 333
g = func()
print(g)  # 生成器本质就是迭代器
res=next(g)
print(res)

res=next(g)
print(res)

res=next(g)
print(res)

next(g)

2、yield VS return

(1)相同点:都可以用来返回值
(2)不同点:
return只能返回一次值,函数就立即结束了
yield能返回多次值,yield可以挂起函数

案例

def func():
     res=0
     while True:
         res+=1
         yield res
g=func()
for i in g:
    print(i)

总结迭代器的优缺点
优点:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
缺点:
1、取值不如索引、key的取值方式灵活
2、取值是一次性的,只能往后取,不能预估值的个数

def my_range(start, stop, step=1):
   while start < stop:
       yield start
       start += step

for i in my_range(1,5,2):  # 1 3
    print(i)

3.面向过程编程

面向过程:
核心是“过程”二字,过程指的就是做事的步骤
也就是先干什、再干什么、后干什么。。。
基于该思想写程序就好比设计一条条的流水线
优点:
可以把复杂的问题流程化,进而简单化
缺点:
牵一发而动全身,扩展性差
应用场景???

4.生产式类型

1、列表生成式

l=[i**2 for i in range(5) if i > 2]
print(l)

names=['lqz_sb','yj_sb','jason_sb','egon']

l=[name for name in names if name.endswith('sb')]

print(l)

2、集合生成式

res={i for i in range(5)}
print(res)

3、字典生成式

res={f'k{i}': i**2 for i in range(5)}
print(res)

4、生成器表达式

res=(i for i in range(5))
print(res,type(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
nums=(i for i in range(200000))
res=sum(nums)
print(res)


with open('01 迭代器.py', mode='rt', encoding='utf-8') as f:
    data=f.read()
    print(len(data))  # 2202

    res=0
    for line in f:
        res+=len(line)

    res = sum((len(line) for line in f))
    res = sum(len(line) for line in f)
    print(res)

5.内置函数

print(abs(-1))

print(all([True,11,0]))
print(all([]))

print(any([True,False,0]))
print(any([]))


print(callable(len))

print(chr(90))
print(ord('Z'))

l=[1,2,3]

print(dir(l))


print(divmod(10,3))


res=eval('{"k1":111}\n')
print(res['k1'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值