一、函数的参数
一. 位置参数和关键字参数
根据调用函数的时候实参的提供方式不同来分类的
1. 位置参数: 以’数据1,数据2,数据3,…'形式存在,通过位置来和形参一一对应
2. 关键字参数: 以’形参1一=数据1,形参2=数据2,形参3=数据3,…'形式存在(交换关键字参数位置,不影响结果)
注意:
- 位置参数可以和关键字参数一起用,但是位置参数必须放在关键字参数的前面
- 不管以什么形式传参,都必须保证每个参数都有值
def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')
func1(10,20,30) # a:10, b:20, c:30
func1(20,10,30) # a:20, b:10, c:30
func1(a=10,b=20,c=30) # a:10, b:20, c:30
func1(b=20,a=10,c=30) # a:10, b:20, c:30
func1(10,b=20,c=30) # a:10, b:20, c:30
# func1(10,a=20,c=30) # 报错
# func1(a=10,20,c=30) # 报错
二. 参数默认值
- 在定义函数的时候,可以以’形参名=数据’的方式给参数赋默认值;
- 调用函数的时候有默认值的参数可以不用传参
注意: 定义函数的时候,如果有的函数有默认值,有的没有,没有默认值的参数必须在有默认值的参数前面
def func2(a=1, b=2, c=3):
print(f'a:{a}, b:{b}, c:{c}')
func2() # a:1, b:2, c:3
func2(100) # a:100, b:2, c:3
func2(c=300) # a:1, b:2, c:300
def func3(b, a=1, c=3):
print(f'a:{a}, b:{b}, c:{c}')
func3(200) # a:1, b:200, c:3
三. 参数类型说明
- 可以让形参在函数体中使用的时候有相关代码提示
- 没有默认值的参数直接在参数后加’:类型名’
- 有默认值的参数默认值的类型就是说明的类型
def func4(a:str):
pass
list1 = [
{'a':10, 'b':200},
{'a':100, 'b':'abc'}
]
补充: 通过类型注释,对变量进行类型说明
c = list1[-1]['b'] # type:str
四. 不定长参数(了解)
参数个数不确定
**1. 带*
的不定长参数: **
定义函数的时候在某个参数前加*
,就可以让这个参数同时接受多个实参(只能是位置参数)。
带*
的不定长参数的本质是一个元组,它接收到的所有的实参会成为这个元组的元素。
- 注意:
- 带
*
的不定长参数只能用位置参数传参 - 带
*
的不定长参数前面的定长参数也只能用位置参数传参 - 在带
*
后面的定长参数只能使用关键字参数传参
- 带
2. 带**
的不定长参数
+ 定义函数的时候再某个参数前加**
,就可以让这个参数同时接收多个实参(只能是关键字参数)。
+ 带**
的不定长参数的本质是一个字典,它接收到的所有的关键字参数会成为这个字典的元素。
案例:定义一个函数求多个数的和
def sum2(*nums):
s = 0
for x in nums:
s += x
print(s)
sum2()
sum2(10, 20)
sum2(10, 20, 30)
sum2(1, 23, 4, 5, 90)
def student_info(name, age, *score):
print(score)
student_info('小明', 18, 89)
student_info('小花', 18, 90, 89, 46)
带
*
的不定长参数只能用位置参数传参
def func5(*num):
pass
func5(10, 20, 30)
带
*
的不定长参数前面的定长参数也只能用位置参数传参
def func6(x, y, *num):
print(x, y, num)
func6(10, 20, 67, 34, 56)
在带
*
后面的定长参数只能使用关键字参数传参
def func6(*num, x, y):
pass
func6(10, 20, 30, x=40, y=50)
def func7(a, b, *num, x, y):
pass
形参列表中如果单独出现一个
*
,它的目的只是想要在调用这个函数的时候*
后面的参数必须使用关键字参数,*
前面的参数必须使用位置参数。
def func8(a, *, b):
pass
def func9(**x):
print(x)
func9()
func9(a=10)
func9(a=10, b=20, c=30)
func9(c=90, m=100, e=87, h=56)
*
args,**
kwargs 存在的目的是为了让这个函数在调用的时候可以足够灵活(既可以使用不定个数位置参数,也可以使用不定个数关键字参数,位置参数和关键字参数还可以一起使用。
def func10(*args, **kwargs):
pass
func10(10, 20)
func10(10, 20, 30, 40)
func10(k=100, t=200)
func10(10, 20, a=10, b=30, c=40)
二、函数的返回值
1. 什么是返回值
- 返回值就是从函数内部传递到函数外部的数据(每次函数只能传递一个数据到函数外部)
1. 在函数内部怎么确定函数返回值
-
eturn后面的值就是函数的返回值
- 在函数体实现函数功能的时候,可以在任何你需要的地方(一般在最后)通过return关键字,将需要传递到函数外部的数据作为返回值返回
-
return使用方法: return 需要返回的数据
-
注意:
- return出来可以返回数据,还会提前结束函数(执行函数体的时候只要遇到return整个函数直接结束)
- 如果执行函数体的时候没有遇到return,这个函数的返回值就是None
2. 在函数外部怎么使用函数返回值
- 使用函数调用表达式的值,就是使用函数返回值(函数调用表达式有结果,这个结果就是这次调用函数的时候获得的返回值)
- 返回值能做的事情,函数调用表达式都可以做
return会提前结束函数
def func1():
print('=====')
# return None
for i in range(5):
print(i,'!!!!')
return # 只会打印 ===== 与 0 !!!!
print('+++++')
print('-----')
func1()
案例: 定义函数求任意两个数的乘积以及和
def sum3(num1,num2):
return num1 + num2, num1 * num2
# return 后边的相当于一个元组(没有歧义情况下,括号可以省略),也可以return后跟列表
print(sum3(2,5))
案例: 定义函数求任意两个数的和
def sum2(num1, num2):
return num1 + num2
print(sum2(10, 20))
print(sum2(3,4))
- 返回的值能做到,函数调用表达式都可以做
print(300)
print(sum2(100, 200))
a = 300
b = sum2(100, 200)
list1 = [300,sum2(100, 200)]
print(list1)
print(300 * 2)
print(sum2(100, 200) * 2)
def func2():
return 'abc'
print(func2()[-1]) # c
print(func2().upper()) # ABC
# 例如
reslut = max(10,20,30,5,35,19)
print(reslut)
# name = input('输入名字')
三、变量作用域
- 根据变量作用域(可使用范围)不同,可以将变量分为全局变量和局部变量两种
1. 全局变量
- 全局变量指没有定义在函数或者类中的变量,
- 全局变量的作用域是从定义开始到程序结束。
a是全局变量
a = 10
print(f'在外面使用a:{a}')
for i in range(3):
print(f'在循环中使用a:{a}')
def func1():
print(f'在函数中使用a:{a}')
func1()
x和b都是全局变量
for x in range(3):
b = 2
print(f'循环中使用x和b:{x},{b}')
print(f'循环外使用x和b:{x},{b}')
def func2():
print(f'函数中使用x和b:{x},{b}')
func2()
2. 局部变量
- 定义在函数中的变量就是局部变量,局部变量的作用域是从定义开始到函数结束。(形参是局部变量)
m和n都是局部变量
def func3(m):
n = 100
print(f'在函数使用m和n:{m},{n}')
func3(5)
# print(f'在函数外的m和n:{m},{n}') # 报错!
3. 关键字global
- 如果想要在函数里面定义一个全局变量或者修改一个全局变量的值,需要在函数中使用这个变量前加global进行说明。
num = 19
def func4():
num = 20
print(f'内部函数:{num}')
func4()
print(f'函数外部:{num}')
def func5():
global num
num = 20
global name
name = input('输入姓名:')
func5()
print(f'函数外部num:{num}')
print(f'函数外部name:{name}')