函数使用

变量作用域

  • 块级作用域
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))

递归函数(了解)

  • 定义:在函数内部调用自己的函数就叫递归函数。
  • 组成:
  • 函数内部调用自己
  • 终止条件(停止调用自己的条件)
  • 核心算法
  • 特点:
  • 代码简介
  • 可读性差
  • 瞬间占用内存比较大,终止条件出错立即崩溃
  • 能不使用就不使用,就是在不得不用的时候再使用(遍历目录)