Jonathan1314

导航

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  阅读(240)  评论(0编辑  收藏  举报