1.函数嵌套:在调用一个函数的过程中,调用了其他函数
def f1(): x=1 def f2(): print('from f2') f2()f1()
2.名称空间与作用域
a. 名称空间:存放名字与变量值绑定关系的地方
(1)内置名称空间:在python解释器启动时产生,存放一些python内置的名字
(2)全局名称空间:在执行文件时产生,存放文件级别定义的名字。
(3)局部名称空间:在执行过程中,如果调用了该函数则会产生该函数的局部名称空间。在调用该函数的时候生效,调用结束时失效
加载顺序: 内置----> 全局 ----> 局部
查找顺序: 局部-----> 全局-----> 内置
x=0def f1(): x=1 def f2(): x=2 def f3(): x=3 print('f3中x是 ',x) f3() f2() print('f1中x是 ',x)f1()
b.作用域:
(1)全局作用域:全局存活,全局有效。
(2)局部作用域:局部存活,局部有效。
(3)作用域关系是在函数定义阶段就已经固定,与函数调用位置无关
x=1def f1(): def f2(): print(x) return f2def f3(func): x=2 func()f3(f1())
3.闭包函数
(1).定义在函数内部的函数
(2).包含对外部作用域的引用,而不是对全局作用域的引用。就可以称为闭包函数。
例子:
x=1def f1(): x=11111111111 def f2(): print(x) return f2func=f1()func()f2就是闭包函数
=====================================
eval 的用法:
将字符串中包含的字段单独拿出来执行一下。
dic='{"name":"user01","age":"18"}'print(type(dic))dic=eval(dic)print(type(dic))
====================================
4.装饰器
(1).装饰器遵循的原则:a.不修改被装饰对象的源代码。b.不修改被调用对象的调用方式。
(2).装饰器的目的:为其他函数添加新功能。
## 装饰器必须写在被装饰对象的正上方,并且是单独一行。
装饰器框架:
def timer(func): def wrapper(): func() return wrapper
加上参数:
def timer(func): def wrapper(*args,**kwargs): func(*args,**kwargs) return wrapper
例子:
(无参)
import timedef timmer(func): 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')
例子:
(有参)
import timedef timmer(func): def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print('run time is %s' %(stop-start)) return res return wrapper@timmer # index=timmer(index)def index(): time.sleep(3) print('welcome to index') return 123@timmer # home=timmer(home)def home(name): time.sleep(2) print('welcome %s to home page' %name)
5.迭代器 iterator
可迭代对象:凡是对象下有__iter__ 方法的都是可迭代对象。
迭代器对象:可迭代对象执行内置的__iter__方法,得到的结果就是迭代器对象。
迭代器对象的优点:
(1).提供了一种统一的(不依赖索引)的迭代方式
(2).迭代器本身,比其他数据类型更省内存。
缺点:
(1).一次性,只能向后取值,不能回退,不如索引取值灵活;
(2).无法预知下一次取值什么时候结束,无法预知长度。
例子:
l=['a','b','c','d']i=iter(l)print(next(i))print(next(i))print(next(i))
6.生成器 generator
(1). 在函数内部包含yield关键字,那么该函数的执行结果是生成器。
(2).生成器就是迭代器。
yield的功能
1.把函数的结果做成迭代器。
2.yeild可以保存函数暂停与再继续的状态。
def func(): print('first') yield 11111111 print('second') yield 2222222 print('third') yield 33333333 print('fourth')g=func()print(g)next(g)next(g)
7.三元表达式、列表解析、生成器表达式。
三元表达式:
例子:
name='user01'print('hello' if name == 'user01' else 'error!!!')
列表解析:
例子:
l=['user%s' %i for i in range(10) if i >=5]print(l)
生成器表达式:
生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的
例子:
g=('user%s' %i for i in range(1000))print(g)print(next(g))print(next(g))print(next(g))