一文搞懂Python的函数传参机制

 更新时间:2022年07月12日 08:29:03   作者:尤而小屋  
最近写了Python函数的功能,犯了一些错误。所以本文主要和大家一起梳理下Python函数的传参机制,感兴趣的小伙伴可以跟随小编一起学习一下

大家好,我是Peter~

最近写了Python函数的功能,犯了一些错误。本文主要是梳理下Python函数的传参机制,主要内容包含:

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

def hello_python():
    print("hello python!")
hello_python()  # 直接调用

输出:

hello python!

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

def hello_python():
    data = "hello python!"
    return data  # data就是返回值
hello_python()

输出:

'hello python!'

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

def hello(data):
    result = "hello " + data 
    return result
hello("python")

输出:

'hello python'

传入另一个值:

hello("java")

输出:

'hello java'

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

def hello_name(name):
    result = "Hello " + name.title() + "!"
    return result
hello_name("tom")

'Hello Tom!'

hello_name("jack")

'Hello Jack!'

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

def information(name, age):
    data = "我叫" + name.title() + ", 今年" + str(age) + "岁"
    return data
information("tom", 23)

'我叫Tom, 今年23岁'

information("JACK", 18)

'我叫Jack, 今年18岁'

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

def hello_name(name="Peter"):
    result = "Hello " + name
    return result

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

hello_name()  

'Hello Peter'

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

hello_name(name="Tom")  

'Hello Tom'

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

def information(name="Peter", age=20):
    data = "我是" + name + ", 今年" + str(age) + "岁"
    return data

1、全部使用默认值:

information()

'我是Peter, 今年20岁'

2、全部传入实际的值:

information(name="Tom", age=27)

'我是Tom, 今年27岁'

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

information(name="Tom")

'我是Tom, 今年20岁'

information(age=18)

'我是Peter, 今年18岁'

七、部分参数使用默认值

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

def information(name, age=20):
    data = "我是" + name + ", 今年" + str(age) + "岁"
    return data
information("Peter")  # age默认使用20

'我是Peter, 今年20岁'

information(name="Peter")

'我是Peter, 今年20岁'

information("Peter", age=18)

'我是Peter, 今年18岁'

下面的方式直接报错:

information(age=18, "Peter")  
  File "<ipython-input-26-2d03cd04a05a>", line 1
    information(age=18, "Peter")
                       ^
SyntaxError: positional argument follows keyword argument

information(age=18, name="Peter")  # age默认使用20

'我是Peter, 今年18岁'

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

def information(age=20, name):
    data = "我是" + name + ", 今年" + str(age) + "岁"
    return data

  File "<ipython-input-28-d36363c3194c>", line 1
    def information(age=20, name):
                   ^
SyntaxError: non-default argument follows default argument

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

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

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
get_name(first_name="张", last_name="飞", middle_name='')

'张飞'

get_name(first_name="孙", last_name="空", middle_name='悟')

'孙悟空'

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

get_name(first_name="孙", last_name="空")

'孙空'

八、位置实参

def get_information(name, age):
    data = "我是" + name + ", 今年" + str(age) + "岁"
    return data
get_information("Tom", 20)

'我是Tom, 今年20岁'

get_information("20","Tom")  # 一定要按照原来形参的顺序传递

'我是20, 今年Tom岁'

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

九、关键字实参

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

get_information(name="Tom", age=20)

'我是Tom, 今年20岁'

get_information(age=20, name="Tom")

'我是Tom, 今年20岁'

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

get_information("Tom", age=20)

'我是Tom, 今年20岁'

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

get_information(age=20,"Tom")

  File "<ipython-input-39-bc20bc544493>", line 1
    get_information(age=20,"Tom")
                          ^
SyntaxError: positional argument follows keyword argument

十一、进阶:*args使用

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

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

def height(*args):
    data = args 
    return data
height()

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

()

height(178)

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

(178,)

height(178,189)

(178, 189)

def height(*args):
    for data in args:  # 对args中的元素进行循环操作
        print("身高是: {}m".format(data / 100))
height(189,180,167,172)  # 调用

身高是: 1.89m
身高是: 1.8m
身高是: 1.67m
身高是: 1.72m

十二、进阶:**kwargs使用

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

def information(**kwargs):
    data = kwargs
    print(data)

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

 information(name="Peter")

