博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day4 函数的包装+装饰器+迭代器
阅读量:6834 次
发布时间:2019-06-26

本文共 2327 字,大约阅读时间需要 7 分钟。

1.函数嵌套:在调用一个函数的过程中,由调用了其他函数

列子:

   def father(name):

     print('from father %s' %name)

     def son():

         print('from son')

         def grandson():

             print('from grandson')

         grandson()

     son()

 

father("nihao")

2. 闭包函数: 定义在函数内部的函数 包含对外部作用域名字的引用,而不是对全局作用域名字的引用

列子:

  def father(name):

    def son():

        # name='alex'

        print('我爸爸是 [%s]' %name)

        def grandson():

            # name='wupeiqi'

            print('我爷爷是 [%s]' %name)

        grandson()

    son()

 

father("成龙")

3.名称空间 函数加载顺序:

 3.1名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

 3.2:内置名称空间:在python解释器启动时产生,存放一些python内置的名字

 3.3:全局名称空间:在执行文件时产生,存放文件级别定义的名字

 3.4:局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,名字在函数调用时生效,在函数调用结束后失败;函数加载顺序:内置---》全局---》局部  ;函数的调用顺序:局部-》全局-》内置

实例:

max=1

def foo():

    max=2

    print(max)

 

foo()

 

4.作用域: 全局作用域:全局存活,全局有效:globals()

max=1111111

def f1():

    def f2():

        def f3():

            def f4():

                # print(x)

                print(max)

            f4()

        f3()

    f2()

f1()

 

4.1 局部作用域:临时存活,局部有效:locals()

例子: 让局部变量在全局生效

x=1

def f1():

    global x

    x=2

 

f1()

print(x)

例子:局部生效

def func():

    count = 1

    def foo():

        nonlocal count

        count = 12

    foo()

    print(count)

func()

4.2. 作用域关系,在函数定义时就已经固定,于调用位置无关,在调用函数时,必须必须必须回到函数原来定义的位置去找作用域关系

列子:

x=1

def  f1():

    def f2():

        print(x)

    return f2

4.3

 

5.装饰器

 5.1 开放封闭原则:对扩展是开放的,对修改是封闭;装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象;

 5.2  不修改被装饰对象的源代;不修改被调用对象的调用方式;为其他函数添加新功能

 5.3 装饰器名,必须写在被装饰对象的正上方,并且是单独一行

列子:

import time

 

def timmer(func):

    # func=index

    def wrapper():

        start=time.time()

        func()

        stop=time.time()

        print('run time is %s' %(stop-start))

    return wrapper

 

 

@timmer # index=timmer(index)

def index():

    time.sleep(3)

    print('welcome to index')

@timmer # home=timmer(home)

def home():

    time.sleep(2)

    print('welcome to home page')

 

index()

home()

 

6.迭代器:

 6.1:迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来

 6.2: 可迭代对象iterable:凡是对象下有__iter__方法:对象.__iter__,该对象就是可迭代对

 6.3: 代器对象:可迭代对象执行内置的__iter__方法,得到的结果就是迭代器对象

 例子:

dic={'name':'egon','sex':'m',"age":18}

 

i=dic.__iter__()

# print(i) #iterator迭代器

 

# i.__next__() #next(i)

print(next(i))

print(next(i))

print(next(i))

print(next(i)  #StopIteration  没有值的情况执行 不会出现爆粗:

迭代器对象的优点;提供了一种统一的(不依赖于索引的)迭代方式 迭代器本身,比起其他数据类型更省内存

迭代器缺点:一次性,只能往后走,不能回退,不如索引取值灵活;无法预知什么时候取值结束,即无法预知长度

 

7.生成器:

 在函数内部包含yield关键,那么该函数执行的结果是生成器,生成器就是迭代器

 yield的功能:

 把函数的结果做生迭代器(以一种优雅的方式封装好__iter__,__next__) 函数暂停与再继续运行的状态是由yield

例子:

def my_range(start,stop):

    while True:

        if start == stop:

            raise StopIteration

        yield start #2

        start+=1 #3

 

g=my_range(1,3)

print(next(g))

转载于:https://www.cnblogs.com/wangshaojie/p/7230367.html

你可能感兴趣的文章
getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
查看>>
退出Activity(转)
查看>>
前端开发者喜欢的20个学习文档和指南
查看>>
“超级课程表”余佳文:初生牛犊不怕虎
查看>>
php 不依赖数据实现删除图片,核心代码
查看>>
[翻译]:SQL死锁-锁的类型
查看>>
web.xml 详细介绍
查看>>
[转]Why Not Paxos
查看>>
C# 反射 通过类名创建类实例
查看>>
VC中获取窗体句柄的各种方法
查看>>
jsp各部分编码的含义
查看>>
知方可补不足~Sqlserver中的几把锁和.net中的事务级别 回到目录
查看>>
【高德地图API】那些年我们一起开发的APP—即LBS应用模式分享
查看>>
通过广播来监听屏幕点亮和关闭状态
查看>>
Cocos2dx引擎10-事件派发
查看>>
基于jQuery的宽屏可左右切换的焦点图插件
查看>>
IT技术需求建立时需考虑的因素
查看>>
猛醒:也许我们一生追求的都错了!
查看>>
IDDD 实现领域驱动设计-理解领域和子域
查看>>
GitHub基本操作
查看>>