Python3 函数进阶2

目录

迭代器

  • 迭代器是访问容器类数据类型元素的一种方式

  • 迭代器是一个可以记住遍历的位置的对象

  • 迭代器对象从容器类数据类型的第一个元素开始访问, 直到所有元素被访问完后结束

  • 迭代器只能往前不会后退

可迭代对象

  • Python内置的str/list/tuple/dict/set/file/都是可迭代对象
  • 拥有__iter__内置方法的都是可迭代对象

迭代器对象

  • 可迭代对象使用__iter__方法可以得到迭代器对象

  • 拥有__iter____next__内置方法的就是迭代器对象

lis = [1, 2, 3]

# 可迭代对象使用__iter__方法可以得到迭代器对象
iter_lis = lis.__iter__()

print(iter_lis.__next__())  # 1
print(iter_lis.__next__())  # 2
print(iter_lis.__next__())  # 3
print(iter_lis.__next__())  # StopIteration

总结和补充

  • 执行可迭代对象的__iter__方法, 拿到的返回值就是迭代器对象
  • 执行迭代器对象__next__方法, 拿到迭代器对象中的一个值
  • 执行迭代器对象__iter__方法, 拿到的是迭代器本身
  • 文件本身就是迭代器对象

    三元表达式

三元表达式就是对if...else...语句的简化写法(不建议使用)

x = 10
y = 20

# 普通写法
if x > y:
    print(x)
else:
    print(y)
    
       
# 三元表达式
print(x) if x > y else print(y)

列表推导式

列表推导式可以用来生成新的列表

lis = [i for i in range(10)]
print(lis)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 我们还可以对i进行数学运算
lis = [i+1 for i in [1, 2, 3]]
print(lis)  # [2, 3, 4]

字典生成式

字典生成式可以用来生成新的字典

dic = {i: i**2 for i in range(3)}
print(dic)  # {0: 0, 1: 1, 2: 4}

zip()函数

zip() 函数用于将可迭代的对象作为参数, 将对象中对应的元素压缩成一个个元祖, 然后返回由这些元祖组成的对象.

  • 我们可以使用list()转换来输出列表
  • 如果各个迭代器的元素个数不一致, 则返回列表长度以最短的为准
  • 利用*操作符, 可以将元祖解压为列表
a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]

zipped = zip(a, b)
print(zipped)  # <zip object at 0x000000000A0012C8> 返回多个元祖组成的对象
print(list(zipped))  # [(1, 4), (2, 5), (3, 6)]

print(list(zip(a, c))) # [(1, 4), (2, 5), (3, 6)] 以短的为准

a1, b1 = zip(*zip(a,b))  # zip(*) 可理解为解压
print(list(a1))  # [1, 2, 3]
print(list(b1))  # [4, 5, 6]

# 生成器

  • 生成器本质上就是一个自定义的迭代器
  • 含有yield关键字的函数叫做生成器
def gene():
    print(1)
    yield 1
    print(2)
    yield 2
    
g = gene()
print(g)  # <generator object gene at 0x0000000009F81258>


print(g.__next__())  # 1  1
print(g.__next__())  # 2  2
  • yield的特性:
    1. 暂停函数
    2. 通过__next__取后面的值

递归

  • 递归是一种特殊的函数嵌套, 既在函数内部直接调用函数本身

  • 递归函数的特性:

    1. 函数内部调用函数本身
    2. 递归必须要有规律
    3. 必须要有退出条件
count = 0

def func():
    global count
    count +=1
    print(count)
    if count == 5:
        return
    a()
    
'''
1
2
3
4
5
'''
上一篇:CF1097E


下一篇:最长递增子序列(LIS)