迭代器、生成器、面向过程

目录:

一、装饰器

二、迭代器

三、生成器

四、面向过程

一、装饰器

       1、装饰器简介:           

             软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是

          封闭的,对功能的扩展是开放的也就是说我们必须找到一种解决

          方案能够解决在不修改一个功能源代码以及调用方式的前提下,

          为其加上新功能,而装饰器正好可以解决这个问题

       2、装饰器是什么:

           装饰器就是为被装饰对象添加功能的工具

      3、定义:

           装饰即在不修改被装饰对象源代码与调用方式的前提下,为被装

           饰器对象添加功能,装饰器与被装饰对象均可以使任意调用的对

            象,装饰器本质就是函数,被装饰对象也是函数 

      4、无参装饰器

装饰器样式:
def timmer(func):    #func=最原始的home    def wrapper(*args,**kwargs):        start_time=time.time()        res=func(*args,**kwargs) #调用最原始的home        stop_time=time.time()        print(stop_time-start_time)        return res    return wrapper
运用:
import timedef outter(func):  def wrapper():    start_time=time.time()    func()    stop_time=time.time()    print(stop_time-start_time)    return wrapper

@outter

def index():   time.sleep(3)   print(‘welcome to index page‘) def home(name):  time.sleep(5)   print(‘welcome %s to home page‘ %name) index() home(‘baidu‘) 

       5、有参装饰器

import time
current_user={
    ‘username‘:None,
}
def auth(engine):
    def auth2(func)
        def wrapper(*args,**kwargs):
            if engine == ‘file‘:
                if current_user[‘username‘]:
                    print(‘已经登陆过了‘)
                    res=func(*args,**kwargs)
                    return res

                uname=input(‘用户名>>: ‘).strip()
                pwd=input(‘密码>>: ‘).strip()
                if uname == ‘egon‘ and pwd == ‘123‘:
                    print(‘登陆成功‘)
                    current_user[‘username‘]=uname
                    res=func(*args,**kwargs)
                    return res
                else:
                    print(‘用户名或密码错误‘)
            elif engine == ‘mysql‘:
                print(‘基于MyQL的认证‘)
            elif engine == ‘ldap‘:
                print(‘基于LDAP的认证‘)
        return wrapper
    return auth2

@auth(‘ldap‘)
def index():
    time.sleep(1)
    print(‘welcome to index page‘)
    return 122

index()

      6、叠加多个装饰器

import time
current_user={
    ‘username‘:None,
    # ‘login_time‘:None
}

def auth(func):
    def wrapper(*args,**kwargs):
        if current_user[‘username‘]:
            print(‘已经登陆过了‘)
            res=func(*args,**kwargs)
            return res
        uname=input(‘用户名>>: ‘).strip()
        pwd=input(‘密码>>: ‘).strip()
        if uname == ‘egon‘ and pwd == ‘123‘:
            print(‘登陆成功‘)
            current_user[‘username‘]=uname
            res=func(*args,**kwargs)
            return res
        else:
            print(‘用户名或密码错误‘)
    return wrapper

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper

@timmer
@auth
def index():
    time.sleep(1)
    print(‘welcome to index page‘)
    return 122

二、迭代器

      1、什么是迭代器:

          完成一个重复的过程,并且每次重复都是基于上一次的结果而来

      2、可迭代对象:

          但凡内置有__iter__方法的对象,都是可迭代对象

dic={‘x‘:1,‘y‘:2,‘z‘:3}
iter_dic=dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())

s1={‘a‘,‘b‘,‘c‘}
iter_s1=s1.__iter__()
print(iter_s1.__next__())
print(iter_s1.__next__())
print(iter_s1.__next__())
print(iter_s1.__next__())

list1=[1,2,3]
iter_list1=list1.__iter__()
print(iter_list1.__next__())
print(iter_list1.__next__())
print(iter_list1.__next__())

      3、迭代对象:

          可迭代的对象执行__iter__方法得到的返回值就是迭代器对象

          本身内置有__iter__和__next__方法,文件本身就是迭代器对

          象

      4、迭代器的优缺点:

          优点:

            1、提供了一种可不依赖于索引的取值方式

            2、节省内存

           缺点:

            1、取值麻烦,只能一个一个取,而且只能往后取

            2、一次性,无法用len获取长度

     5、for循环原理分析:       

        for 循环称之为迭代器循环,in后跟的必须是可迭代的对象for循环会执行in后

        对象的__iter__方法,拿到迭代器对象、然后调用迭代器对象的__next__方法,

        拿到一个返回值赋值 给line,执行一次循环体周而复始,直到取值完毕,for

        循环会检测到异常自动结束循环

