好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

迭代器、生成器

一、有参装饰器(封装三层的闭包函数)

举两个有参函数例子

 def outter2(xxx):
    def outter(func):
        def wrapper(*args, **kwargs):
            xxx
            res = func(*args, **kwargs)
            return res

        return wrapper

    return outter

@outter2(xxx=111)
def index():
    pass 
 def outter2(mode):
    def outter(func):
        def wrapper(*args, **kwargs):
            inp_name = input("username:")
            inp_pwd = input("password:")
            if mode == "file":
                if inp_name == 'lu' and inp_pwd == '345':
                    res = func(*args, **kwargs)
                    return res

            elif mode == 'mysql':
                print('基于mysql的数据库认证')
            elif mode == 'ldap':
                print('基于ladp的数据库认证')
            else:
                print('未知的数据来源')

        return wrapper

    return outter

@outter2('ldap')
def index():
    print('from index')

index() 

举例说明wraps装饰器

 from functools import wraps

def outter(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res

    #wrapper.__name__ = func.__name__
    #wrapper.__doc__ = func.__doc__
    return wrapper

@outter
def index():
    """
    这是一个很厉害的函数
    """
    print('index===>')

help(index)
print(index)
index() 

总结:装饰器模板 1、无参装饰器模板

 def outter(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res

    return wrapper

@outter
def index():
    pass 

2、有参装饰器模板

 def outter2(xxx):
    def outter(func):
        def wrapper(*args, **kwargs):
            xxx
            res = func(*args, **kwargs)
            return res

        return wrapper

    return outter

@outter2(xxx=111)
def index():
    pass 

二、迭代器 1.什么是迭代器? 迭代器是迭代取值的一种工具 迭代是一个重复的过程,但不是单纯的重复,每次重复都是基于上一次的结果而来 2.为什么用迭代器? 要创建一种通用的统一的取值工具,不依赖于索引和key的取值方式 3.如何用迭代器? (1)可迭代的对象iterable 1、内置有 iter 方法 (2)迭代器对象iterator 1、内置有 iter 方法 2、内置有 next 方法 调用: 可迭代对象. iter () --> 返回迭代器对象 调用:迭代器对象. next () --> 返回的是下一个值

六个对象:列表,字典,元祖,集合,文件,字符串 #涉及到遍历出来的对象 均是可迭代对象 文件对象既是可迭代对象,又是迭代器对象

迭代器

 dic = {'name': 'holmes', 'age': '18', 'gentle': 'male'}
dic1 = dic.__iter__()
print(dic1.__next__())
print(dic1.__next__())
print(dic1.__next__()) 
 dic = {'name': 'egon', 'age': 18, 'gender': 'male'}
len("hello")  # "hello".__len__()

iter_dic = iter(dic)  # dic.__iter__()

while True:
    try:
        print(next(iter_dic))
    except StopIteration:
        break

for k in dic:
    print(k) 
 dic = {'name': 'egon', 'age': 18, 'gender': 'male'}
iter_dic = iter(dic)

for k in iter_dic:
    print(k)
print('='*50)
for k in iter_dic:
    print(k)

for k in dic:
    print(k)
print('='*50)
for k in dic:
    print(k) 

总结迭代器对象优缺点: 优点: (1) 提供了一种新的、统一的取值方式(可以不依赖于索引以及key的) (2) 惰性计算,不耗费内存 缺点: (1) 取值不够灵活 (2) 一次性的,只能往后取,无法预知数据的个数

三、生成器

 def func():
    print('hello1')
    yield 1
    print('hello2')
    yield 2
    print('hello3')
    yield 3

g = func()
print(g)
res1 = next(g)
print(res1)
res2 = next(g)
print(res2)
res3 = next(g)
print(res3)
next(g) 

函数内但凡出现yield关键字,再调用函数不会执行函数体代码,会得到一个生成器对象 生成器就是一种自定义的迭代器 yiled VS return: 相同点:返回值层面都一样 不同点:return只能返回一次值函数就立即结束,而yield可以返回多次值

例子 迭代器从零到无穷

 def func():
    start = 0
    while True:
        yield start
        start += 1

res = func()
print(res)
print(next(res))
print(next(res))
print(next(res)) 

例子 迭代器range函数

 def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step

for i in my_range(1, 7, 2):  # 1 3 5
    print(i) 

四、面向过程编程 面向过程编程是一种编写思想or编程范式 面向过程核心是“过程”二字,过程就是流程,流程指的就是先干什么、再干什么、后干什么基于面向过程编写程序就好比在设计一条条流水线 优点:复杂的问题流程化、进而简单化 缺点:牵一发而动全身,扩展性差

五、表达式(生成式) 1、列表生成式

 nums = []
for i in range(1, 6):
    nums.append(i ** 2)

nums = [i ** 2 for i in range(1, 6)]
nums = ['ok' for i in range(1, 6)]
print(nums) 
 names = ['egon_nb', "lxx_sb", "hxx_sb"]

new_l = []
for name in names:
    if name.endswith("_sb"):
        new_l.append(name)

new_l = [name for name in names if name.endswith("_sb")]
print(new_l) 

2、字典生成式

 res = {i:i**2 for i in range(5)}
print(res,type(res))

items = [('k1',111),('k2',222)]
print({k:v for k,v in items}) 

3、集合生成式

 res = {i for i in range(5)}
print(res,type(res)) 

4、生成器表达式

 res = (i for i in range(5))
print(res,type(res))

print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))

for i in res:
    print(i)
for i in res:
    print(i)
for i in res:
    print(i)
print(list(res))
print(list(res))

print(sum([1,2,3,4,5])) 
 
with open('a.txt',mode='rt',encoding='utf-8') as f:
    data = f.read()
    print(len(data))  # 24

    res = 0
    for line in f:
        res += len(line)

    lines_size = (len(line) for line in f)
    res = sum(lines_size)

    res = sum(len(line) for line in f)
    print(res) 

查看更多关于迭代器、生成器的详细内容...

  阅读:36次