python自动化学习笔记之DAY4

一、函数

1、函数的嵌套

      在一个函数的内部,有定义另外一个函数。

      在调用一个函数的过程中,又调用了其他函数。

      def  bar():

             print('from bar')

       def  foo():

             print('from foo')

             bar()

         foo()

二、名称空间

名称空间:存放名字与变量绑定关系的地方

内置名称空间:在Python解释器启动时产生,存放一些Python内置的名字,比如:print、len、type等等。

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

局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间

                         用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效

 

加载顺序:内置——》全局——》局部

名字查找顺序:局部——》全局——》内置

例:

x = 0

def f1():

    x = 1

    def f2():

         x = 2

         def f3():

             x = 3

             print(x)

          f3()

      f2()

f1()

 

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

x = 0

def  f1():

    print(x)

f1()

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

def  f1():

    x = 0

    print(x)

f1()

如果需要把局部变量声明成全局变量,可以使用 globals x

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

 

三、闭包函数:

①、定义在函数内部的函数。

②、包含对外部作用域名字的引用,而不是对全局作用域的引用。

例:

def  f1():

    x = 123

    def  f2():

        print(x)

     return f2

func = f1()

func()

 

四、装饰器:

①、开发封闭原则:对扩展是开发的,对修改是封闭的

②、装饰器:装饰他人的工具,装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象

③、装饰器遵循的原则:不修改被装饰对象的源代码,不修改被调用对象的调用方式

④、装饰器的目的:在遵循装饰器的原则的前提下,为其他新功能函数添加

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

import  time

def  timmer(func):

       def wrapper(*args,**kwargs):

              start=time.time()

               func()

               stop=time.time()

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

        return wrapper()

@timmer

def  index():
       time.sleep(3)

        print('welcome to index')

index()

 

五、迭代器

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

l = ['a','b','c','d']

count = 0

while count < len(l):

       print(l[count])

       count+=1

迭代器:

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

迭代器对象:可迭代对象执行内置的_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       结束

迭代器对象的优点

1、提供了一种统一的(不依赖于索引的)迭代方式

2、迭代器本身,比起其他数据类型更省内存

迭代器对象的缺点

1、一次性,只能往后走,不能回退,不如索引取值灵活

2、无法预知什么时候取值结束,即无法预知长点

 

六、生成器

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

生成器就是迭代器

yield的功能:

1、把函数的结果做成迭代器(以一种优雅的方式封装好_iter_,_next_)

2、函数暂停与在继续运行的状态是有yield控制

g=func()

print(g)

from collections import Iterator

print(isinstance(g,Iterator))

 

print(next(g))

print('======>')

print(next(g))

print('======>')

print(next(g))

print('======>')

print(next(g))

 

yield与return的比较:

相同:都有返回值的功能

不同:return只能返回一次值,而yield可以返回多次值

 

posted @ 2017-07-27 11:40  糖果的海角sky  阅读(116)  评论(0)    收藏  举报