函数参数:
函数分为形参和实参。
对于函数的定义:
def func(name):
print(name)
func(name)
定义的来说,在函数中定义的name就是形参,在函数调用中的name就是实参。
形参的定义:形参就是在函数定义时候的变量,需要从外部进行传值。
def fn(a,b,c): # 形参要拷贝实参的值,随着函数的调用产生,随着函数调用结束销毁了
# a,b,c必须从外界进行获取,才有意义
print(a)
print(b)
print(c)
# 内部使用外部变量,外部要提前产生
print(x)
print(y)
print(z)
# x,y,z是实际存在的值
x = 10
y = 20
z = 30
fn(10,20,30)
fn(x,y,z)
fn(x+10,y*2,z/5)
实参:实参是函数括号中传入的实际值,可以是常量、变量、表达式进行的组合。
# 位置实参:一定要按位置传值
def fn(a,b,c):
print(a,b,c)
fn(10,20,66)
# 关键字实参
# 每有必要按照顺利传递
fn(a=55,b=64,c=89)
fn(b=55,a=64,c=89)
# 两者混用(*********非常常用**********)
# 关键字实参必须出现在位置实参之后哦
fn(77,88,9)
fn(10,b=55,c=99)
fn(10,c=55,b=99)
def fun(a,b,c,d,e,f):
print(a,b,c,d,e,f)
fun(10,20,30,40,50,60)
fun(10,c=20,d=30,e=50,f=60,b=40)
形参的种类
1.位置参数:从左到右按照顺序定义参数
位置形参:必须选参数
位置实参:按照位置给形参传值
2.关键字参数:按照a=10的形式来定义参数
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
3.默认参数:形参在定义时就已经为其赋值 可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
4.可变长度参数:指的是实参的长度不固定
# 变长位置形参# 可变长形参只能由位置实参来传值# 它会以元组的形式接受所有传入的位置实参
但是实参分为位置和关键字两种:所以针对这两种提供了*args和**kwargs两种。*为分界线,可以有变量名*args,也可以进行分割.
===================================*args=============================================
def fn(*args):
print(args)
fn(1,2,3,4,5)
a = 'abcdef'
b = [1,2,3,4,5]
c =(1,2,3,4,5)
d = {1,2,3,4,5}
fn(a)
fn(b)
fn(c)
fn(d)
# 把变量进行打散传值(本质就是传的地址)
fn(*a)
fn(*b)
fn(*c)
fn(*d)
==================================**kwargs=============================================
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,a=1,b=2,c=3)
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,**{'a':1,'b':2,'c':3})
def foo(x,y,z):
print(x,y,z)
foo(**{'z':1,'x':2,'y':3})
(***********)总体函数的定义:
def func(a,b=10,*args,c,d=10,**kwargs):
print(a,b)
print(args)
print(c,d)
print(kwargs)
func(10,5,3,4,5,c=3,e=7,f=14)
==============print======================================
10,5
(3,4,5)
3,10
{'e':7,'f':14}