python核心语法04-函数

1.函数:函数是组织好的、可重复使用的、用来实现特定功能的代码片段。

(1)函数定义与调用

定义函数

def 函数名(参数列表):

函数体

......

return 返回值

调用函数 函数名(参数)

python 复制代码
# 定义函数
def out_line():
    print('---------------------------')

# 调用函数
out_line()

# 计算长方形的面积
def rectangle_area(l, w):
    area = l * w
    return area

# 调用函数
r_area = rectangle_area(20, 10)
print(r_area)

函数多个返回值

python 复制代码
def circle_area_len(r):
    return 3.14 * r* r , 2 * 3.14 * r

# 封装到元组中
al = circle_area_len(10)
print(al)

# 元组解包
area, len = circle_area_len(10)
print(area, len)

注意:

(1) 函数定义时的参数列表与返回值语句是可有可无的(由需求确定),函数必须先定义后调用执行(函数定义时,内部代码并未执行,在调用时才执行)。

(2) 函数定义时如果有多个参数,多个参数之间使用逗号(,)分隔 。

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

案例:定义一个函数:计算传入的字符串中元音字母的个数(元音字母为 aeiouAEIOU)

python 复制代码
def count_aeiou(s):
    """
    统计字符串中元音字母的个数
    :param s: 字符串
    :return: 元音字母的个数
    """
    num = 0
    for w in s:
        if w in "aeiouAEIOU":
            num += 1
    return num

print(count_aeiou("Hello Python Hello World OK"))

2.函数说明文档

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

python 复制代码
# 定义一个函数, 根据半径, 计算圆的周长、面积
def circle_area_len(r):
    """
    该函数用于根据圆的半径, 计算圆的面积和圆的周长
    param r: 圆的半径    
    return: 圆的面积 ,圆的周长
    """
    return 3.14 * r * r, 2 * 3.14 * r
al = circle_area_len(10)
print(al)

3.函数的嵌套调用

嵌套调用指的是在一个函数中,又调用了另外一个函数。函数调用遵循栈结构,最后被调用的函数最先返回LIFO(Last In First Out,后进先出)

python 复制代码
def function_a():
    print("a ... before")
    function_b()
    print("a ... after")
def function_b():
    print("b ... before")
    function_c()
    print("b ... after")
def function_c():
    print("c ...")
    function_a()

4.函数变量作用域

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

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

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

python 复制代码
num1 = 1
# 全局变量
def fun1():
    num1 = 100 # 局部变量
    print(num1)
fun1() # 100
print(num1) # 1

num1 = 1
# 全局变量
def fun1():
    global num1
    num1 = 100 # 修改全局变量num1
print(num1)
fun1() # 100
print(num1) # 100

注意:在基于global声明全局变量时,要先声明,再使用。

5.函数传参方式:传参方式指的是,在调用函数时,传递实参的方式。

(1) 位置参数:调用函数时根据函数定义时的位置来传递参数。

要求:调用函数时参数顺序与定义函数时参数顺序完全一致

python 复制代码
# 定义函数
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)

(2) 关键字参数:调用函数时以函数定义时形参名称作为关键字,以 "键=值" 的形式来传递参数(不要求顺序)。

要求:如果位置参数与关键字参数混用, 关键字参数必须在位置参数之后(关键字参数之间,没有顺序要求)

python 复制代码
# 定义函数
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(name="张三", age=18, gender="男", city="北京")
print(stu)
stu2 = reg_stu(gender="男", name="王武", city="上海", age=22)
print(stu2)
stu2 = reg_stu("赵四", 28, gender="男", city="上海")
print(stu2)

(3) 默认参数:默认参数也称为缺省参数,用于在定义函数时,为参数提供默认值,调用函数时,可以不传递有默认值的参数。

python 复制代码
# 定义函数
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("赵四", 22, "男", "深圳")
print(stu)

注意:

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

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

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

  • 位置传递
python 复制代码
# 定义函数
def calc_data(*args):
    min_data = min(args)
    max_data = max(args)
    avg_data = sum(args) / len(args)
    return min_data, max_data, round(avg_data,1)
