函数:迭代器-生成式-三元表达式

1、什么是迭代器。

迭代器迭代取值的工具,迭代是一个重复的过程,但是每次重复都是基于上一次的结果而来。

2、为何要用迭代器

1、为了找到一种新的、统一的取值方式(可以不依赖于索引以及key取值)

2、惰性计算,不耗费内存

3、如何用迭代器

3.1、可迭代的对象iterable

内置有 __ iter__方法

srt.__ iter__
list.__ iter__
dict.__ iter__
tuple.__ iter__
set.__ iter__
with open('a.txt',mode='rt',encoding='utf-8').__ iter__

3.2、迭代器对象iterator

1、内置有__ iter __方法
with open('a.txt',mode='rt',encoding='utf-8').__ iter__

迭代器对象内置iter方法是为了for循环底层工作原理设置起来更简单

2、内置有__ next __方法
with open('a.txt',mode='rt',encoding='utf-8').__ next__
调用:可迭代对象.__ iter __()返回迭代器对象=iter(可迭代对象)
调用:迭代器对象.__ iter __()返回的是他本身=iter(可迭代对象)
调用:迭代器对象.__ next __() 返回的是下一个值=next(迭代器对象)
msg = '123456'

msg1 = iter(msg)

while True:
    
    try:
        print(next(msg1),end='')
    except StopIteration:
        break
        
# 123456

msg = '123456'
msg1 = iter(msg)

print(next(msg1))
print(next(msg1))

for i in msg1:
    print(i,end='')
# 1
# 2
# 3456

总结迭代器对象优缺点:

优点:

    1、提供了一种新的、统一的取值方式
    2、惰性计算,不耗费内存

缺点:

    1、取值不够灵活
    2、一次性的,只能往后取,无法预知数据的个数

4、自定义迭代器

生成器

函数内但凡出现yield关键字,再调用函数不会执行函数体代码,会得到一个生成器对象
生成器就是一种自定义的迭代器
def func():
    
    print('1')
    yield 1
    
    print('2')
    yield 2
    
    print('3')
    yield 3
    
g = func()

next(g) # 1
next(g) # 2
next(g) # 3
def func():
    
    start = 0
    
    while True:
        yield start
        start +=1
        
res = func()
print(next(res)) # 0
print(next(res)) # 1
print(next(res)) # 2
        

yield VS retrun

相同点:返回值层面都一样

不同点:retrun只能返回一次值,函数立即结束,yield 可以返回多次

5、表达式

三元表达式

三元表达式是python为我们提供的一种简化代码的解决方案,语法如下:

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
def max2(x,y):
    
    if x > y:
        return x
    
    else:
        return y

res = max2(1,2)
x=1
y=2
res = x if x > y else y # 三元表达式

优点:方便,改变了编程习惯,可称之为声明式编程

生成式

1、列表生成式

number = []

for i in range(1,6):
    number.append(i**2)
print(number)

li = [i**2 for i in range(1,5)]
print(li)
# [1, 4, 9, 16]

li = ['hello' for i in range(1,5)]
print(li)
# ['hello', 'hello', 'hello', 'hello']
name = ['tom','jon','monm']
l = [ ]
for i in name:
    if i.endswith('m'):
        l.append(i)
print(l) # ['tom', 'monm']

l2 = [i for i in name if i.endswith('m')]
print(l2) # ['tom', 'monm']

2、字典生成式

res = {i:i**2 for i in range(5)}
print(res) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
dic = {'name':'tom','age':18}
print({k:v for k,v in dic.items()})
# {'name': 'tom', 'age': 18}

3、集合生成式

res = {i for i in range(5)}
print(res) #  {0, 1, 2, 3, 4}

4、生成器表达式

res = (i for i in range(5))
print(res)       # <generator object <genexpr> at 0x00000234FDE00A50>
print(next(res)) # 0 
print(next(res)) # 1
print(next(res)) # 2
print(next(res)) # 3 
print(next(res)) # 4
res = (i for i in range(5))
for i in res:
    print(i)
for i in res:
    print(i)
for i in res:
    print(i)
# 只输出一次 0 1 2 3 4 ,遍历同一个迭代器,第一次循环后,迭代器里已经没有值了
res = (i for i in range(5))
list1 = list(res)
print(list1)
# [0, 1, 2, 3, 4]
print(list1)
# [] 遍历同一个迭代器,第一次已经取完值,所以为空
posted @ 2021-04-01 09:54  此用户名不可用  阅读(79)  评论(0)    收藏  举报