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可以返回多次值
浙公网安备 33010602011771号