目录  

1.迭代器

2.生成器

3.推导式

4.匿名函数

5.内置函数

6.递归

7.闭包

8.装饰器

一.迭代器

特点:

    1. 省内存    2. 只能向前. 不能反复    3. 惰性机制
让不同的数据类型有相同的遍历方式
迭代器取值方法:
lst = [1,2,3,4]lst1 = lst.__iter__()print(next(lst1))print(lst1.__next__())

判断是不是可迭代对象和迭代器
from collections import Iterator,Iterablelst = [1,2,3,4]print(isinstance(lst,Iterable))  可迭代对象print(isinstance(lst,Iterator))  迭代器
用while循环打印迭代器并异常捕捉
lst = ["黑色星期天","bad feel","滚吧","那就这样吧"]lst1 = lst.__iter__()while True:    try:        s = lst1.__next__()        print(s)    except StopIteration:        break
dir() 查看我们数据类型可以执行的操作

二.生成器   生成器本质上也是一个迭代器,特点也是节省空间。通过yield来定义
def func():   yield生成器函数  -> 执行的时候. 不会立即把函数全部执行完. 创建一个生成器返回给你
省内存__next__() 可以拿到数据send() 可以拿到数据, 可以给生成器传递消息 send会给上一个yield传递参数。

普通打印例子:
def order():    lst = []    for i in range(1000):        lst.append("衣服" + str(i))    return lstlst = order()print(lst)     ps:当数据量多大内存容易出问题

生成器例子:
def order():    lst = []    for i in range(100):        yield "衣服" + str(i)

gen = order()print(gen.__next__())   ps:要一个值打印一下next即可,惰性机制的特点。

send应用
def func():    print("韭菜盒子")    s1 = yield 1    print("s1=", s1)    print("沙琪玛")    s2 = yield 2    print("s2=", s2)    print("盒饭")    s3 = yield 3    print("s3=", s3)    print("混沌")    s4 = yield 4gen = func()print(gen.__next__()) # send可以给上一个yield位置传值ret1 = gen.send("周润发")ret2 = gen.send("周杰伦")ret3 = gen.send("周笔畅")print("===============")print(ret1)print(ret2)print(ret3)    ps:send是给上一个yield传值,不能给最后一个yield传值,否则会报错

三.推导式

列表推导式:    [结果 for循环 if语句]
例子1:lst = ["python周末班%s" % i for i in range(1, 27) if i%2==0 ]print(lst)例子2:把姓张的人检索出来, 放在一个新列表里  startswith
lst = ["欧阳娜娜", "张崔猛", "欧阳难过", "张亚无照", "胡一飞", "胡怎么飞", "张炸辉"]print([name for name in lst if name.startswith("张")])

例子3:使用列表推导式得到 [1, 4, 9, 16, 25, 36]print([i*i for i in range(1,7)])
例4在[3,6,9]的基础上推到出[[1,2,3], [4,5,6],[7,8,9]]print([[i-2,i-1,i] for i in [3,6,9]])
字典推导式:    {key:value for if}例1:通过列表推导成字典
lst = ["张三丰", "张无忌", "张翠山"]print({i:lst[i] for i in range(len(lst))})
集合推导式    {key for if}
print({i for i in range(10)})
    没有元组推导式!!!!!!!

生成器表达式:    (结果 for if)
gen = (i for i in range(10))print(gen)for i in gen:    print(i)

四.匿名函数

匿名函数语法:

匿名函:lambda 参数: 返回值   配合内置函数一起使用 不能写太多

      func = lambda x:x*10

  print(func(10))

例1:给函数传递一个参数,返回字符串的长度
lambda args: len(args)

五.内置函数

repr() 字符串表示形式

zip() 拉链函数

sorted() 排序

例子1:

lst = ["高进", "波多野结衣", "苍老师", "仓木麻衣", "红狗"]s = sorted(lst,key=lambda s: len(s))print(s)   ps:首先,打开这个可迭代对象. 然后获取到每一项数据. 把每一项数据传递给函数,根据函数返回的数据进行排序.

例2:按照年龄大小排序
lst = [{"id":1, "name":'alex', "age":18},{"id":2, "name":'wusir', "age":16},{"id":3, "name":'taibai', "age":17}]def func(d):    return d["age"]s = sorted(lst,key=func,reverse=True)print(s)

