【Python基础】函数使用实战操作详解

目录

一、前言

[二、Python 函数介绍](#二、Python 函数介绍)

[2.1 什么是函数](#2.1 什么是函数)

[2.2 函数结构](#2.2 函数结构)

三、函数基本使用

[3.1 函数定义](#3.1 函数定义)

[3.2 函数如何调用](#3.2 函数如何调用)

[3.3 带参数的函数](#3.3 带参数的函数)

[3.4 函数默认参数](#3.4 函数默认参数)

[3.5 关键字参数](#3.5 关键字参数)

[3.6 位置参数与关键字参数对比](#3.6 位置参数与关键字参数对比)

[3.7 可变参数(*args 和 **kwargs)](#3.7 可变参数(*args 和 **kwargs))

[3.8 函数返回值](#3.8 函数返回值)

[3.8.1 返回值return 说明](#3.8.1 返回值return 说明)

[3.8.2 函数返回值特点](#3.8.2 函数返回值特点)

[3.9 函数作用域](#3.9 函数作用域)

[3.10 函数说明文档](#3.10 函数说明文档)

[3.11 函数的参数类型](#3.11 函数的参数类型)

[3.12 匿名函数](#3.12 匿名函数)

[3.12.1 什么是匿名函数](#3.12.1 什么是匿名函数)

[3.12.2 匿名函数特点](#3.12.2 匿名函数特点)

[3.12.3 匿名函数基本语法](#3.12.3 匿名函数基本语法)

[3.12.4 匿名函数带参数](#3.12.4 匿名函数带参数)

[3.12.5 匿名函数与其他内置函数结合使用](#3.12.5 匿名函数与其他内置函数结合使用)

四、写在最后


一、前言

在日常项目开发中,函数(方法)可以说无处不在,使用函数可以为项目的开发带来很多好处,让工程代码变得可维护性更好,本篇将详细介绍一下Python中的函数使用。

二、Python 函数介绍

2.1 什么是函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

2.2 函数结构

在pythno 中,一个完整的函数结构如下:

在自定义函数时,可以参考下面的原则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()

  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

  • 函数的第一行语句可以选择性地使用文档字符串---用于存放函数说明。

  • 函数内容以冒号 : 起始,并且缩进。

  • return 表达式 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

三、函数基本使用

3.1 函数定义

Python 定义函数使用 def 关键字,一般格式如下:

  • 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的
bash 复制代码
def 函数名(参数列表):
    """文档字符串(可选)"""
    函数体
    return 返回值  # 可选

如下定义一个基本的函数并调用:

bash 复制代码
def hello() :
    print("Hello World!")

hello()

def greet():
    """向指定的人打招呼"""
    return "Hello!"

print(greet())

输出结果:

3.2 函数如何调用

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

如下实例调用了 printme() 函数:

bash 复制代码
# 定义函数
def printme( str ):
   # 打印任何传入的字符串
   print (str)
   return
 
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")

注意事项:

  • 函数必须先定义,在调用

  • 函数定义时,并不会执行,只有在调用函数时,函数体的逻辑才会运行

  • 函数中通过缩进来描述归属关系

3.3 带参数的函数

在真实的项目开发场景下,函数使用时一般会带上参数,默认情况下,带有参数的函数在调用时按顺序传入,下面这个函数,比较两个数的大小并输出

bash 复制代码
def max(a, b):
    if a > b:
        return a
    else:
        return b
 
a = 11
b = 21
print(max(a, b))

3.4 函数默认参数

给参数设定一个默认值,外部调用时可省略这个默认参数:

  • 注意:默认参数必须是不可变对象(如None、数字、字符串),不要用列表/字典,否则会有坑

  • 默认参数必须放在没有默认值的参数列表的后面,一个函数在定义时是可以设置多个默认参数的

  • 函数调用时,如果为默认参数传递了值,则会修改默认的参数值;如果没有传递该参数,则直接使用默认值

bash 复制代码
def power(base, exp=2):
    return base ** exp

print(power(3))
print(power(3, 3))

3.5 关键字参数

调用函数时指定参数名,顺序可任意,这种比较灵活:

  • 调用函数时,通过"形参名=值"的形式传递参数,顺序没有要求

  • 如果同时存在位置参数与关键字参数,位置参数在前,关键字参数在后

bash 复制代码
def info(name, age):
    return f"{name} is {age} years old"

print(info(age=25, name="Bob"))

当然也可以混用,参考下面的案例

bash 复制代码
def reg_stu(name, age,gender, city):
    print(f"注册成功,姓名:{name},年龄:{age},性别:{gender},城市:{city}")
    return {"name": name, "age": age, "gender": gender, "city": city}

#传参方式一:位置参数
stu = reg_stu("张三",18,"男","北京")
print(stu)

#传参方式二:关键字参数
stu = reg_stu(name="王林",age=28,gender="男",city="北京")
print(stu)

stu = reg_stu(age=20, gender="女", city="北京", name="李慕婉")
print(stu)

# 传参方式三:位置参数+关键字参数--->位置参数在前,关键字参数在后
stu = reg_stu("李慕婉", 20, gender="女", city="北京")
print(stu)

3.6 位置参数与关键字参数对比

两者对比与适用场景:

  • 一切以代码结构清晰明了(可读性)、便于维护(维护性)为目标

  • 如果参数比较少(不超过3个),可直接使用位置参数

  • 如果参数数量较多,建议使用关键字参数

3.7 可变参数(*args 和 **kwargs)

也叫不定长参数或者可变参数,用于函数定义及调用时参数个数不确定(0个或多个)的场景

  • *args:接收任意数量的位置参数,打包成元组

  • **kwargs:接收任意数量的关键字参数,打包成字典

  • 传递的所有匹配的位置参数都会被args变量收集,这些参数会合并封装为一个元组,args是元组类型(注意并不会封装关键字参数)

  • args只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如*data)

bash 复制代码
def sum_all(*args):
    return sum(args)

print(sum_all(1,2,3,4))  # 10

print()
def show_info(**kwargs):
    for k, v in kwargs.items():
        print(f"{k}: {v}")

print(show_info(name="Tom", city="Beijing"))

如果是不定长参数与关键字参数一起使用,使用形式如下

注意:

  • 参数是以"键=值"形式传递的关键字参数,这些"键=值"参数都会被kwargs接受,并合并封装为一个字典类型

  • kwargs只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 **options)

3.8 函数返回值

在很多情况下,在工程中定义函数的时候是需要返回值的。

3.8.1 返回值return 说明

return 表达式 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

bash 复制代码
# 可写函数说明
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print ("函数内 : ", total)
   return total
 
# 调用sum函数
total = sum( 10, 20 )
print ("函数外 : ", total)

运行结果:

3.8.2 函数返回值特点

对函数返回值来说,具有如下特点:

  • 使用 return 返回结果,可以返回任意类型(数字、字符串、列表、函数等)。

  • 没有 return 或只写 return,函数返回 None

  • 可以返回多个值(实际是返回一个元组):

在下面的函数中,入参是一个列表

bash 复制代码
def get_min_max(lst):
    return min(lst), max(lst)

a, b = get_min_max([1,5,3])  # a=1, b=5

print(a,b)

运行结果如下:

注意:

  • return语句只有返回功能,而没有输出打印的功能,如果要输出,需要结合print()函数来实现

  • 函数可以有多个返回值,多个返回值最终封装到元组中

3.9 函数作用域

变量的作用域指的是变量的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)。

基本特点:

  • 局部变量:在函数内部定义的变量,称之为局部变量,只能在该函数内部使用,外部无法访问(函数执行完毕后,会自动销毁其内部局部变量)

  • 全局变量:在函数之外定义的变量,称之为全局变量,在整个文件中(包括函数内)都可以使用(通常定义在文件的顶部)

比如在下面的函数中,x是一个全局变量,函数内部和外部都可以访问

bash 复制代码
x = 10
print(x)

def change():
    global x
    x = 20
change()

print(x)  # 20

运行结果:

注意事项:

  • 尽量避免在函数中使用全局变量,因为会使代码难以维护和调试

  • 考虑使用函数参数和返回值来传递数据,而不是依赖全局变量

  • global主要用在程序的状态、配置和计数器等场景中

3.10 函数说明文档

函数的说明文档(Docstring)是写在函数开头,用三个引号包裹的字符串,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节。

定义一个带说明的函数

bash 复制代码
def rec(l,r):
    """
    根据长度和宽度,计算长方形面积
    :param l: 长
    :param r: 宽
    :return:
    """
    return l * r

help(rec)

当执行的时候,就可以把这个函数的作用输出出来

3.11 函数的参数类型

函数支持的普通参数包括:数字、布尔、字符串、列表、元组、集合、字典等。也支持特殊的参数:函数,即函数也可以作为参数传入。

在下面的演示代码中,既有普通函数的参数传递,也有函数作为参数的传递

bash 复制代码
def circle_area(r):
    area = 3.14 * r ** 2
    return area

print(circle_area(5))

def calc_score(score_list):
    min_s = min(score_list)
    max_s = max(score_list)
    avg_s = round(sum(score_list) / len(score_list), 1)
    return max_s, min_s, avg_s

s_list = [589, 609, 605, 643, 677, 455, 477, 489, 503]
max_score, min_score, avg_score = calc_score(s_list)

def add (x, y):
    return x + y

def subtract (x, y):
    return x - y

def calc(x,y,oper):
    return oper(x,y)

result = calc(10, 20, add)
print(result)

函数作为参数传递的一个典型场景就是递归,如下:

bash 复制代码
def cal(n):
    if n ==1:
        return 1
    else:
        return n * cal(n-1)

res = cal(5)
print(res)

3.12 匿名函数

3.12.1 什么是匿名函数

Python 中使用 lambda 来创建匿名函数。

  • lambda 函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式。

  • 匿名函数不需要使用 def 关键字定义完整函数。

  • lambda 函数通常用于编写简单的、单行的函数,通常在需要函数作为参数传递的情况下使用,例如在 map()、filter()、reduce() 等函数中。

3.12.2 匿名函数特点

lambda 函数 特点:

  • lambda 函数是匿名的,它们没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。

  • lambda 函数通常只包含一行代码,这使得它们适用于编写简单的函数。

  • 匿名函数中可以返回结果,也可以不返回结果。返回结果时,不需要写return,表达式的运行结果就是要返回的结果。

3.12.3 匿名函数基本语法

lambda 基本格式如下:

bash 复制代码
lambda arguments: expression

参数解释:

  • lambda是 Python 的关键字,用于定义 lambda 函数。

  • arguments 是参数列表,可以包含零个或多个参数,但必须在冒号(:)前指定。

  • expression 是一个表达式,用于计算并返回函数的结果。

下面这个 lambda 函数没有参数:

bash 复制代码
f = lambda: "Hello, world!"
print(f())  # 输出: Hello, world!

3.12.4 匿名函数带参数

带参数的匿名函数更常见,以下实例使用 lambda 创建匿名函数,设置一个函数参数 a,函数计算参数 a 加 10,并返回结果:

bash 复制代码
x = lambda a : a + 10
print(x(5))

lambda 函数也可以设置多个参数,参数使用逗号 , 隔开:

以下实例使用 lambda 创建匿名函数,函数参数 a 与 b 相乘,并返回结果:

bash 复制代码
x = lambda a, b : a * b
print(x(5, 6))

以下实例使用 lambda 创建匿名函数,函数参数 a、b 与 c 相加,并返回结果:

bash 复制代码
x = lambda a, b, c : a + b + c
print(x(5, 6, 2))

3.12.5 匿名函数与其他内置函数结合使用

lambda 函数通常与内置函数如 map()、filter() 和 reduce() 一起使用,以便在集合上执行操作。如下:

bash 复制代码
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

使用 lambda 函数与 filter() 一起,筛选偶数:

bash 复制代码
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出:[2, 4, 6, 8]

下面是一个使用 reduce() 和 lambda 表达式演示如何计算一个序列的累积乘积:

bash 复制代码
from functools import reduce
 
numbers = [1, 2, 3, 4, 5]
 
# 使用 reduce() 和 lambda 函数计算乘积
product = reduce(lambda x, y: x * y, numbers)
 
print(product)  # 输出:120

在上面的实例中,reduce() 函数通过遍历 numbers 列表,并使用 lambda 函数将累积的结果不断更新,最终得到了 1 * 2 * 3 * 4 * 5 = 120 的结果。

补充:什么时候使用匿名 函数

  • 建议使用匿名函数的情况:函数逻辑简单,只在一个地方调用(常作为高阶函数的参数)

  • 建议使用命名函数的情况:函数逻辑复杂,需要多步操作,需要多个地方重复使用或需要加文档说明的场景

四、写在最后

本文通过较大的篇幅详细介绍了Python中函数的使用,希望对看到的同学有帮助,本篇到此结束,感谢观看。

相关推荐
我是小白呀3 年前
【Python 零基础入门】常用内置函数 再探
开发语言·python·python 基础·python 内置函数·python 零基础入门·python 函数