day13总结

迭代器

迭代器不是函数,只是一个称呼

python中一切皆对象(数据类型)

可迭代对象:含有.__iter__方法的数据类型就叫做可迭代对象

除了数字类型,所有数据类型都是可迭代对象

迭代器对象:含有.__iter__和.__next__方法的对象就是迭代器对象

为什么要有迭代器对象:提供了不依赖索引取值的手段

for循环原理(for循环本质就是while循环,只不过是一个一定可控的while循环)

 dic_iter = dic.__iter__()
# while True:
#     try:
#         print(dic_iter.__next__())
#     except StopIteration:
#         break

可迭代对象使用.__iter__变成迭代器对象

迭代器使用.__iter__依然是迭代器

可迭代对象不一定是迭代器对象,迭代器对象一定是可迭代对象

三元表达式

# if x > y:
#     print(x)
# else:
#     print(y)

三元表达式--》三目表达式

print(x) if x > y else print(y) #  --> 仅作了解

条件成立走这里 if 条件 else 条件不成立走这里

列表推导式

lt = [i**2 for i in range(10)]

from typing import Iterable # 导出一个可迭代对象类型

print(isinstance(range(10),Iterable)) # 判断是否属于该数据类型

字典生成式

 dic = {i:i**2 for i in range(10)}
 
 zip()
# res = zip([1,2,3],[4,2,3,4,2,3,4,2,3],'abcadsfasdfasdf')  # res是一个迭代器,__next__返回元组
# print(res.__next__())  # type:tuple
# print(res.__next__())  # type:tuple
# print(res.__next__())  # type:tuple
# # print(res.__next__())  # type:tuple
 
 
 lt1 = ['a', 'b', 'c']
lt2 = [1, 2, 3]

dic = {k: v ** 2 for k, v in zip(lt1, lt2)}
print(dic)


lt = list('abc')
print(lt)

生成器生成式

 generator 本质是一个迭代器 ---> 生成器: 本质就是迭代器,生成器就是一个自定义的迭代器


g = (i for i in range(10000000))
print(g)
# for i in g:
#     print(i)

lt = [i for i in range(10000000)]
print(lt)

生成器表达式: 看成老母鸡,节省内存空间,用就下蛋
列表推导式: 看成一筐鸡蛋,非常占用内存空间

生成器

# 生成器:含有yield关键字的函数叫做生成器
def ge():
    yield 3  # 一个yield相当于一个next; 暂停函数
    yield 4


# print(ge())  # ge()得到一个生成器 --> 生成器本质是迭代器
g = ge()  # 得到一个生成器

yield的特性

  1. 暂停函数
  2. 通过next取值

return的特性

  1. 终止函数
  2. 通过调用函数拿到值

写一个range方法

  1. 生成器
  2. 可变长参数

缺什么补什么,不管三七二十一,动手干

递归

# 传递 ; 回归


# 递归: 函数a内部直接调用函数a本身
# import sys
# sys.setrecursionlimit(10)
# print(sys.getrecursionlimit())
#
# def a():
#     x = 1
#     print(x)
#     a()
#
#
# a()

每一次递归,会不会结束函数?不会,并且每一次递归都会开辟内存空间,如果一直开辟内存就炸掉了,所以最多递归1000次

真正的递归必须得要有 退出条件

递归:

  1. 函数内部调用函数自己
  2. 必须要有退出条件
  3. 递归必须要有规律

猜你喜欢

转载自www.cnblogs.com/zhm-cyt/p/11578449.html