filter()帅选函数例1:筛选出大于20的数字
st = [18, 22, 66, 35, 1, 48]f = filter(lambda n:n>20,st)for item in f:    print(item)   ps:返回迭代器, 把可迭代对象中的每一项数据交给前面的函数. 由函数决定该数据是否保留

例2:打印大于或者等于18岁的成年人
lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}]

s = filter(lambda n:n["age"]>=18,lst)for i in s:    print(i)

map() 会根据提供的函数对指定序列做映射
lst = [2,5,3,2,4]m = map(lambda n:n*n, lst)for i in m:    print(i)   ps:python2 里面返回来的是列表,python3返回的是迭代器

六.递归

特点:实际上就是函数自己调自己,永远不可能超过1000层

递归死循环

i = 0def func():    global i    i +=i    print("哈哈" ,i)    func()func()

传统的查找方法需要一个个对比很消耗资源
lst = [12,24,53,67,108,267]n = 798for i in range(len(lst)):    if lst[i] == n:        print("I found it")else:    print("didn't find it")
递归用法
def binarySearch(lst, n, left, right):    if left <=right: # 判断是否已经查找完毕        mid = (left+right)//2 #  计算中间        if n > lst[mid]: # 数据比中间大            left = mid + 1 #  做边界拉倒右边            # 进入递归            return binarySearch(lst, n, left, right)        elif n < lst[mid]:            right = mid - 1            return binarySearch(lst, n, left, right)        else:            print("找到了")            return mid    else:        print("没找到")        return -1

lst = [12,24,53,67,108,267]n = 108ret = binarySearch(lst, n, 0, len(lst)-1)print(ret)
二分法,一个最简单的算法,用于查找某个数字
n = 108lst = [12,24,53,67,108,267]left = 0right = len(lst) - 1 # 右边界while left <= right:    mid = (left + right)//2    if n > lst[mid]:        left = mid+1    elif n < lst[mid]:        right = mid-1    else:        print("找到了")        print(mid)        breakelse:    print("没有")  ps:两头掐尾取中间。

七.闭包

作用:在内层函数中使用外层函数的变量

1.保护变量

2.让一个变量常驻内存

定义:

def outer():    a = 10    def inner():        print(a)    return innerouter = outer()outer()查看函数是不是闭包:
def outer():    a = 10    def inner():        print(a)    return innerfn = outer()ret = fn()print(fn.__closure__)

八.装饰器

简洁版语法

def func(fn):    def inner():        print("hahaha")        fn()        print("make a go")    return inner

@funcdef func1():    print("我要离开地球表面")func1()

精版
def func(fn):    def inner(*args,**kwargs):        print("hahaha")        ret = fn(*args,**kwargs)        print("make a go")        return ret    return inner

@funcdef func1(*args,**kwargs):    print("我要离开地球表面")    return "流光幸运刀"ret = func1("我要流光幸运刀")print(ret)

ps:上面的装饰器当用户查看自己的函数时就能看出来就闭包。可以通过如下方法来掩饰
from functools import wrapsdef waiguai(fn):    @wraps(fn )    def inner(*args,**kwargs):        print("开外挂")        ret = fn(*args,**kwargs)        print("结束外挂")        return ret    return inner

@waiguaidef dnf(username,password):    print("starting game")

@waiguaidef king(qq):    print("王者")

dnf1 = dnf("ivy","wang")print(dnf1)king("1327285005")print(king.__name__)
给装饰器传递参数例子1:给装饰器传递一个值如果是True问金老板否则直接直接fn()主要实现原理是先执行@后面的函数然后在执行@,相当于分成两部分来实现。
def outer(flag):    def decoration(fn):        def inner(*args,**kwargs):            if flag:                print("问问金老板去哪儿好")                ret = fn(*args,**kwargs)                print("金老板骗人的")            else:                ret = fn(*args, **kwargs)            return ret        return inner    return decoration

@outer(True)def dating():    print("约帅哥。。。")dating()

print("--------华丽丽的分割线------------")@outer(False)def travel():    print("想想去哪儿。。。")travel()

例子2,日志打印,重要的日志放在一指定的文件下面,不重要的放在默认路径下。
import time

