目录
函数分为:
- 系统函数,包括内置函数和模块中提供的函数
内置函数:内置函数 — Python 3.13.1 文档
标准模块库:
10. 标准库简介 — Python 3.13.1 文档
11. 标准库简介 —— 第二部分 — Python 3.13.1 文档
模块索引:Python 模块索引 — Python 3.13.1 文档 - 自定义函数
1. 函数内部定义的变量是局部变量。
- 全局变量:在整个程序范围内都可以访问,定义在函数外,拥有全局作用域的变量。
- 局部变量:只能在其被声明的函数范围内访问,定义在函数内部,拥有局部作用域的变量。
a = 10 # 全局变量
def func():
a = 20 # 局部变量
b = 50 # 局部变量
print(a) # 20 局部优先原则
func()
print(b) # err 局部变量在函数外不生效
在函数内部使用global关键字,可以标明指定使用全局变量。
a = 10 # 全局变量
def func():
# global a = 20 # err
global a
a = 20
print(a)
func() # 20
2. 一个文件内出现多个同名函数,则以就近原则进行调用。
def func():
print("hello")
def func():
print("world")
func() # world
3. 函数可以有多个返回值,返回数据类型不受限制。
如果没有return语句或省略返回值,默认返回None,None是内置常量,通常用来代表空置的对象。
def f1():
return 1, 3.0, "haha"
def f2():
return
ret11, ret12, ret13 = f1()
print(ret11) # 1
print(ret12) # 3.0
print(ret13) # haha
ret2 = f2()
print(ret2) # None
4. 函数支持位置参数和关键字参数。
位置参数:根据函数定义的参数位置来传参。
关键字参数:
- 函数调用时,可以通过"形参名=实参值"形式传递参数。
- 这样可以不受参数传递顺序的限制。
def person(name, age, gender):
print(f"{name}-{age}-{gender}")
# 位置参数
person("张三", 20, "男") # 张三-20-男
# 关键字参数
person("张三", gender="男", age=20) # 张三-20-男
5. 函数支持默认参数/缺省参数。
- 定义函数时,可以给参数提供默认值,调用函数时,指定了实参,则以指定为准,没有指定,则以默认值为准。
- 默认参数,需要放在参数列表后。
def person(name, age, gender="女"):
print(f"{name}-{age}-{gender}")
person("李四", 25) # 李四-25-女
6. 函数支持可变参数/不定长参数。
- 应用场景:当调用函数时,不确定传入多少个实参的情况。
- 传入的多个实参,会被组成一个元组。
def sum(*args):
total = 0
# 对args元组进行遍历
for elem in args:
total += elem
return total
print(sum(1)) # 1
print(sum(4, 5, 8)) # 17
7. 函数的可变参数/不定长参数,还支持多个关键字参数。
- 应用场景:当调用函数时,不确定传入多少个实参的情况。
- 传入的多个关键字参数,会被组成一个字典。
def person_info(**args):
# 对args字典进行遍历
for arg_name in args:
print(f"参数名->{arg_name} 参数值->{args[arg_name]}")
person_info(name="张三", gender="男")
person_info(name="李四", age=25, gender="女", height=175)
8. 一个文件中可以调用另一个文件中的函数。
# 假设在calculate.py文件中定义了add函数
# 在当前文件中调用add函数方法如下:
import calculate
calculate.add(1, 2)
9. lambda表达式用于创建匿名函数。
表达式lambda parameters: expression会产生一个函数对象 。 该未命名对象的行为类似于用以下方式定义的函数:
def <lambda>(parameters):
return expression
10. 函数传参类似传地址。
- 不可变数据类型:改变该类型的变量的值,重新开辟内存空间。包括:int, float, bool, string, tuple
- 可变数据类型:改变该类型的变量的值,内存地址不变。包括:list, set, dict
# 不可变数据类型
a = 10
print(f"{a}-{id(a)}") # 10-140712432835288
a = 15
print(f"{a}-{id(a)}") # 15-140712432835448
# 可变数据类型
nums = [1, 2, 3]
print(f"{nums}-{id(a)}") # [1, 2, 3]-140712432835448
nums[0] = "one"
print(f"{nums}-{id(a)}") # ['one', 2, 3]-140712432835448
不可变数据类型变量传参:
def f1(x):
print(f"x改变前, x={x} x的地址={id(x)}")
x = 90
print(f"x改变后, x={x} x的地址={id(x)}")
a = 10
print(f"调用f1前,a={a} a的地址={id(a)}")
f1(a)
print(f"调用f1后,a={a} a的地址={id(a)}")
x的值改变之前,和a的内存地址相同。由于x是int类型,是不可变数据类型,x的值改变后,内存地址发生变化。由于140712432835288这个地址对应的值不变,调用f1后,a的值还是10。
可变数据类型变量传参:
def f2(lst):
print(f"lst改变前,lst={lst} lst的地址={id(lst)}")
lst[1] = 2
print(f"lst改变后,lst={lst} lst的地址={id(lst)}")
nums = ["一", "二", "三"]
print(f"调用f1前,nums={nums} nums的地址={id(nums)}")
f2(nums)
print(f"调用f1后,nums={nums} nums的地址={id(nums)}")
lst的值改变之前,和nums的内存地址相同。由于lst是list类型,是可变数据类型,lst的值改变后,内存地址不变。由于2778033017216这个地址对应的值改变,调用f1后,nums的值就是改变后的值。