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

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

文章目录

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

函数的定义

Python从入门到实战(四)——函数_第1张图片


函数的调用

一个栗子
输出 “Hello World”
Python从入门到实战(四)——函数_第2张图片


函数的参数

Python从入门到实战(四)——函数_第3张图片


参数的传递过程

Python从入门到实战(四)——函数_第4张图片


参数的形参和实参

Python从入门到实战(四)——函数_第5张图片


参数的返回值

Python从入门到实战(四)——函数_第6张图片


参数的类型

位置参数

Python从入门到实战(四)——函数_第7张图片

关键字参数

Python从入门到实战(四)——函数_第8张图片

默认参数

Python从入门到实战(四)——函数_第9张图片

可变参数

Python从入门到实战(四)——函数_第10张图片

可变关键字参数

Python从入门到实战(四)——函数_第11张图片
Python从入门到实战(四)——函数_第12张图片
Python从入门到实战(四)——函数_第13张图片

强制关键字参数

Python从入门到实战(四)——函数_第14张图片
Python从入门到实战(四)——函数_第15张图片


变量作用域

Python从入门到实战(四)——函数_第16张图片
Python从入门到实战(四)——函数_第17张图片
Python从入门到实战(四)——函数_第18张图片
Python从入门到实战(四)——函数_第19张图片
Python从入门到实战(四)——函数_第20张图片


递归函数

Python从入门到实战(四)——函数_第21张图片
Python从入门到实战(四)——函数_第22张图片


一个栗子
递归求阶乘

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

Python从入门到实战(四)——函数_第23张图片


匿名函数

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

lambda [arg1 [,arg2, ... argN]] : expression

也就是说,lambda用来表示匿名函数,可以传入多个参数,但只能有一个表达式。

Python从入门到实战(四)——函数_第24张图片


举个栗子
写一个函数用于两数相加
普通函数
Python从入门到实战(四)——函数_第25张图片
用匿名函数来写

func = lambda x,y:x+y

可以看到,上面把匿名函数对象赋给一个变量,只要直接调用该对象就可以使用匿名函数。
Python从入门到实战(四)——函数_第26张图片
再举个栗子
将下面的add和sub用匿名函数替代
Python从入门到实战(四)——函数_第27张图片
替代后
Python从入门到实战(四)——函数_第28张图片


优势

  • 不用取名称
  • 可以直接在使用的地方定义
  • 语法结构简单
  • 可以与其它高阶函数联合使用

高阶函数

高阶函数的参数中有函数

map函数

语法

map(function, iterable, ...)

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


reduce函数

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

from functools import reduce

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

语法

reduce(function, iterable[, initializer])

Python从入门到实战(四)——函数_第31张图片


filter函数

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

filter(function, iterable)

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


sorted函数

sorted() 函数对所有可迭代的对象进行排序操作。
语法

sorted(iterable, key=None, reverse=False)

Python从入门到实战(四)——函数_第33张图片
Python从入门到实战(四)——函数_第34张图片


其它常用函数

zip函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

语法

zip([iterable, ...])

Python从入门到实战(四)——函数_第35张图片


any函数

any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,如果是,则返回False,如果有一个为 True,则返回 True

元素除了0、空、FALSE外都算 True

函数等价于

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

Python从入门到实战(四)——函数_第36张图片


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从入门到实战(四)——函数_第37张图片


闭包函数

  1. 存在函数嵌套
  2. 外部函数必须返回内部嵌套函数的函数对象
  3. 内部函数使用了外部函数的局部变量
    Python从入门到实战(四)——函数_第38张图片

装饰器

上面讲了闭包函数,内部函数使用了外部函数的局部变量,在装饰器这里,内部函数使用了外部函数传入的函数。
这样就可以为函数增加一些新的功能,而不用在原本的函数上进行修改。


示例

# 装饰器方案
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从入门到实战(四)——函数_第39张图片
这里还有一个语法糖的概念,就是在要装饰的函数前,加上@装饰函数就可以完成下面等价的功能,对函数进行装饰。

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) # 睡眠3s
    
func1()

Python从入门到实战(四)——函数_第40张图片


如何对有不同参数个数的函数进行装饰
可以使用可变参数,和可变关键字参数

# 装饰器方案
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从入门到实战(四)——函数_第41张图片


如何使装饰器的参数可变
在外面再套一个装饰器

# 装饰器方案
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从入门到实战(四)——函数_第42张图片

你可能感兴趣的:(Python,python,人工智能,list,递归,大数据)