python基础语法复习04——函数

python基础语法目录

python基础语法01——基本类型
python基础语法02——复合类型
python基础语法03——语句构成


文章目录

  • python基础语法目录
  • 一、初识函数
    • 1.定义
    • 2.调用
  • 二、函数的传参
    • 1.位置传参
    • 2.关键词传参
    • 3.参数默认值
    • 4.可变位置参数
    • 5.可变关键词参数
    • 6.参数解包
    • 7.值传递与引用传递
  • 总结


一、初识函数

函数是Python中可重复使用的代码块,用于执行特定任务。通过将代码封装为函数,可以提高代码的可读性、可维护性和复用性。函数在程序设计中扮演着重要角色,能够减少代码冗余并提升开发效率。

1.定义

  • 使用def 语句定义一个函数a
def function_name(parameters):
    # 函数体
    return result  # 可选的返回值

说明

  1. def:用于声明一个函数,告诉 Python 这是一个函数的定义。
  2. *unction_name:函数名,一个有效的标识符,规则和变量名一致。
  3. parameters:形参,可以是0 ~ n 个,参数之间用逗号分隔。
  4. 函数体:定义函数执行的具体操作。
  5. return:指定函数的返回值,没有则返回None。
  6. return之后的代码不会执行。

2.调用

  • 语法
函数名(实际调用传递参数)

函数调用是一个表达式,可以直接参与运算

二、函数的传参

1.位置传参

最常见的传参方式,参数按定义的顺序依次传入函数。

def greet(name, age):
    print(f"Hello, {name}. You are {age} years old.")

greet("Alice", 30)  		# 输出: Hello, Alice. You are 30 years old.

2.关键词传参

通过指定参数的名称来传值,无顺序限制,代码可读性较高。

def greet(name, age):
    print(f"Hello, {name}. You are {age} years old.")

greet(age=30, name="Alice")  # 输出: Hello, Alice. You are 30 years old.

3.参数默认值

通过指定参数的名称来传值,无顺序限制,代码可读性较高。

def greet(name, age=25):
    print(f"Hello, {name}. You are {age} years old.")

greet("Alice")       # 输出: Hello, Alice. You are 25 years old.
greet("Bob", 30)     # 输出: Hello, Bob. You are 30 years old.

4.可变位置参数

使用 ∗ a r g s *args args 可让函数接受任意数量的位置参数。 ∗ a r g s *args args 会将多余的位置参数收集成一个元组。

def sum_numbers(*args):
    return sum(args)

print(sum_numbers(1, 2, 3))     # 输出: 6
print(sum_numbers(1, 2, 3, 4))  # 输出: 10

5.可变关键词参数

使用 ∗ ∗ k w a r g s **kwargs kwargs 可以让函数接受任意数量的关键词参数。 ∗ ∗ k w a r g s **kwargs kwargs 会将多余的关键词参数收集成一个字典。

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

print_info(name="Alice", age=30)
# 输出:
# name: Alice
# age: 30

在函数调用时,可以混合使用位置参数和关键词参数,但位置参数必须放在关键词参数前面。

6.参数解包

Python 允许在调用函数时解包序列或字典,使其作为位置参数或关键词参数传递给函数。

  • 解包位置参数,使用 ∗ * 解包
def greet(name, age):
    print(f"Hello, {name}. You are {age} years old.")

args = ["Alice", 30]
greet(*args)  # 输出: Hello, Alice. You are 30 years old.
  • 解包关键词参数,使用 ∗ ∗ ** 解包
def greet(name, age):
    print(f"Hello, {name}. You are {age} years old.")

kwargs = {"name": "Alice", "age": 30}
greet(**kwargs)  # 输出: Hello, Alice. You are 30 years old.

7.值传递与引用传递

在 Python 中,实参可以是可变类型或不可变类型。它们的区别主要体现在值传递引用传递的行为上。

  • 值传递

不可变类型包括: i n t 、 f l o a t 、 s t r 、 t u p l e 、 f r o z e n s e t int、float、str、tuple、frozenset intfloatstrtuplefrozenset 等。 传递方式是值传递
传递给函数的是该对象的值,函数内部修改该值不会影响外部变量的值。

def modify(x):
    print('修改之前:', x, id(x))
    x = 10  		# 修改了 x 的值,但不会影响外部变量
    print('修改之后:',x, id(x))

a = 5
modify(a)
print('原始数据:',a, id(a))

# 修改之前: 5 140722275297848
# 修改之后: 10 140722275298008
# 原始数据: 5 140722275297848
  • 引用传递

可变类型包括: l i s t 、 d i c t 、 s e t list、dict、set listdictset 等。这些类型的对象可以在原地修改。 传递方式是引用传递
:传递给函数的是对象的引用(即内存地址),在函数内部修改该参数的内容会直接影响外部变量。

def modify(lst):
    print('修改之前:', lst, id(lst))
    lst.append(4)  # 修改了 lst 对象的内容
    print('修改之后:',lst, id(lst))

a = [1, 2, 3]
modify(a)
print('外部原始数据:',a, id(a)) 

# 修改之前: [1, 2, 3] 2123053058816
# 修改之后: [1, 2, 3, 4] 2123053058816
# 外部原始数据: [1, 2, 3, 4] 2123053058816
  • 拷贝
    若引用传递时,想要传入的参数的副本,可以对参数进行拷贝。

列表:使用 lst.copy() 或切片 lst[:] 来创建一个副本。
字典:使用 dict.copy()copy.deepcopy() 来进行深拷贝。
元组:推荐用tuple创建新的元组,虽然本身就是不可变。


总结

以上就是本文的全部内容,本文仅仅简单介绍了python的函数及其参数传递,但实际上,Python的函数机制更深入,包括位置参数、关键字参数、默认参数和可变参数(如*args和**kwargs)。参数传递采用对象引用方式,函数内部对可变对象的修改会反映到外部。掌握这些概念能提升代码灵活性和效率,建议通过实际项目练习来深化理解。

你可能感兴趣的:(python,python)