# 调用函数
data = calc_data(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print(data)
data = calc_data(100, 200, 300, 400, 500)
print(data)

注意:

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

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

  • 关键字传递
python 复制代码
# 定义函数
def calc_data(*args, **kwargs):
    min_data = min(args)
    max_data = max(args)
    avg_data = sum(args) / len(args)
    if kwargs.get('round'):
        avg_data = round(avg_data, kwargs.get('round'))
        return min_data, max_data, avg_data
        
data = calc_data(100, 200, 300, 400, round=2, count=0)
print(data)
data = calc_data(33, 11, 28, 91, 32, 75, 49)
print(data)

注意:

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

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

  1. *args:不定长位置参数,函数调用时,通过位置参数传递多个参数封装到一个元组(tuple)中,*args适用于处理数量不确定的数据

  2. **kwargs:不定长关键字参数,函数调用时,通过关键字参数传递多个参数封装到一个字典(dict),**kwargs适用于处理数量不确定的选项(函数的配置参数,用来定制函数的行为)

python 复制代码
# 定义函数
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)

(5) 参数类型:

普通参数:数字、布尔、字符串、列表、元组、集合、字典等。

特殊参数:函数。

python 复制代码
# 参数类型是函数
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)

6.匿名函数:匿名函数指的是没有名称的函数,需要通过lambda表达式来声明函数,可以简化简单函数的编写(单行表达式)。

python 复制代码
# 定义匿名函数
# lambda 参数列表 : 函数体

lambda : print('-------------------------')
lambda x, y: x + y

计算两个数之和

python 复制代码
def add(x, y):
    return x + y

add = lambda x, y : x + y
print(add(100,200))

注意:

  • 函数逻辑比较简单(单行表达式)且只在一个地方使用时,可以考虑使用匿名函数,简化书写(通常作为高阶函数的参数使用)。

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

6.类型注解:类型注解是Python中的一种语法特性,用于明确标识变量、函数参数和返回值的数据类型,从而使代码更清晰、更安全、更易维护。

python 复制代码
# 定义变量
a: int = 695
score: float = 98.5
hobby: str = "Python"
flag: bool = True
pic: None = None

names: list[str] = ["A", "C", "E"]
phones: set[str] = {"13309091111", "15209109121"}
options: dict[str, int] = {"count": 0, "total": 0}
goods: tuple[str,int,int] = ("手机", 5999, 1)

7.函数类型注解

为函数添加类型注解,其实主要就是为函数的参数和返回值添加类型注解,具体语法如下:

python 复制代码
def calc(scores: list[int]) -> float:
    return sum(scores) / len(scores)
def calc_data(scores: list[int]) -> tuple[int, int, float]:
    max_v = max(scores)
    min_v = min(scores)
    avg_v = sum(scores) / len(scores)
    return max_v, min_v, avg_v

注意:对于需要团队协作开发和长期维护的项目,推荐使用类型注解

相关推荐
重生之我是Java开发战士2 小时前
【笔试强训】Week1:点击消除,数组中两个字符串的最小距离,dd爱框框,腐烂的苹果,大数乘法
java·开发语言·算法
独特的螺狮粉2 小时前
开源鸿蒙跨平台Flutter开发:地震震源探测系统-地震波形与波干涉渲染架构
开发语言·flutter·华为·架构·开源·harmonyos
牧瀬クリスだ2 小时前
优先级队列——堆
java·开发语言·数据结构
rit84324992 小时前
基于NSGA-II的多目标优化算法(MATLAB实现)
开发语言·算法·matlab
小碗羊肉2 小时前
【从零开始学Java | 第三十篇】不可变集合
java·开发语言
asdzx672 小时前
C#:通过模板快速生成 Word 文档
开发语言·c#·word
专注VB编程开发20年2 小时前
Delphi 的VCL控件库无法公开给其他编程语言调用
开发语言·delphi
charlie1145141912 小时前
现代Qt开发——0.1——如何在IDE中配置Qt环境?
开发语言·c++·ide·qt·嵌入式
游乐码2 小时前
c#StringBuilder
开发语言·c#