迭代器 生成器 内置函数

1.迭代器

迭代取值的工具

s = ‘hello‘
n = 0
while n < len(s):
    print(s[n])  # h  e  l  l  o
    n += 1# 每一次迭代都是基于上一次的结果而来的

能够迭代取值的数据类型:字符串、列表、元组、集合、字典

可迭代对象:只有内置有__iter__方法的都叫可迭代对象

可迭代对象有 str list tuple dict set,文件对象本身就是迭代器对象

可迭代对象执行内置的__iter__方法得到的就是该对象的迭代器对象

迭代器对象:内置__iter__方法,内置__next__方法

ps:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。

l = [1,2,3,4,5,6]
iter_1 = l.__iter__()  # 生成一个迭代器对象
print(iter_1.__next__())  # 1  如果取完了,会报错

迭代器的对象的取值,必须用__next__

异常处理l = [1,2,3,4,5,6]
iter_1 = l.__iter__()
while True:
    try:
        print(iter_1.__next__())
    except StopIteration:  # 用来接收没有值可取时的报错,
        break

迭代器的特点:只能往后依次取值,不能后退。

for 循环内部本质:

1.将 in 后面的对象调用__iter__转换成迭代器对象

2.调用__next__迭代处理

3.内部有异常捕获StopIteration,当__next__报这个错的时候自动结束循环。

迭代取值:

优点:不依赖索引取值,内存中只占一份空间,不会导致内存溢出。

缺点:不能获取指定的元素,取完之后,会报StopIteration错

2.生成器

用户自定义的迭代器

def func():
    print(‘first‘)
    yield  9       #  函数内部有yield关键字,加括号执行函数的时候不会触发函数体的运行
    print(‘second‘)
    yield 8
g = func()  # 生成器初始化,将函数编程迭代器print(g.__next__())  #yield后面跟的值是调用迭代器__next__方法能够得到的值
print(g.__next__())  #yield可以返回一个值,也可以返回多个值,多个值以元组的形式返回
def my_range(start,end,step):
    while start < end:
        yield start
        start += step
for j in my_range(1,8,2):
    print(j)
def dog(name):
    print(‘%s‘%name)  # egon
    while True:
        food = yield  # yield支持外界传参
        print(‘%s吃%s‘%(name,food))  # egon吃饺子
g = dog(‘egon‘)  # 函数体内有yield关键字,调用该函数不会执行函数体代码,而是将其变成一个迭代器
g.__next__()
g.send(‘饺子‘)

yield 提供了一种自定义生成器的方法,会将函数的运行状态暂停住,然后返回值

与return的异同点

相同点:都可以返回值,并且都可以返回多个

不同点:yield可以返回多个值,而return只能返回一次函数立即结束,yield可以接受外部传入的值

res = [i for i in range(1,10) if i != 4]  # 生成器表达式
print(res)

生成器不执行任何一行代码,必须通过__next__触发代码的运行

add(n,i):
    return n+i  # n = 10,i = 0  n = 10,i = 10
def test():
    for i in range(4):
        yield i
g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)
    # 第一次for循环g=(add(n,i) for i in test())
    # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)  # res=[20,21,22,23
常用内置方法print(abs(-11.11))  # 求绝对值
l = [0,1,0]print(all(l))  # 只要有一个为False就返回Falseprint(any(l))  # 只要有一个位True就返回True
def index():    username = ‘我是局部名称空间里面的username‘    print(locals())  # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字    print(globals())  # 无论在哪 查看的都是全局名称空间index()
print(bin(10))  # 十转二print(oct(10))  # 十转八print(hex(10))   # 十转十六print(int(‘0b1010‘,2))  # 二转十print(int(‘0o1010‘,8))  # 八转十print(int(‘0x1010‘,16))  # 十六转十
print(bool(1))  #Trueprint(bool(0))  # False
s = ‘hello‘print(s.encode(‘utf-8‘))  # b‘hello‘print(bytes(s,encoding=‘utf-8‘))  # b‘hello‘
def index():    passprint(callable(index))   #True
print(chr(97))  # 将数字转换成ascii码表对应的字符print(ord(‘z‘))  # 将字符按照ascii表转成对应的数字A-Z-->65-90    a-z-->97-122
l = [1,2,3]print(dir(l))  # dir获取当前对象名称空间里面的名字
total_num,more = divmod(900,11)if more:    total_num += 1print(‘总页数:‘,total_num)  # 总页数: 82

l = [‘a‘,‘b‘]for i,j in enumerate(l,0):    print(i,j)  # 0 a    <class ‘int‘> <class ‘str‘>
s = """print(‘hello baby~‘)"""eval(s)  # hello baby~
s = """print(‘hello baby~‘)x = 1y = 2print(x + y)"""exec(s)  # hello baby~   3# eval不支持逻辑代码,只支持简单的python代
# format 三种玩法# {}占位# {index} 索引# {name} 指名道姓

