迭代器

  • 迭代器
  • 生成器
  • 函数递归
  • 三元表达式

迭代器

1.什么是迭代器
'''迭代器就是用来迭代取值的工具'''
什么是迭代呢?
	迭代就是一个重复的过程,但每次重复都是基于上一次的结果进行的
    
    # 单纯的重复不叫迭代
    while True:
        1+1
        
    # 重复,但基于上一次的重复的结果进行的
    count = 1
    while count < 5:
        print(count)
        count += 1
    # 可迭代对象
        # 1.内置有__iter__方法的对象都是可迭代对象
        # 例如
        'abc'.__iter__()
        [1,2,3].__iter__()
        {'x':1, 'y':2}.__iter__()
        {1,2,3,4}.__iter__()
        # 以上都是可迭代对象
    # 当我们调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
    # 迭代对象对象的特点:
    #        1.内置有__next__()方法
    #        2.内置有__iter__()方法
    
    # 1.迭代器一定是可迭代对象
    # 2.可迭代对象可以通过iter()方法转换为迭代器对象
    
    name = ['wuxie','cym','tiantian'] # 可迭代对象
    names = iter(name)   # 转换为迭代器对象
    while True:
        try:
            print(next(names))
        except StopIteration:
            break
    # for 工作原理
    # 1.调用in后对象的__iter__方法,得到一个迭代器对象names
    # 2.x = next(names),然后运行循环体代码
    # 3.重复步骤2,直到取完值,抛出异常,for循环结束
        
2.为何要用迭代器
	'''
	优点:
		1.找到一种通用的迭代取值方案->for循环
		2.惰性计算,节省内存
	缺点:
		1.不能指定取值,只能往后next
		2.迭代器对象是一次性的,一个迭代器对象取值取干净了,不能继续取了
	'''

3.如何使用迭起器
	 那么这个迭代器到底有什么作用呢?其实迭代器就相当于一个懒工厂,当我们需要当时候就可以调用next()方法返回值,没有需要当时候就等候,例如
list = [11,22,33,44,55]
linter = iter(list)
print(next(linter))
>>11
print(next(linter))
>>22
可以看出:上面就通过next方法将迭代器中的值给取出来了

注意:迭代器中有多少值就只能取几次,超过就会抛出异常:StopIteration

生成器

'''1.什么是生成器
	
生成器:生成器是一个特殊的迭代器,定义生成器可以用通过
   2.如何构建生成器
   定义生成器可以通过两种方式:生成器表达式以及函数的形式
'''
 # 生成器表达式
  res = (i for i in range(5))
 # 函数表达式
    # 如果要用函数体的形式实现生成器的话就需要用到yield

    
 def func():
    print('one...')
    yield 111
    print('two...')
    yield 222
    print('three..')
    yield 333
    
# yield 对比 return
# 相同点:都可以返回任意类型、任意个数的值
# 不同点:return只能返回值一次值,函数就立即结束
#        yield可以返回多次值,yield可以暂停函数的运行


# 在python中 函数内但凡出现yield关键字,再调用函数不会立即执行函数体代码,而会返回一个
# # 生成器对象,生成器对象本质就是一个自定义的迭代器对象


# 自定义range生产器
def my_range(stat,stop,n):
    res = stat
    x = stat
    while x < stop:
        x += n
        yield res
        res += n


for i in my_range(7, 20, 2):
    print(i)

函数递归

"""
1、什么是函数递归
     函数递归是函数嵌套调用的一种特殊格式
     即在调用一个函数时,在其内部又调用了自己
	当然我们不能无限调用自己
	在python中,名称空间
	在函数没有调用完成之前,函数所占用的名称空间并不会被回收
	所有递归是有深度
	

    import sys
    print(sys.getrecursionlimit())
    
    查看递归深度
    sys.setrecursionlimit(2000)
    设置递归深度

    递归应该分为两个阶段
    1、回溯:一层一层往下调用
    2、递推:一层一层向上推出结果


# 2、为何要用函数递归
    函数递归提供了一种基于函数实现的新的循环机制



# 3、如何用函数递归
"""


# 例题1:采用递归实现二分法
# 需求在输入数字时,在列表中快速找到
nums = [3,8,13,67,89] # 已经排序了

def seach(nums,find_num):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return 
    mid = len(nums)//2
    if find_num > nums[mid]:
        seach(nums[mid+1:], find_num)
    elif find_num < nums[mid]:
        seach(num[:mid], find_num)
    else:
        print('find it')
        
  seach(num, 64)
>>>
[3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
[57, 63, 78, 99]
[57, 63]
[]
not exists

三元表达式

'''1.什么时三元表达式
在Python语言中,也有三元运算符。不过Python的三元运算符和java以及C#有所区别,语法格式为:
表达式1 if 条件表达式 else 表达式2
当表达式返回True时,返回结果表达式1,否则返回结果表达式2。示例:
1
c = a if a < b else b
                            ------来自百度百科,python三元运算符
特点:
 1.它允许我们用单行表达式替换简单的if语句。
 
 2.通过减少代码行数来提高代码的可读性。

'''

def max2(x,y):
    if x > y:
        return x
    else:
        return y
    
    
 # 三元表达式
res = x if x > y else y
print(res)

生成式

# 传统生成列表
l = []
for i in range(10):
    l.append(i)
print(l)

>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 采用列表生成式
l = [i for i in range(10)]
print(l)
>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 字典生成式
d = {'k%s' % i:i for i in range(3)}
print(d)
>>
{'k0': 0, 'k1': 1, 'k2': 2}

# 集合生成式
s = {i for i in range(3)}
print(s)
>>
{0, 1, 2}

##没有元组生成式,我们可以将列表通过tupe()方法得到

 res = (i for i in range(5))  # 这是生成器
    
    
    
   

# 如何巧妙使用生成器,在面对读写大文件时
with open('a.txt','rt',endcoding='utf8') as f:  # a是超大文件,如果一次性读出,肯定超出内存
    res = sum(len(len) for line in f )
    print(res)
posted on   zhifwu  阅读(54)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示