Python传参机制详解

2023-08-25 10:53:27 浏览数 (1)

Python传参机制详解

一、最简单的函数(无返回值、参数)

代码语言:javascript复制
def hello_python():
    print("hello python!")
代码语言:javascript复制
hello_python()  # 直接调用
代码语言:javascript复制
hello python!

二、最简单的函数(带返回值、无参数)

代码语言:javascript复制
def hello_python():
    data = "hello python!"
    return data  # data就是返回值
代码语言:javascript复制
hello_python()
代码语言:javascript复制
'hello python!'

三、带一个参数(无默认值)

代码语言:javascript复制
def hello(data):
    result = "hello "   data
    return result
代码语言:javascript复制
hello("python")
代码语言:javascript复制
'hello python'

传入另一个值:

代码语言:javascript复制
hello("java")
代码语言:javascript复制
'hello java'

还可以在内部修改参数的信息:

代码语言:javascript复制
def hello_name(name):
    result = "Hello "   name.title()   "!"
    return result
代码语言:javascript复制
hello_name("tom")
代码语言:javascript复制
'Hello Tom!'
代码语言:javascript复制
hello_name("jack")
代码语言:javascript复制
'Hello Jack!'

四、带有多个参数(无默认值)

代码语言:javascript复制
def information(name, age):
    data = "我叫"   name.title()   ", 今年"   str(age)   "岁"
    return data
代码语言:javascript复制
information("tom", 23)
代码语言:javascript复制
'我叫Tom, 今年23岁'
代码语言:javascript复制
information("JACK", 18)
代码语言:javascript复制
'我叫Jack, 今年18岁'

五、参数设置默认值(一个参数)

代码语言:javascript复制
def hello_name(name="Peter"):
    result = "Hello "   name
    return result

如果不给参数具体的值,就使用默认值

代码语言:javascript复制
hello_name()
代码语言:javascript复制
'Hello Peter'

给参数一个实际的值,比如下面的例子中Tom就是实际的值;这就是常说的实参

代码语言:javascript复制
hello_name(name="Tom")
代码语言:javascript复制
'Hello Tom'

六、参数设置默认值(多个参数)

代码语言:javascript复制
def information(name="Peter", age=20):
    data = "我是"   name   ", 今年"   str(age)   "岁"
    return data

1、全部使用默认值:

代码语言:javascript复制
information()
代码语言:javascript复制
'我是Peter, 今年20岁'

2、全部传入实际的值:

代码语言:javascript复制
information(name="Tom", age=27)
代码语言:javascript复制
'我是Tom, 今年27岁'

3、只传入部分参数的实际值;未传入的使用默认值:

代码语言:javascript复制
information(name="Tom")
代码语言:javascript复制
'我是Tom, 今年20岁'
代码语言:javascript复制
information(age=18)
代码语言:javascript复制
'我是Peter, 今年18岁'

七、部分参数使用默认值

默认值的参数一定要放在最后面;具有默认值的参数一定要放在最后面

代码语言:javascript复制
def information(name, age=20):
    data = "我是"   name   ", 今年"   str(age)   "岁"
    return data
代码语言:javascript复制
information("Peter")  # age默认使用20
代码语言:javascript复制
'我是Peter, 今年20岁'
代码语言:javascript复制
information(name="Peter")
代码语言:javascript复制
'我是Peter, 今年20岁'
代码语言:javascript复制
information("Peter", age=18)
代码语言:javascript复制
'我是Peter, 今年18岁'

下面的方式直接报错:

代码语言:javascript复制
information(age=18, "Peter")
代码语言:javascript复制
  File "<ipython-input-26-2d03cd04a05a>", line 1
    information(age=18, "Peter")
                       ^
SyntaxError: positional argument follows keyword argument
代码语言:javascript复制
information(age=18, name="Peter")  # age默认使用20
代码语言:javascript复制
'我是Peter, 今年18岁'

重点:在函数必须先列出没有默认值的形参,再列出有默认值的形参:

代码语言:javascript复制
def information(age=20, name):
    data = "我是"   name   ", 今年"   str(age)   "岁"
    return data
代码语言:javascript复制
  File "<ipython-input-28-d36363c3194c>", line 1
    def information(age=20, name):
                   ^
SyntaxError: non-default argument follows default argument

如何理解有默认值的参数一定要放在最后面?

下面自定义个get_name的函数,传入第一个、最后一个和中间的名字,但是并不是每个人都有中间名字:

代码语言:javascript复制
def get_name(first_name, last_name, middle_name=''):
    if middle_name:  # 如果存在中间名字
        name = first_name   middle_name   last_name
    else:
        name = first_name   last_name

    return name
代码语言:javascript复制
get_name(first_name="张", last_name="飞", middle_name='')
代码语言:javascript复制
'张飞'
代码语言:javascript复制
get_name(first_name="孙", last_name="空", middle_name='悟')
代码语言:javascript复制
'孙悟空'

如果不传递middle_name的结果肯定不是我们想要的:

代码语言:javascript复制
get_name(first_name="孙", last_name="空")
代码语言:javascript复制
'孙空'

八、位置实参

代码语言:javascript复制
def get_information(name, age):
    data = "我是"   name   ", 今年"   str(age)   "岁"
    return data
