Python 入门教程(6)函数 | 6.1、函数定义

发布于:2024-10-10 ⋅ 阅读:(19) ⋅ 点赞:(0)


前言:

Python作为一种高级编程语言,以其简洁、易读和强大的功能而广受欢迎。函数作为编程中的核心概念之一,在Python中扮演着至关重要的角色。函数允许你将一段代码封装起来,赋予其名称,并通过参数和返回值来实现代码的复用和模块化。

一、函数定义

1、定义

在Python中,函数通过def关键字来定义。其基本语法如下:

def 函数名(参数列表):  
    """函数文档字符串(docstring),用于描述函数的功能和用法"""  
    函数体  
    return 返回值
  • 函数名: 遵循Python的命名规则,应具有描述性,便于理解函数的功能。
  • 参数列表: 用于接收传递给函数的值,可以包含多个参数,参数之间用逗号分隔。
  • 函数体: 包含执行具体任务的代码块,必须缩进。
  • 返回值: 使用return语句返回结果,可以返回多个值(以元组形式)。如果不显式返回,则默认返回None

2、函数调用

定义函数后,通过函数名加上括号(必要时包含参数)来调用函数。例如:

def greet(name):  
    """打印问候语"""  
    print(f"Hello, {name}!")  
  
greet("Alice")  # 调用函数,输出:Hello, Alice!

3、参数传递

Python的参数传递有两种形式,传不可变对象传可变对象

  • 不可变类型: 类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
  • 可变类型: 类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 中一切都是对象,严格意义不能说值传递还是引用传递,应该说传不可变对象和传可变对象。

示例一:传不可变对象

def ChangeInt( a ):
    a = 10
 
b = 2
ChangeInt(b)
print b # 结果是 2

示例二:传可变对象

def changeme( mylist ):
   "修改传入的列表"
   mylist.append([1,2,3,4])
   print "函数内取值: ", mylist    
   return
 
# 调用changeme函数
mylist = [10,20,30]
changeme( mylist )
print "函数外取值: ", mylist

输出结果

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

4、传递参数的形式

Python函数的参数传递分为位置参数、关键字参数、默认参数、可变参数(*args**kwargs 等几种形式。

4.1、位置参数

按照定义顺序传递参数。

def add(a, b):  
    return a + b  

result = add(3, 5)  # result 为 8

4.2、关键字参数

关键字参数允许在函数调用时,按照参数名来传递值,而不是仅仅依赖参数的顺序。这样做的好处是,即使函数参数很多,或者参数顺序容易混淆,也能准确地传递每个参数的值。语法上,关键字参数在函数调用时,通过参数名=值的形式传递。例如:

def greet(name, greeting="Hello"):  
    print(f"{greeting}, {name}!")  
  
# 使用关键字参数调用函数  
greet(name="Alice", greeting="Hi")  # 输出: Hi, Alice!

即使改变参数的顺序,只要参数名正确,函数仍然能够正确执行:

greet(greeting="Hi", name="Alice")  # 输出: Hi, Alice!

使用过程要注意的问题:

  • 参数名必须匹配: 关键字参数中的参数名必须与函数定义中的参数名完全匹配,否则Python会抛出TypeError异常。
  • 不能重复传递: 同一个参数名不能在函数调用时重复传递,否则会引发TypeError
  • 位置参数与关键字参数混用: 在函数调用时,可以混合使用位置参数和关键字参数,但位置参数必须在关键字参数之前。

4.3、默认参数

默认参数是指在定义函数时,为某些参数指定默认值,使得在函数调用时,如果没有提供这些参数的值,则会使用默认值。默认参数的基本语法是在函数定义时为参数赋值,例如:

def greet(name, message="Hello"):  
    print(f"{message}, {name}!")

使用过程要注意的问题:

  • 必选参数在前,默认参数在后: 在函数定义时,必选参数必须放在默认参数之前。如果默认参数放在必选参数之前,Python解释器会报错。

4.4、可变参数

  • *args 用于传递任意数量的位置参数,以元组形式接收。
  • **kwargs 用于传递任意数量的关键字参数,以字典形式接收。
def print_args(*args):  
    for arg in args:  
        print(arg)  

def print_kwargs(**kwargs):  
    for key, value in kwargs.items():  
        print(f"{key}: {value}")  

print_args(1, 2, 3)  # 输出: 1 2 3  
print_kwargs(a=1, b=2, c=3)  # 输出: a: 1 b: 2 c: 3

5、返回值

函数可以通过return语句返回一个或多个值(从Python 3.6开始支持返回多个值,实际上是返回一个元组)。Python函数可以返回任何类型的数据,包括整数、浮点数、字符串、列表、元组、字典、集合、对象、甚至是另一个函数(即闭包)。如果函数没有显式地返回任何值,那么它默认返回None

def divide(a, b):  
    if b == 0:  
        return "Error: Division by zero"  
    return a / b  
  
result = divide(10, 2)  # result 为 5.0