Python|Python从入门到实战(四)——函数

Python从入门到实战(一)——Python基础
Python从入门到实战(二)——程序流程控制
Python从入门到实战(三)——组合数据类型
Python从入门到实战(四)——函数
Python从入门到实战(五)——模块和包
Python从入门到实战(六)——文件
Python从入门到实战(七)——面向对象
Python从入门到实战(八)——异常
Python从入门到实战(九)——多线程
Python从入门到实战(十)——爬虫

文章目录

  • 函数的定义
  • 函数的调用
  • 函数的参数
    • 参数的传递过程
    • 参数的形参和实参
    • 参数的返回值
    • 参数的类型
      • 位置参数
      • 关键字参数
      • 默认参数
      • 可变参数
      • 可变关键字参数
      • 强制关键字参数
  • 变量作用域
  • 递归函数
  • 匿名函数
  • 高阶函数
    • map函数
    • reduce函数
    • filter函数
    • sorted函数
  • 其它常用函数
    • zip函数
    • any函数
    • all函数
  • 闭包函数
  • 装饰器

函数的定义 Python|Python从入门到实战(四)——函数
文章图片

函数的调用 一个栗子
输出 “Hello World”
Python|Python从入门到实战(四)——函数
文章图片

函数的参数 Python|Python从入门到实战(四)——函数
文章图片

参数的传递过程 Python|Python从入门到实战(四)——函数
文章图片

参数的形参和实参 Python|Python从入门到实战(四)——函数
文章图片

参数的返回值 Python|Python从入门到实战(四)——函数
文章图片

参数的类型 位置参数
Python|Python从入门到实战(四)——函数
文章图片

关键字参数
Python|Python从入门到实战(四)——函数
文章图片

默认参数
Python|Python从入门到实战(四)——函数
文章图片

可变参数
Python|Python从入门到实战(四)——函数
文章图片

可变关键字参数
Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

强制关键字参数
Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

变量作用域 Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

递归函数 Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

一个栗子
递归求阶乘
def factorial(n): if n == 1: # 递归结束条件 return 1 else: return n * factorial(n-1) # 向下递归 factorial(10) # 求10的阶乘

Python|Python从入门到实战(四)——函数
文章图片

匿名函数 匿名函数不需要显示地定义函数名,使用 [lambda + 参数 + 表达式],即。
lambda [arg1 [,arg2, ... argN]] : expression

也就是说,lambda用来表示匿名函数,可以传入多个参数,但只能有一个表达式。
Python|Python从入门到实战(四)——函数
文章图片

举个栗子
写一个函数用于两数相加
普通函数
Python|Python从入门到实战(四)——函数
文章图片

用匿名函数来写
func = lambda x,y:x+y

可以看到,上面把匿名函数对象赋给一个变量,只要直接调用该对象就可以使用匿名函数。
Python|Python从入门到实战(四)——函数
文章图片

再举个栗子
将下面的add和sub用匿名函数替代
Python|Python从入门到实战(四)——函数
文章图片

替代后
Python|Python从入门到实战(四)——函数
文章图片

优势
  • 不用取名称
  • 可以直接在使用的地方定义
  • 语法结构简单
  • 可以与其它高阶函数联合使用
高阶函数 高阶函数的参数中有函数
map函数 语法
map(function, iterable, ...)

map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的迭代器。
Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

reduce函数 使用该函数要先从functools模块导入
from functools import reduce

reduce()函数会对参数序列中元素进行累计。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function (有两个参数) 先对集合的第1、2个元素进行操作,得到的结果再与第三个数据用 function函数进行操作,…,一直到最后一个参数被用完,将结果返回。
语法
reduce(function, iterable[, initializer])

Python|Python从入门到实战(四)——函数
文章图片

filter函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的迭代器。
语法
filter(function, iterable)

接受两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 TrueFalse,最后将返回 True 的元素放到新列表中。
Python|Python从入门到实战(四)——函数
文章图片

sorted函数 sorted() 函数对所有可迭代的对象进行排序操作。
语法
sorted(iterable, key=None, reverse=False)

Python|Python从入门到实战(四)——函数
文章图片

Python|Python从入门到实战(四)——函数
文章图片

其它常用函数 zip函数 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
语法
zip([iterable, ...])

Python|Python从入门到实战(四)——函数
文章图片

any函数 any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,如果是,则返回False,如果有一个为 True,则返回 True
元素除了0、空、FALSE外都算 True
函数等价于
def any(iterable): for element in iterable: if element: return True return False

Python|Python从入门到实战(四)——函数
文章图片

all函数 all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True,如果是返回 True,否则返回 False
元素除了是 0、空、None、False 外都算 True
函数等价于
def all(iterable): for element in iterable: if not element: return False return True

Python|Python从入门到实战(四)——函数
文章图片

闭包函数
  1. 存在函数嵌套
  2. 外部函数必须返回内部嵌套函数的函数对象
  3. 内部函数使用了外部函数的局部变量
    Python|Python从入门到实战(四)——函数
    文章图片
装饰器 上面讲了闭包函数,内部函数使用了外部函数的局部变量,在装饰器这里,内部函数使用了外部函数传入的函数。
这样就可以为函数增加一些新的功能,而不用在原本的函数上进行修改。
示例
# 装饰器方案 def pre(func): def wapper_func(): print("Tom said:") func() return wapper_func@pre # 语法糖 def func1(): print('hello, python')@pre def func2(): print('goodbye, python')# func1 = otherfunc(func1) func1()# func2 = otherfunc(func2) func2()

Python|Python从入门到实战(四)——函数
文章图片

这里还有一个语法糖的概念,就是在要装饰的函数前,加上@装饰函数就可以完成下面等价的功能,对函数进行装饰。
func1 = otherfunc(func1)

装饰在实际开发中有什么用
  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备处理
  4. 执行函数后清理功能
  5. 权限校验等场景
  6. 缓存
下面用函数执行时间统计举个栗子
# 函数执行时间统计 import time as t def get_time(func): def new_func(): st = t.time() func() ed = t.time() print("函数执行了%ds"%(ed-st)) return new_func@get_time def func1(): t.sleep(3) # 睡眠3sfunc1()

Python|Python从入门到实战(四)——函数
文章图片

如何对有不同参数个数的函数进行装饰
可以使用可变参数,和可变关键字参数
# 装饰器方案 def pre(func): def wapper_func(*args, **kwargs): print("Tom said:") func(*args, **kwargs) return wapper_func@pre # 语法糖 def func1(name1,name2): print("hello, %s.I'm %s"%(name1,name2))@pre def func2(name): print('goodbye, %s'%name)# func1 = otherfunc(func1) func1('Lily','Tom')# func2 = otherfunc(func2) func2('Lily')

Python|Python从入门到实战(四)——函数
文章图片

如何使装饰器的参数可变
在外面再套一个装饰器
# 装饰器方案 def dc(name): def pre(func): def wapper_func(*args, **kwargs): print("%s said:"%name) func(*args, **kwargs) return wapper_func return pre@dc('Tom') # 语法糖 def func1(name1,name2): print("hello, %s.I'm %s"%(name1,name2))@dc('Kity') def func2(name): print('goodbye, %s'%name)# pre = dc(name) # func1 = pre(func1) func1('Lily','Tom')# pre = dc(name) # func2 = pre(func2) func2('Lily')

【Python|Python从入门到实战(四)——函数】Python|Python从入门到实战(四)——函数
文章图片

    推荐阅读