代码语言:javascript复制
get_information("Tom", 20)
代码语言:javascript复制
'我是Tom, 今年20岁'
代码语言:javascript复制
get_information("20","Tom")  # 一定要按照原来形参的顺序传递
代码语言:javascript复制
'我是20, 今年Tom岁'

上面的结果肯定不是我们想要的

九、关键字实参

当使用关键字传递实参的时候,和顺序无关:

代码语言:javascript复制
get_information(name="Tom", age=20)
代码语言:javascript复制
'我是Tom, 今年20岁'
代码语言:javascript复制
get_information(age=20, name="Tom")
代码语言:javascript复制
'我是Tom, 今年20岁'

十、位置实参和关键字实参混合使用

代码语言:javascript复制
get_information("Tom", age=20)
代码语言:javascript复制
'我是Tom, 今年20岁'

在使用的时候还是要按照原函数中的顺序,否则报错:

代码语言:javascript复制
get_information(age=20,"Tom")
代码语言:javascript复制
  File "<ipython-input-39-bc20bc544493>", line 1
    get_information(age=20,"Tom")
                          ^
SyntaxError: positional argument follows keyword argument

十一、进阶:*args使用

有时候我们实现并不知道函数需要接受多少个参数,这个时候可以通过*args或者**kwargs的用法来收集任意数量的参数。

先介绍*args的使用。假设我们想把一个班级中每个同学的身高都变成以米为单位,即除以100:

代码语言:javascript复制
def height(*args):
    data = args
    return data
代码语言:javascript复制
height()

默认情况下函数收集到的是一个空元组:

代码语言:javascript复制
()
代码语言:javascript复制
height(178)

当传入数据的时候,以元组的形式表示:

代码语言:javascript复制
(178,)
代码语言:javascript复制
height(178,189)
代码语言:javascript复制
(178, 189)
代码语言:javascript复制
def height(*args):
    for data in args:  # 对args中的元素进行循环操作
        print("身高是: {}m".format(data / 100))
代码语言:javascript复制
height(189,180,167,172)  # 调用
代码语言:javascript复制
身高是: 1.89m
身高是: 1.8m
身高是: 1.67m
身高是: 1.72m

十二、进阶:**kwargs使用

**kwargs允许将不定长度的键值对,作为参数传递给一个函数

代码语言:javascript复制
def information(**kwargs):
    data = kwargs
    print(data)

默认情况下收集的是字典:

代码语言:javascript复制
information(name="Peter")
代码语言:javascript复制
{'name': 'Peter'}
代码语言:javascript复制
information(name="Peter", age=23)
代码语言:javascript复制
{'name': 'Peter', 'age': 23}
代码语言:javascript复制
def information(**kwargs):
    for k, v in kwargs.items():
        print("{0} == {1}".format(k,v))
代码语言:javascript复制
information(name="Peter")
代码语言:javascript复制
name == Peter
代码语言:javascript复制
information(name="Peter", age=23)
代码语言:javascript复制
name == Peter
age == 23
代码语言:javascript复制
information(name="Peter", age=23, height=175)
代码语言:javascript复制
name == Peter
age == 23
height == 175

十三、进阶:*args 和形参连用

代码语言:javascript复制
def fun(x, *args):
    print("x:", x)
    print("args:", args)
代码语言:javascript复制
fun(1)
代码语言:javascript复制
x: 1
args: ()
代码语言:javascript复制
fun(1,2)
代码语言:javascript复制
x: 1
args: (2,)
代码语言:javascript复制
fun(1,2,3,4)
代码语言:javascript复制
x: 1
args: (2, 3, 4)
代码语言:javascript复制
fun(1,2,3,4,"Peter")
代码语言:javascript复制
x: 1
args: (2, 3, 4, 'Peter')

十四、进阶:**kwargs 和形参连用

代码语言:javascript复制
def fun(x, **kwargs):
    print("x:", x)
    print("kwargs:", kwargs)
代码语言:javascript复制
fun(1)
代码语言:javascript复制
x: 1
kwargs: {}
代码语言:javascript复制
fun(1,name="Peter")
代码语言:javascript复制
x: 1
kwargs: {'name': 'Peter'}
代码语言:javascript复制
fun(1,name="Peter",age=23)
代码语言:javascript复制
x: 1
kwargs: {'name': 'Peter', 'age': 23}

十五、进阶:形参 *args **kwargs连用

代码语言:javascript复制
def fun(x, *args, **kwargs):
    print("x:", x)
    print("args:", args)
    print("kwargs:", kwargs)
代码语言:javascript复制
fun(1)
代码语言:javascript复制
x: 1
args: ()
kwargs: {}
代码语言:javascript复制
fun(1,2,3)
代码语言:javascript复制
x: 1
args: (2, 3)
kwargs: {}
代码语言:javascript复制
fun(1,name="Peter",age=23)
代码语言:javascript复制
x: 1
args: ()
kwargs: {'name': 'Peter', 'age': 23}
代码语言:javascript复制
fun(1,2,3,name="Peter",age=23)
代码语言:javascript复制
x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}
代码语言:javascript复制
kwargs = {"name":"Peter","age":23}

fun(1,2,3,**kwargs)
代码语言:javascript复制
x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}

0 人点赞