python初学常见问题(Python中的迭代器、生成式、生成器及装饰器)python初学 / python装饰器与生成器...

wufei123 发布于 2024-05-13 阅读(43)

枫叶云:https://my.oschina.net/u/3804957/home迭代器迭代器是访问集合元素的一种方式迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。

另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件。

特点:访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容不能随机访问集合中的某个值 ,只能从头到尾依次访问访问到一半时不能往回退便于循环比较大的数据集合,节省内存生成一个迭代器:

>>> a = iter([1,2,3,4,5])>>> a >>> a.__next__()1>>> a.__next__()

2>>> a.__next__()3>>> a.__next__()4>>> a.__next__()5>>> a.__next__() Traceback (most recent call last): File

"", line 1, in StopIteration2.生成式和生成器列表生成式格式:[exp forvalin collection if condition] [x*x

for x in xrange(10) if x*x%2 == 0]生成器(generator):方法一:(exp forvalin collection if condition)方法二:使用yield关键字,包含yield语句的函数会被特地编译成生成器。

yield可以理解力成return,但是并不退出,只是挂起,恢复的时候从yield下面开始执行生成式和生成器的区别:列表显示生成式直接返回了表达式的结果列表,面生成器是一个对象,该对象包含了对表达式结果的计算引用,通过结果循环可以直接选举输出。

生成器不会一次性列出所有的数据,当然你用到的时候,在列出来,更加节约内存的使用率类似 range(1,10) xrange(1,10)的区别,但是类型却不同#!/usr/bin/env python# -*- coding:utf-8 -*-

# @time   :2018/1/28 22:34# @Author :FengXiaoqing# @file   :production.pya = [x*x for x in range(1,11

) if x%2 ==0]print (a)print(type(a)) b = (x*x for x in range(1,11) if x%2 ==0)print (b)print(type(b))

for i in b:print(i)print(#*20)deftest(l):for i in l:yield iprint("OK i = {0}".format(i)) m = test([1

,2,3,4,5,6])for i in m:print(i) 结果: [4, 16, 36, 64, 100]

> 4 16 36 64 100####################1OKi = 1 2OKi = 2 3OKi = 3 4OKi = 4 5OKi = 5 6OK

i = 63. 装饰器装饰器的作用:装饰器本质上是一个python函数,它可以让其他工具函数在不需要做任何代码变动的前提下增加额外功能 ,装饰器的返回值也是一个函数对象它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能 本身无关的雷同代码并继续重用装饰器的作用简单点说:就是不改变 原来函数本身,在函数的前面或后面增加一些额外的功能 场景:京东购物,放入购物车后在结算前弹出的让你登录用户的窗口。

装饰器:在了解装饰器之前 ,我们先来了解一个callable函数说明:1.方法用来检测对象是否可被调用 ,可被调用 批量的是对象测否使用()括号的方法调用 def a():passcallable(a)。

2.可调用 对象,在实际调用 也可测调用 失败;但是不可调用 对象,调用 肯定不成功3.类对象都 是可被调用 对象,类的实例对象是否可调用 对象,取决于类是否定义了call方法装饰器例子:#!/usr/bin/env python。

import datetimedefhellow(fun):defpreHello():        print("########start##########“)        fun()        print("

########end###########“)return preHello原有方法:defstartend(func):defstart():        print("#########start#############"

)        func()        print("#########end#############")    return startdefhello():    print("hello world!"

) hello = startend(hello) hello()改进后的使用方法:defstartend(func):defstart():        print("#########start#############"

)        func()        print("#########end#############")return start@startenddefhello():    print(

"hello world!") hello()另一个实例 :#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/18 23:32

# @Author  : Feng Xiaoqing# @File    : test.py# @Function: -----------defstartEnd(author):defa(fun):def

b(name):            print("this author is {0}".format(author))            print("start")            fun(name)            print(

"end")return breturn a@startEnd("fengxiaoqing")defhello(name):    print("hello {0}".format(name)) hello(

"fxq") 结果:this author is fengxiaoqing start hello fxq end《疯狂的Python》同名视频课程在网易云课堂发布购买《指南版》或《全能的Python》

更可以获得老司机肉身答疑服务

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻82945