函数使用
变量作用域
- 块级作用域
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))
递归函数(了解)
- 定义:在函数内部调用自己的函数就叫递归函数。
- 组成:
- 函数内部调用自己
- 终止条件(停止调用自己的条件)
- 核心算法
- 特点:
- 代码简介
- 可读性差
- 瞬间占用内存比较大,终止条件出错立即崩溃
- 能不使用就不使用,就是在不得不用的时候再使用(遍历目录)