迭代器,生成器,函数递推与回溯,三元式,生成式

迭代器

1,什么是迭代器

迭代器指的是迭代取值的工具,迭代时一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
​
什么是迭代?
    迭代就是一个重复的过程,但是每次重复都基于上一次的结果进行的
    
    #单纯的重复不叫迭代
    count = 1
    while count < 5:
        print(count)
        count += 1

2,为何要用迭代器

优点
1找到一种通用的迭代取值方案
2惰性计算,节省内存
​
缺点
1不能取指定的值,只能往后next
2迭代器对象是一次性的,迭代器对象取值干净了,不能继续取值

3,如何用迭代器

#可迭代对象
1,内置有__iter__ 方法的对象都是可迭代对象
#调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
#迭代对象的特点:
    1,内置有__next__()方法  可取出迭代器的值
    2,内置有__iter__()方法
    
#for循环工作原理
1 调用in后那个对象的__iter__方法,看到一个迭代器对象iter_name
2 x=next(iter_names),然后运行循环体代码
3 重复步骤2 直到取完值,抛出异常,for循环会带我们捕捉异常结束循环
for x in name:
    print(x)

生成器

#yield 对比 return
相同点都可以返回任意类型。任意个数的值
不同点:return只能返回值一次值,函数立即结束
        yield可以返回多次值,yield可以暂停函数的运行
    # def func():
#     print('one...')
#     yield 111
#     print('two...')
#     yield 222
#     print('three...')
#     yield 333
#     print('fourth')   
函数内但凡出现yield关键字,再调用函数不会立即执行函数代码,而会返回一个
生成器对象,生成器对象本质就是一个自定义的迭代器对象
 

函数递推与回溯

函数递归是函数嵌套调用的一种特殊格式
即在调用一个函数时,在其内部又调用了自己
def foo():
    print('111')
    foo()
foo()
递归应该分为两个阶段
1、回溯:一层一层往下调用
2、递推:一层一层向上推出结果
​
# # 例1:
# l = [11, [22, [33, [44, [55, [66, [77, [88, [99]]]]]]]]]
# 
# 
# def func(l):
#     for item in l:
#         if type(item) is list:
#             func(item)
#         else:
#             print(item)
# 
# func(l)
​
​
​
# 例2:递归实现二分法  
nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
def search(nums,find_num):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    mid = len(nums) // 2 将列表二分
    if find_num > nums[mid]:
        # 找右半部分
        search(nums[mid+1:],find_num)添加新的列表,循环继续分割,快速找到要寻找的数
​
    elif find_num < nums[mid]:
        # 找左半部分
        search(nums[:mid],find_num)
    else:
        print('find it')
​
​
# search(nums,63)
search(nums,64)

三元表达式

def max2(x,y):
    if x > y:
        return x
    else:
        return y
​
​
# 条件成立时的返回值 if 条件 else 条件不成立时的返回值
​
x = 10
y = 20
​
# res = x if x > y else y
res = "ok" if 'a' != "a" else "no"
print(res)

生成式

# 列表生成式
​
# 需生成的 for 条件 if 条件
​
# l = []
# for i in range(10):
#     if i > 3:
#         l.append(i)
​
# l = ["ok" for i in range(10) if i > 3]
# print(l)
​
​
# names = ['egon', "lxx_sb", "hxx_sb", "wxx_sb", "lxx_sb"]
# res = [name for name in names if name.endswith('sb')]
# print(res)
​
​
# names = ["lxx", "hxx", "wxx", "lxx"]
# print([name+"_sb" for name in names])
​
​
# 字典生成式
# print({"k%s" %i:i for i in range(3)})
​
# 集合生成式
# print({i for i in range(3)})
​
# 生成器表达式
# res = (i for i in range(5))
# print(res)
# print(next(res))
# print(next(res))
​
​
with open('a.txt', mode='rt', encoding='utf-8') as f:
    # res = f.read()
    # print(len(res))  # 23个字符
​
    # 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)
​
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值