首页 > 其他 > 详细

迭代器

时间:2021-07-02 19:58:15      阅读:11      评论:0      收藏:0      [点我收藏+]
  • 迭代器
  • 生成器
  • 函数递归
  • 三元表达式

迭代器

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)

迭代器

原文:https://www.cnblogs.com/wzf-1314-cym-6/p/14964106.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!