三、生成器

       1、函数内包含有yield关键字,再调用函数体代码,拿到的返回值就是一个生成

         器对象,生成器的本质就是迭代器,也就是说生成器的玩法就是一个生成对象    

   def chicken():   print(‘=====>first‘)
    yield 1
    print(‘=====>sencond‘)
    yield 2
    print(‘=====>third‘)
    yield 3
obj=chicken()
res=obj.__next__()
print(res)
for item in obj:#会报出异常    print(item)
1、iter_obj=obj.__iter__(),拿到迭代器2、出发iter_obj.__next__(),拿到该方法的返回值,赋值给item3、周而复始,直到函数内不在有yield,即取值完毕4、for会检测到StopIteration异常,结束循环
总结yield:1、为我们提供了一种自定义迭代器的方式,   可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次   因为yield可以保存函数执行的状态

      自制range函数

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

for item in my_range(5,10,2):    print(item)


四、面向过程

      1、面向过程的编程思想            核心是‘过程‘二字,过程即解决问题的步骤,即先干什么,再干什么......            基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式。
      2、总结优缺点:            优点:复杂的问题流程化,进而简单化            缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,             即扩展性极差            应用:用于扩展性要求低的场景

原文地址:https://www.cnblogs.com/songxuexiang/p/8694447.html

时间: 2024-10-16 06:25:35

迭代器、生成器、面向过程的相关文章

python学习第四节 迭代器 生成器 面向过程编程

1:什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. 对迭代器来讲,有一个__next()就够了.在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next__()方法,直到监测到一个StopIteration异常. >>> L = [1,2,3]>

python基础(4):迭代器、生成器、面向过程编程

迭代器 生成器 面向对线编程 一 迭代器 #1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 #2.什么是可迭代对象? 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__i

迭代器、生成器、面向过程编程

一 迭代器 1.迭代的概念 #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 2.为何要有迭代器?什么是可迭代对象?什么是迭代器对象? #1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但

迭代器和生成器,面向过程编程

迭代器 迭代的工具,迭代是一个重复的过程,并且每次重复都是基于上一次结果而来 什么是可迭代的对象和迭代器对象? 在python中,但凡内置有__iter__方法的对象,都是可迭代对象 可迭代对象执行__iter__方法的到的返回值就是迭代器对象 l='hello' iter_l=l_iter_() while True:        try:            print(iter_l._next_())        except StopIteration:            br

迭代器,生成器,面向过程 2018-3-30

迭代器 迭代器:是一个重复的过程,并且重复都是基于上一次结果得到的,迭代取值的工具 可迭代对象:但凡内置有__iter__方法的对象,都是可迭代对象 可迭代对象有:list,tuple,dict,set ,文件等 迭代对象,res__next__,执行可拿到迭代对象中的一个值 __iter__,执行可拿到迭代器本身 有点:1,提供一种不依赖索引取值的方式         2,迭代器更加节省内存 缺点:1,驱逐麻烦,一个一个的取          2,取值一次性,只能往后取,无法用len获取长度

生成器、三元运算符、面向过程

生成器: 函数内部有 yield 关键字,该函数执行的结果就是生成器函数,yield后跟返回值,不跟是None 生成器本质就是迭代器 def foo(): print('start') yield   # yield  ok     #可跟返回值 print('end') g=foo()          # g 就是生成器 res=g.__next__()    #  next 执行一次   如上代码: 函数碰到return结束,这里的yield相当于return,后面没有跟返回值,返回Non

Day4 装饰器——迭代器——生成器

一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input('>>: ').strip() if choice in dic: dic[ch

python_装饰器——迭代器——生成器

一.装饰器 1.什么是装饰器? 器=>工具,装饰=>增加功能 1.不修改源代码 2.不修改调用方式 装饰器是在遵循1和2原则的基础上为被装饰对象增加功能的工具 2.实现无参装饰器 1.无参装饰器的模板 def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper 2.使用:在被装饰对象正上方单独一行 @无参装饰器名 def foo(): pass 3.实现有参装

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

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