函数使用
变量作用域
-
块级作用域
if True: name = 'xiaoming' # 没有块级作用域 print(name)
-
局部作用域
def test(): a = 10 test() # 局部变量:在函数内部定义的变量,只能在函数内部使用 # print(a)
-
全局作用域
# 全局变量:定义在函数外部的变量,拥有全局的作用 num = 10 def show(): # 函数内部可以使用外部定义的变量 # print(num) # 若想更改外部变量,需要进行global声明 global num # 不能更改外部的全局变量,而是定义了一个局部变量 num = 20 show() print(num)
-
nonlocal使用
def wai(): n = 100 def nei(): # 使用外部函数的局部变量,需要进行声明才可更改 nonlocal n # 内部函数可以使用外部函数的局部变量,但是不能更改 n = 200 print(n) nei() print(n) wai()
匿名函数
-
函数可以像普通变量一样进行赋值
def test(): print('for test') print(test.__name__) # 函数可以像普通变量一样进行赋值 a = test print(a.__name__) a()
-
函数可以作为一个函数的参数
def show(func): func() # 函数作为参数传递 show(test)
-
匿名函数
- 说明:当将函数作为参数传递时,若函数只需要一次,没有必要单独定义函数,可以使用匿名函数解决。
- 格式:
lambda 参数列表: 表达式
- 参数列表与定义函数是一样,可以是多个,多个参数之间使用逗号分隔
- 表达式就是返回值,不需要使用return关键字
- 示例:
lt = [ {'name': 'dahua', 'age': 18, 'height': 165}, {'name': 'erhua', 'age': 16, 'height': 160}, {'name': 'dagou', 'age': 20, 'height': 175}, {'name': 'ergou', 'age': 15, 'height': 155} ] def key(d): return d['height'] # lt.sort(key=key) lt.sort(key=lambda d: d['age']) for i in lt: print(i)
闭包使用
-
定义:具有执行环境的函数
- 外部函数中定义一个内部函数
- 内部函数中使用外部函数的局部变量
- 外部函数将内部函数作为返回值返回
- 此时的内部函数就叫闭包
-
示例:
def wai(n): # 定义内部函数 def nei(): # 内部函数中使用外部函数的局部变量 return n * n # 内部函数作为返回值 return nei f1 = wai(10) f2 = wai(4) print(f1()) print(f2())
装饰器
-
作用:当需要改变一个函数原有的功能时,但是不想/不能改变原来的函数,可以通过装饰器解决
-
使用:
- 装饰器其实就是一个函数,该函数有一个参数(函数类型),返回一个闭包
- 在返回的闭包中调用传递进来的函数,然后在调用函数的前后就可以添加内容
-
示例:
def zhuangshiqi(func): def wrapper(): print('开始装饰') func() print('装饰结束') return wrapper @zhuangshiqi # 相当于执行了:test = zhuangshiqi(test) def test(): print('for test') # t2 = zhuangshiqi(test) # t2() # test = zhuangshiqi(test) test() @zhuangshiqi def demo(): print('原有内容') demo()
-
分类:
- 装饰无参无返回值的函数
def shuai(func): def wrapper(): print('拉风的暴龙眼镜') func() print('鳄鱼牌大头皮鞋') return wrapper @shuai def diaosi(): print('杰哥,屌丝一枚') diaosi()
- 装饰带参无返回值的函数
def zhuangshiqi(func): def wrapper(*args, **kwargs): print('开始装饰') func(*args, **kwargs) print('装饰结束') return wrapper @zhuangshiqi def test(n): print('I like num {}'.format(n)) test(250)
- 装饰带参有返回值的函数
def zhuangshiqi(func): def wrapper(*args, **kwargs): print('开始装饰') ret = func(*args, **kwargs) print(ret) print('装饰结束') return ret return wrapper @zhuangshiqi def add(a, b): return a + b print(add(3, 5))
递归函数(了解)
- 定义:在函数内部调用自己的函数就叫递归函数。
- 组成:
- 函数内部调用自己
- 终止条件(停止调用自己的条件)
- 核心算法
- 特点:
- 代码简介
- 可读性差
- 瞬间占用内存比较大,终止条件出错立即崩溃
- 能不使用就不使用,就是在不得不用的时候再使用(遍历目录)