def outer(filename="default.log"):    def decoration(fn):        def inner(*args,**kwargs):            print("打印访问日志" )            with open(filename,mode="a",encoding="utf-8") as f:                f.write("在%s 访问了%s \n" % (time.strftime("%Y-%m-%d %H:%M:%S"),fn.__name__))                ret = fn(*args,**kwargs)            return fn        return inner    return decoration

@outer("func1.log")def func1():    print("Hello everyong I am func1")func1()

@outer()def func2():    print("Hello everyone I am func2")func2()ps: func1的日志打印到func1.log里面,func2的日志打印到default.log 里面,主要基于装饰器传参定义默认参数来实现的。
多个装饰器装饰一个函数
def decoration1(fn):    def inner():        print("before decoration1")        fn()        print("after decoration1")    return inner

def decoration2(fn):    def inner():        print("before decoration2")        fn()        print("after decoration2")    return inner

def decoration3(fn):    def inner():        print("before decoration3")        fn()        print("after decoration3")    return inner

@decoration1@decoration2@decoration3def func():    print("hello I am the real funcation")func()

打印结果

由此可见多个装饰器装饰一个函数的原理,是一层层来实现的,最开始执行的是离函数最近的那个开始的。


转载于:https://www.cnblogs.com/guniang/p/10747394.html

day04 迭代器生成器装饰器相关推荐

  1. 迭代器 生成器 装饰器 匿名函数

    迭代器 生成器 装饰器 匿名函数 #可迭代对象:列表.字典.集合.字符串:能够被for 循环遍历的对象# 数字类型不可迭代:# name="wangyifei"# for i in ...

  2. 迭代器/生成器/装饰器 /Json pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  3. Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...

  4. python学习day-8 迭代器 生成器 装饰器

    http://www.cnblogs.com/linhaifeng/articles/7580428.html 迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代, ...

  5. python迭代器生成器装饰器

    基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...

  6. Python 3 学习——函数扩展and迭代器生成器装饰器

    Python 学习的第九小节 写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享 一.学习笔记 1. 高阶函数 函数名可以作为函数参数输入 .可以进行赋值.还可以作为返回值. 2.作用域 ...

  7. python 生成器装饰器_4.python迭代器生成器装饰器

    基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...

  8. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

  9. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

最新文章

  1. 二级c语言编程题只要得出答案,计算机二级C语言考试编程题题库答案.docx
  2. uboot: RTL8201 100M PHY驱动代码
  3. 【点分治】luoguP2664 树上游戏
  4. c语言实力,排序算法(更新ing)(C语言实现)(认真的不像实力派)
  5. 腾讯云总裁邱跃鹏:新基建最大的改变是从硬件到软件的转变
  6. linux centos history 查看命令历史 显示时间戳
  7. VUE集成Office插件NTKO
  8. 手机怎么下载python呢_安卓手机端怎么安装Python?
  9. 恶魔奶爸语法4-6课
  10. 洛谷P1357 花园(状态压缩+矩阵快速幂)
  11. 【b站雅思笔记】Charlie有好好学习 - 雅思机经8-14
  12. 验证sqlserver 2000 sp4补丁是否安装成功(安装补丁后可以远程访问)
  13. 目标设定使用谷歌Analytics(分析)
  14. 机器学习:从决策树到xgboost
  15. 傻瓜式使用SpringSecurity完成前后端分离+JWT+登录认证+权限控制
  16. 虚幻引擎图文笔记:使用Rider的开发环境配置(5月22日 更新)
  17. 64位多核 MIPS 异常和中断内核代码分析
  18. 攻防世界 lottery (彩票) writeup
  19. php生成PDF使用的类MPDF
  20. 双软企业是高新技术企业吗?

热门文章

  1. 多功能游戏工具箱-Watt Toolkit
  2. [安装] DNT源码安装QA
  3. 如何获取自己键盘上按键的键值(KeyCode)
  4. Python JSON decode和encode
  5. MySQL拼接函数CONCAT的使用心得,OMG
  6. 乐橙播放视频需要插件,如何让用户直接下载插件
  7. cocos2d-x封神榜(1) -- 【研发思路及感想】
  8. 【数据结构与算法】之深入解析“圆形靶内的最大飞镖数量”的求解思路与算法示例
  9. Chrome 及其 插件“个性化设置”备份
  10. 杭电ACM——蝎子搬新家(贪心)