函数的作用就是把相对独立的某个功能抽象出来,使之成为一个独立的实体。
1. 函数的定义
👇
def 函数名(参数):
内容
返回值
- 函数名:以字母或下划线开头,后面可以跟字母、数字或下划线。区分大小写。
- 参数:调用一个函数时可以传递的参数。参数可以有一个或者多个,也可以没有参数。
- 内容:任何有效的代码都可以出现在函数内部。注意该内容相对于“def”有一个缩进。
- 返回值:函数执行完成后返回的值。也可以不返回任何内容,不返回可以视为返回的是“None”。
例如,👇:
def say(name):
print("hey",name)
say("man")
#hey man
2. 函数参数
必须参数
调用该函数时必须传递函数定义的参数,并且在调用的时候传入参数的数量和顺序必须和定义函数时的参数保持一致,例如👇:
def add(a,b):
print(a + b)
add(1,2)
#3
add(1)
#TypeError: add() missing 1 required positional argument:'b'
add(1,2,3)
#TypeError: add() take 2 positional arguments but 3 were given
关键字参数
不按函数定义的参数顺序来调用,例如👇:
def add(a,b):
print(a + b)
add(b = 2,a = 1)
#3
默认参数
定义函数时可以给参数添加默认值,若调用的时候没有传入参数,函数就使用默认值,例如👇:
def add(a,b = 2):
print(a + b)
add(2)
#4
add(2,1)
#3
注意❗️:默认参数必须定义在最后,若有参数定义在默认参数之后系统会报错。
可变参数
定义👇:
def 函数名(*args,**kwargs)
a r g s args args和 k w a r g s kwargs kwargs就是两个可变参数。 a r g s args args全拼是 a r g u m e n t s arguments arguments,就是参数的意思,而 k w a r g s kwargs kwargs全拼是 k e y w o r d a r g u m e n t s key~word~arguments key word arguments,意为关键字参数。下面举例说明👇:
a
r
g
s
args
args
先看例子👇:
def add(*args):
print(args)
add(1)
#(1)
add(1,2)
#(1,2)
add('a','b','c')
#('a','b','c')
由此可以看见,向 a r g s args args参数传参获得到的是一个元组,而 a r g s args args就是元组名。相当于传了一个元组进去。
k
w
a
r
g
s
kwargs
kwargs
看例子👇:
def add(**kwargs):
print(kwargs)
add()
#{}
add(a = '1')
#{'a':'1'}
add(b = '2')
#{'b':'2'}
由此可以看见,向 ∗ ∗ k w a r g s **kwargs ∗∗kwargs参数传参获得到的是一个字典,而 k w a r g s kwargs kwargs就是一个字典名。相当于传进去了一个键值对。
再看一个具体应用👇:
def add(*args,**kwargs):
s = 0
for i in args:
s += i
print("输入的数字之和是",s)
for k,v in kwargs.items():
print(k,v)
add(1,2,3,4,5,姓名 = '小仓')
#输入的数字之和是 15
#姓名 小仓
其中 k , v k,v k,v两个变量是用来分别接收字典中键值对的键和值。
如果我们一个一个传入元组和字典中的元素就会很麻烦,这时可以先分别定义一个序列(列表、元组、集合的形式都可以)和字典,再传入序列名和字典名。例如👇:
def pr(*args,**kwargs):
print(args)
print(kwargs)
m = [1,2,3,4]
n = {
'a' : 'haha',
'b' : 'heyhey',
}
print(pr(*m,**n))
#(1,2,3,4)
##{'a':'haha','b':'heyhey'}
#None
因为上面定义的函数没有返回值,所以返回None。
如果传入的变量名前不加 * 会怎样?😕
def pr(*args,**kwargs):
print(args)
print(kwargs)
m = [1,2,3,4]
n = {
'a' : 'haha',
'b' : 'heyhey',
}
print(pr(m,n))
#([1,2,3,4],{'a':'haha','b':'heyhey'})
#{}
#None
从上面可以看到,它把 m , n m,n m,n就直接看作了元组的两个元素,相当于就只传到了 a r g s args args中。
3. 变量作用域
python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围就被称为作用域。
局部变量
在函数内赋值的变量,不做特殊声明的都是局部变量。也就是说这个变量的作用域只限于这个函数。例如👇:
def add():
x = 'hello'
print(x)
add()
#hello
print(x)
#NameError:name 'x' is not defined
不只在函数体内赋值的变量是局部变量,函数定义时的参数也是局部变量,例如👇:
def add(x):
print(x)
add('hello')
#hello
print(x)
#NameError:name 'x' is not defined
全局变量
在函数外赋值的变量就是全局变量,全局变量可以在整个程序范围内被访问,例如👇:
x = 'how are you?'
def add():
print(x)
add()
print(x)
#how are you?
#how are you?
再例如👇:
x = 1
def add():
x = 2
print(x)
add()
#2
print(x)
#1
由此可以知道,如果在函数内对函数外的变量进行修改等操作,是不会影响函数外变量的原本的值。❓那么我们如果在函数体内对函数体外的变量进行修改呢。这里就要用到 g l o b a l global global关键字对该变量进行声明。
x = 1
def add():
global x
x = 2
print(x)
add()
#2
print(x)
#2
注意❗️:这里要先声明,再对x进行赋值等操作。
4. 函数返回值
如果我们需要用到函数体内的局部变量,我们就可以用 r e t u r n return return返回它,并在函数体外用一个变量接收它的值。例如👇:
x = 1
def add():
x = 2
return x
y = add()
print(x)
#1
print(y)
#2
r e t u r n return return可以返回不止一个值👇:
def add():
a = 1
b = 2
c = 3
d = 4
return a,b,c,d
n = add()
print(n)
#(1,2,3,4)
由此可知,有多个返回结果时,python会返回一个元组。同时也可以用多个变量一起接收函数的返回值,例如👇:
def add():
a = 1
b = 2
c = 3
d = 4
return a,b,c,d
n,m,p,q = add()
print(n,m,p,q)
#1 2 3 4