【Python语法基础学习笔记】函数定义与使用
前言
此系列笔记是拨珠自己的学习笔记,自用为主,学习请移步其他大佬的专门教程。
基本信息
函数:组织好的,可重复使用的,用来实现特定功能的代码块
定义格式:
def 函数名(参数列表):函数体
调用:
返回值 = 函数名(输入参数)
例题1
阶乘之和
题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)S=1!+2!+3!+⋯+n!(n≤50)。
其中“!”表示阶乘,例如:5!=5×4×3×2×15!=5×4×3×2×1。
输入描述
输入一个正整数 n。
输出描述
输出一个正整数 S,表示计算结果。
def factorial(n):ans = 1for i in range(1,n+1):ans = ans * ireturn ansn = int(input())
ans = 0for i in range(1,n+1):ans += factorial(i)print(ans)
传参机制
实参与形参
实际参数:调用函数时传递的参数
形式参数:定义函数时传递的参数
值传递
函数中的形式参数变化,不会导致实际参数的变化,这是由于传递的数值是单方向的,参数为不可变类型(字符串、数字、元组)
引用传递
函数的形参变化会导致实参一起变化,参数是可变类型(列表、字典)
传参技巧
大多是情况下,尽量不要传递列表、字典,即使传参也尽量不要改动
不改动可变类型的技巧:传递列表、字典这类变量时传递一个副本(x[:]或x.copy())。
位置参数
位置参数:按顺序传值,必须传对数量和顺序
例:add(2, 3)
中 2 和 3 按顺序对应参数 a 和 b
关键字参数
关键字参数:用参数名=值
传值,顺序可打乱
例:add(b=3, a=2)
明确指定参数值,结果和上面一样
默认参数
默认参数:函数定义时设默认值,调用时可省略
例:def greet(name="朋友")
,调用greet()
时用默认值 "朋友"
三者优先级
函数调用时,参数优先级遵循 “位置参数> 关键字参数” 的核心规则,同时默认参数仅在 “未通过前两种方式传值” 时生效,具体优先级顺序和约束如下:
最高优先级:位置参数
必须先传所有无默认值的位置参数,且严格按函数定义的顺序传递,不能跳过或乱序。
例:def func(a, b): ...
,调用时func(1, 2)
(1→a,2→b)是唯一正确的位置传参方式。次高优先级:关键字参数
位置参数传完后,可用参数名=值
传参,顺序可打乱,但不能重复给同一参数传值(位置已传的参数,关键字不能再传)。
例:func(a=1, b=2)
或func(b=2, a=1)
均有效;但func(1, b=2)
正确(位置 + 关键字),func(a=1, 2)
错误(关键字不能在位置前)。最低优先级:默认参数
仅当参数未通过 “位置” 或 “关键字” 传值时,才自动使用函数定义时的默认值。
例:def func(a, b=0): ...
,调用func(5)
时,b 未传值,自动用默认值 0;若调用func(5, 3)
或func(5, b=3)
,则 b 用传入的 3。
一句话总结:先按顺序传完位置参数,再用关键字参数补充 / 调整(不重复),没传值的默认参数最后用预设值。
不定长参数
不定长参数是函数定义中用来接收不确定数量参数的方式,主要有两种形式:
*args:接收任意数量的位置参数,会把参数打包成一个元组(tuple)
def sum_numbers(*args):return sum(args) # args是元组,如(1,2,3)sum_numbers(1,2,3) # 输出6 sum_numbers(10,20) # 输出30
**kwargs:接收任意数量的*关键字参数 **,会把参数打包成一个字典(dict)
def show_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")show_info(name="小明", age=18) # 输出name: 小明,age: 18
使用场景:当不确定函数会接收多少参数时使用,比如处理动态数据、配置项等。两种形式可以同时使用,但顺序必须是:位置参数 → *args → **kwargs。
变量作用域
作用域:变量的有效范围
局部变量:函数内部的变量,仅作用于函数内部。
全局变量:函数外部的变量,作用于全局。
global声明
在函数内部定义变量前加上global,函数内部将调用全局变量
例子
# 定义全局变量
count = 0def add_count():# 声明要使用全局变量countglobal count# 修改全局变量的值count += 1print(f"函数内:count = {count}")# 调用函数
add_count() # 输出:函数内:count = 1
add_count() # 输出:函数内:count = 2# 查看全局变量的变化
print(f"函数外:count = {count}") # 输出:函数外:count = 2