1.函数的参数
Python包括五种函数参数,分别是 位置参数,默认参数,关键字参数,*args,**kwargs
1.1位置参数
def sum_prod(num1, num2):
pass
1.2默认参数:
def sum_prod(num1, num2=0): pass该函数可以使用1到2个参数 如果省略第二个参数num2,函数传递默认值0
注意:位置参数不能放在默认参数后面否则会报错。默认参数后面只能放默认参数
1.3关键字参数
关键字参数忽略输入参数的顺序,甚至可以在调用函数时跳过某些参数 不考虑其位置 调用函数时使用参数名并为其赋值 def sum_func(num1, num2=30,num3=40): print(num1,num2,num3) return num1+num2+num3 print(sum_func(num3=10,num1=20))输出:20 30 10
60
1.4*args
在不知道位置参数的个数时,可以使用*args 他可以被视为一个元祖参数
def sum_func2(a, *args): s1 = a + sum(args) s2 = max(args) - min(args) print(s1) print(s2) sum_func2(10) sum_func2(10, 20) sum_func2(10, 20, 30) sum_func2(10, 20, 30, 40)输出
10
30
60
100
1.5**kwargs
**kwargs 构建键值对字典 **是关键字参数 字典中的关键字与值关联
小总结:args和kwargs名称可以随便使用 重点使用*作为位置参数,**作为关键字参数
2.作用域和命名空间
命名空间是容器,其中包含定义的所有名称(变量/函数/类)。可以在不同命名空间中定义相同名称。名称或变量存在于定义其范围代码的特定区域中。变量/对象之间绑定的信息存储在命名空间中。有3种类型的命名空间或作用域。
(1)内置命名空间:内置命名空间中的内置函数可用于所有应用程序文件或模块。
(2)全局命名空间:全局命名空间包含所有变量、函数,以及单个文件中的可用类。
(3)局部命名空间:局部命名空间是函数中定义的变量。
作用域嵌套,意味着全局命名空间中的局部命名空间嵌套在内置命名空间中。每个
作用域都有其命名空间。
2.1内置命名空间
内置命名空间适用于所有文件和Python模块比如print(),tuple(),type()等内置函数
list1 = [1, 2, 3] tup1 = tuple(list1) print(tup1) print(type(tup1))输出:(1, 2, 3)
<class 'tuple'>
2.2全局命名空间
x = 20 x+=y print(x)输出:NameError: name 'y' is not defined
2.3局部命名空间
x = 20 def print_x(): x = 10 print("局部变量x的值",x) print("全局变量x的值",x) print_x()输出:全局变量x的值 20
局部变量x的值 10x = 20 def print_x(): print("局部变量x的值",x) print("全局变量x的值",x) print_x()输出:全局变量x的值 20
局部变量x的值 20
局部变量,即变量在调用该函数时创建。无论何时调用函数,都会创建新作用域,并将变量分配给该作用域。一旦执行完函数,作用域就消失。在前面的示例代码中,调用函数print_x(),在局部命名空间中找到局部变量x=10并使用。该x值存在函数print_x()中,在该函数执行结束后随函数一起消失。
在函数命名空间中使用全局变量,需要使用该变量的global 关键字来明确只使用全
局变量。
x = 20 def print_x(): global x x = 10 print("局部变量x的值",x) print("全局变量x的值",x) print_x() print("全局变量x的值",x)输出:全局变量x的值 20
局部变量x的值 10
全局变量x的值 10
2.4.匿名函数 关键字lambda
lamda 参数:表达式 对该表达式进行计算并返回结果值
your_age = lambda your_br: 2024-your_br print(your_age(2000))输出:24
result = lambda a,b: a if a > b else b print(result(10,2))输出:10
fllter map 函数对元素进行映射 filter依照函数规则从可迭代对象中选择元素 map 对可迭代对象进行函数的指定操作
num = [1,2,3,4,5] odd_num = list(filter(lambda num: num % 2 != 0, num)) print(odd_num)输出:[1, 3, 5]
pow_value = list(map(lambda num: num ** 2, num)) print(pow_value)输出:[1, 4, 9, 16, 25]
3.函数递归
两个重点 递归终止条件和递归条件
3.1 递归求数的阶乘
def find_factorial(num): if num == 1: return 1 else: return num * find_factorial(num-1) print(find_factorial(5))120
3.2斐波拉契数列
def fibonacci(n): if n == 0: return 0 if n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(6))输出:8
4拓展:
4.1. 函数传递参数中不可变对象和可变对象有哪些区别?
答:将字符串、整数或元组等不变参数传递给函数,则引用传递对象其参数值无法更改,就像按值传递调用。可变对象按对象引用重新传递,其值可以更改
4.2.局部范围嵌套在全局范围内,全局范围嵌套在内置范围为。这句话是什么意思?
变量作用域表示从代码的哪个部分使用程序。变量范围可以是局部,也可以是全局。
局部变量在函数内部定义,全局变量在函数外部定义。局部变量只能在定义它们的函数中访问