def login():    """    一起嗨皮    :return:    """# print(help(login))
# isinstance 后面统一改方法判断对象是否属于某个数据类型n = 1print(type(n))print(isinstance(n,list))  # 判断对象是否属于某个数据类型
print(pow(2,4))  # 16 2**4print(round(1.4))  # 1  比较大小
 
面向过程编程好处:将复杂的问题流程化,从而简单化坏处:可扩性差 ,一旦修改,整体都会受影响

原文地址:https://www.cnblogs.com/zrh-960906/p/11191013.html

时间: 2024-11-04 23:36:01

迭代器 生成器 内置函数的相关文章

13t天 迭代器,生成器,内置函数

上周复习: 函数的递归调用 函数调用时函数嵌套调用的一种特殊形式 函数在调用时,直接或间接调用了自身,就是梯归调用. 直接调用自身 def f1():   print('from f1')   f1()f1() 间接调用函数 def f1():   print('from f1')   f2()?def f2():   print('from f2')   f1()f1() 梯归 递归应该分为两个明确的阶段,回溯与递推. 回溯就是从外向里一层一层递归调用下去,回溯阶段必须要有一个明确地结束条件,

python学习笔记之生成器和迭代器、内置函数

生成器 迭代器 内置函数 作业 一.生成器 1.1.列表生成器 问题引入:看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1 方案一: a = [1,3,4,6,7,7,8,9,11] for index,i in enumerate(a): a[index] +=1 print(a) 原值修改 方案二: >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> a = map(lambda x:x

生成器/内置函数

生成器 本质就是迭代器,手动写的迭代器 生成器的产生方式 生成器函数 def func(): print (123) yield '生成器' func() ## 执行结果 :没有结果 '''******''' ret = func() ## 这个过程相当于 实例化对象 '''******''' print(ret) #<generator object func at 0x000002A9298C3F48>生成器对象 # 想执行这个 要用next() 和迭代器一样 或者遍历它 next(ret

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

装饰器、生成器、迭代器、及python中内置函数的使用

一. 装饰器 1. 装饰器的概述 (1)概述:装饰器本质就是函数,主要用来装饰其他函数,为其他函数添加附加功能. (2)使用装饰器的原则 1)不能修改被装饰的函数的源代码 2)不能修改被装饰的函数的调用方式 (3)装饰器原理:函数即"变量".高阶函数.嵌套函数 2.使用装饰器的原因 (1)传统的多个函数模块修改需要同时修改多个函数.如果函数过多,则修改不方便. 如下,如果想要在每个函数中开头结尾分别输入内容,则需要在每个函数开头结尾加入需要输出的内容. def f1():     pr

Python学习笔记(四,迭代器、生成器、内置函数)

一.迭代器 1.迭代器定义 迭代是一个重复的过程,每次重复一次迭代,并且每次迭代的结果都是下一次迭代的初始值. l = ["aaa","bbb","ccc"] count = 0 while count< len(l): #每次重复完成后count都是下一次的初始值 print(l[count]) count+=1 需要迭代器的原因:对于序列类型str.list.tuple可以依赖索引迭代取值,对于dict.set.文件需要提供不依赖索引取

Python学习笔记四(迭代器、生成器、内置函数)

一.迭代器 1.迭代器定义 迭代是一个重复的过程,每次重复一次迭代,并且每次迭代的结果都是下一次迭代的初始值. l = ["aaa","bbb","ccc"] count = 0 while count< len(l): #每次重复完成后count都是下一次的初始值 print(l[count]) count+=1 需要迭代器的原因:对于序列类型str.list.tuple可以依赖索引迭代取值,对于dict.set.文件需要提供不依赖索引取

4)装饰器、迭代器、生成器以及内置函数

 装饰器.迭代器.生成器以及内置函数 装饰器: 原函数前后增加功能,切不改变函数的原本使用方式 import timedef wrapper(f):    def inner():        start = time.time()        f()        end = time.time()        print('执行效率为%s'%(end-start))    return inner @wrapperdef func():    print('this is func')

python之迭代器生成器和内置函数,匿名函数

今天学习了迭代器生成器以及内置函数和匿名函数,说实话有些懵圈,有些难度了. 一.迭代器和生成器 1.如何从列表.字典中取值的: index索引 for循环 凡是可以使用for循环取值的都是可迭代的 (1)可迭代协议:内部含有__iter__方法的都是可迭代的 (2)迭代器协议:内部含有__iter__方法和__next__方法的都是迭代器 什么是可迭代的:内部含有__iter__方法的都是可迭代的 什么是迭代器:迭代器=iter(可迭代的),自带一个__next__方法 可迭代最大的优势:节省内