{'name': 'Peter'}

information(name="Peter", age=23)

{'name': 'Peter', 'age': 23}

def information(**kwargs):
    for k, v in kwargs.items():
        print("{0} == {1}".format(k,v))
information(name="Peter")

name == Peter

information(name="Peter", age=23)

name == Peter
age == 23

information(name="Peter", age=23, height=175)

name == Peter
age == 23
height == 175

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

def fun(x, *args):
    print("x:", x)
    print("args:", args)
fun(1)

x: 1
args: ()

fun(1,2)

x: 1
args: (2,)

fun(1,2,3,4)

x: 1
args: (2, 3, 4)

fun(1,2,3,4,"Peter")

x: 1
args: (2, 3, 4, 'Peter')

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

def fun(x, **kwargs):
    print("x:", x)
    print("kwargs:", kwargs)
fun(1)

x: 1
kwargs: {}

fun(1,name="Peter")

x: 1
kwargs: {'name': 'Peter'}

fun(1,name="Peter",age=23)

x: 1
kwargs: {'name': 'Peter', 'age': 23}

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

def fun(x, *args, **kwargs):
    print("x:", x)
    print("args:", args)
    print("kwargs:", kwargs)
fun(1)

x: 1
args: ()
kwargs: {}

fun(1,2,3)

x: 1
args: (2, 3)
kwargs: {}

fun(1,name="Peter",age=23)

x: 1
args: ()
kwargs: {'name': 'Peter', 'age': 23}

fun(1,2,3,name="Peter",age=23)

x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}
kwargs = {"name":"Peter","age":23}

fun(1,2,3,**kwargs)

x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}

以上就是一文搞懂Python的函数传参机制的详细内容,更多关于Python函数传参机制的资料请关注脚本之家其它相关文章!

相关文章

  • Python3.2中的字符串函数学习总结

    Python3.2中的字符串函数学习总结

    这篇文章主要介绍了Python3.2中的字符串函数学习总结,本文讲解了格式化类方法、查找 & 替换类方法、拆分 & 组合类方法等内容,需要的朋友可以参考下
    2015-04-04
  • Python小白学习爬虫常用请求报头

    Python小白学习爬虫常用请求报头

    在本篇文章里小编给大家整理了关于Python小白学习爬虫常用请求报头的相关知识点,需要的朋友们可以学习下。
    2020-06-06
  • 树莓派+摄像头实现对移动物体的检测

    树莓派+摄像头实现对移动物体的检测

    这篇文章主要为大家详细介绍了树莓派+摄像头实现对移动物体的检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python 批量读取文件中指定字符的实现

    Python 批量读取文件中指定字符的实现

    这篇文章主要介绍了Python 批量读取文件中指定字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python实战练习之终于对肯德基下手

    Python实战练习之终于对肯德基下手

    读万卷书不如行万里路,学的扎不扎实要通过实战才能看出来,本篇文章手把手带你爬下肯德基的官网,大家可以在过程中查缺补漏,看看自己掌握程度怎么样
    2021-10-10
  • python中os.remove()用法及注意事项

    python中os.remove()用法及注意事项

    在本篇内容里小编给大家分享的是一篇关于python中os.remove()用法及注意事项,有需要的朋友们可以跟着学习下。
    2021-01-01
  • Python实现的生产者、消费者问题完整实例

    Python实现的生产者、消费者问题完整实例

    这篇文章主要介绍了Python实现的生产者、消费者问题,简单描述了生产者、消费者问题的概念、原理,并结合完整实例形式分析了Python实现生产者、消费者问题的相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • 手残删除python之后的补救方法

    手残删除python之后的补救方法

    这篇文章主要介绍了手残删除python之后的补救方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 分享Pandas库中的一些宝藏函数transform()

    分享Pandas库中的一些宝藏函数transform()

    Pandas具有很多强大的功能,transform就是其中之一,利用它可以高效地汇总数据且不改变数据行数,transform是一种什么数据操作?如果熟悉SQL的窗口函数,就非常容易理解了
    2021-09-09
  • Python学习笔记(二)基础语法

    Python学习笔记(二)基础语法

    对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比,避免陷入语法的苦海。我认为初学者学习语法的目标是学会使用即可,关于对概念的深入理解,剖析,没有一定的知识积累是很难做到的。
    2014-06-06

最新评论