Python基础理论 - 函数
函数是第一类对象:可以当做数据来传
1. 可以被引用
2. 可以作为函数参数
3. 可以作为函数返回值
4. 可以作为容器类型的元素
小例子:
def func1(): print('func1') def func2(): print('func2') dic = { 'func1':func1, 'func2':func2, } func = dic.get('func1') func()
名称空间:名字与值的绑定关系,时刻记得左面有一根竖线,标识着作用域的不同
何时生效、何时失效,定义名字的方法
局部空间、全局名称空间、内置名称空间
作用域:用的时候,查找的范围
locals()
glocals(),系统变量__name__, __file__, __doc__
全局作用域:全局有效,在任何位置都可以被访问到,除非被删除,否则存活到文件执行结束
局部作用域:局部有效,只能在函数内部被访问,在函数执行结束后,就释放了
闭包
1. 定义在函数内部的函数
2. 该内部函数包含对外部作用域而不是全局作用域的引用
def func1(): x = 1 def func2(): print(x) return func2 func = func1() func()
特性:携带自己的作用域,先执行。包裹着一层
应用场景:爬虫、装饰器
装饰器
开放封闭原则,对扩展开放,对修改封闭
什么是装饰器:
装饰别的东西的工具:
装饰器本身 ---> 任意可调用的对象,如函数
被装饰对象 ---> 任意可调用的对象,如函数
装饰器要遵循的原则
1. 不修改被装饰对象的源代码
2. 不修改被装饰对象的调用方式
即定义和调用都不能修改
@deco # func = deco(func) def func(): pass @deco1 @deco2 def func(): pass @deco(x) # 装饰器也是函数,(),先调用,拿到结果@res在func的正上方 def func(): pass
迭代器
迭代:重复上一次过程,每一次迭代都基于上一次执行地结果而继续进行
如写文档,保存,再修改
可迭代对象:obj.__iter__方法
可迭代对象 执行__iter__方法 ---> 迭代器
迭代器对象:
obj.__iter__方法
obj.__next__方法
为何要有迭代器:
提供一种不依赖于索引的迭代方式
如文件、集合、字典都可以被迭代
# for 循环原理 for i in obj: pass # 先执行,obj.__iter__方法,再next()
迭代器优缺点:
优点:
1. 提供一种不依赖于索引的迭代方式
2. 内存中只有一个值,节省内存
缺点:
1. 无法获取长度
2. 一次性,只能前进,不能后退
生成器
函数体内含有yield关键字,那该函数的执行结果是生成器对象
生成器对象本质就是迭代器,所以yield的功能是
1. 把函数的执行结果做成迭代器
2. 可以返回多次值,而return只能返回一次值
3. 暂停函数的运行,保存上下文信息
如模拟管道
yield 的语句形式: yield 1
yield的表达式形式:x = yield
food = yield food_list # 暂停、获取send赋值给food、返回food_list
内置函数
数值类:
abs()、round()、divmod()、pow()
bin()、oct()、hex()
chr()、ord()
max()、min()、sum()
变量判定:
id()、type()
数据类型 工厂函数:
dict()、int()、float()、str()、set()、list()
功能型函数:
print()、input()、len()、__import__()、sorted()、reversed()
enumarate()、range()
匿名函数相关:
f = lambda x, y: x+y print(f) res = f(1,2) print(res)
""" 1. 没有名字,使用完立刻回收 2. 有参数、有返回值 3. 场景逻辑简单 """
zip()
max(*args, key=None)
sorted(*args, **kwargs)
函数式编程:
map(func, *iterables) # func遍历操作可迭代对象
from functools import reduce
reduce(function, sequence, initial=None)
filter(func, *iterables) # 过滤func为True
面向对象:
property()、staticmethod()、classmethod()
hasattr()、getattr()、setattr()、delattr()
issubclass()、isinstance()
super()
posted on 2017-10-31 18:27 Jonathan1314 阅读(243) 评论(0) 编辑 收藏 举报