形参和实参

  • 形参即形式参数,函数完成其工作时所需的信息。形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放。
  • 实参即实际参数,调用函数时传给函数的信息。
# -*- coding: utf-8 -*-

def main(name): # name 即为形参
print "hello world %s" % name
print "hello world {name}".format(name=name)
return name

main("python") # python 即为实参

上述而言:在调用函数并传入参数即main("python"),将实参"python"传递给函数main(),这个值就被存储在形参name中。

函数的参数传递(实参的传递方式)

  • 位置传参:在调用函数进行传参时,实际参数(实参)与形式参数(形参)的对应关系是按照位置来依次对应的。
  • 序列传参:在调用函数进行传参时,实参为序列,用"*"将序列拆解后再进行位置传参。实参和形参通过序列传递和匹配。
  • 关键字传参:在调用函数进行传参时,按照形参的名称给形参赋值,即传递给函数的是键值对。实参和形参按名称进行匹配。
  • 字典关键字传参:在调用函数进行传参时,实参为字典,用"**"将字典拆解后再进行关键字传参。

位置传参

# 位置传参,实参与形参需要一一对应,不可多也不可少。
def main(name, age, hobby):
content = "My name is %s,I'm %d years old,my hobby is %s" % (name, age, hobby)
return content content = main("张三", 26, "playgame")

序列传参

# 序列传参,序列里的元素必须和形参的数量保持一致。将序列拆解后再按照位置传参方式进行传参。
def main(name, age, hobby):
content = "My name is %s,I'm %d years old,my hobby is %s" % (name, age, hobby)
return content info = ["张三", 26, "playgame"]
content = main(info[0], info[1], info[2]) # 这是位置传参,实参的值与形参的值按照顺序一一对应
content = main(*info) # 这是序列传参,将info拆解后再依次传入 name="张三" age=26 hobby="playgame"

关键字传参

# 关键字传参,实参与形参无需一一对应,不可多也不可少。实参和形参按照形参名进行匹配,可以不按照位置进行匹配。
def main(name, age, hobby):
content = "My name is %s,I'm %d years old,my hobby is %s" % (name, age, hobby)
return content content = main(age=28, name="王五", hobby="fishing") # 在实参中的将名称和值关联起来,所以在传入时无需考虑顺序。

字典关键字传参

# 字典关键字传参,函数括号里不能直接写字典,前面应该加上 "**" 表示拆解字典。
# 字典的键名要在形参中存在且和形参名必须一致。字典的键名必须为字符串。
def main(name, age, hobby):
content = "My name is %s,I'm %d years old,my hobby is %s" % (name, age, hobby)
return content info = {"age": 28, "name": "王五", "hobby": "fishing"}
content = main(**info)
content = main(**{"age": 28, "name": "王五", "hobby": "fishing"})

以上传参方式综合传参:函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合

位置传参和关键字传参混合使用:在没有参数组(即没有*args和**kwargs)的情况下,实参的数量必须与形参的数量一致。

def main(name, age, hobby):
content = "My name is %s,I'm %d years old,my hobby is %s" % (name, age, hobby)
return content # content = main(name="张三", 28, hobby="fishing") # 报错:位置传参必须写在关键字传参的左边
# content = main("张三", 28, age="fishing") # 报错:同一个参数不能两次或者多次传值,只能传一次
content = main("张三", age=28, hobby="fishing")

四种传参混在一起使用:通常位置传参和序列传参先传递,其次是关键字传参和字典关键字传参。

def main(name, sex, age, score, hobby):
print name, sex, age, score, hobby
return "hello python success!!" con = main("张三", *["男", 28], hobby="fishing", **{"score": 90})

函数的形参定义方式(形参的接收方式)

  • 位置形参:上面的示例是实参的传递方式,形参全是位置形参。上面是传递参数(实参),下面是接收参数(形参)。
  • 单星号元组形参:接收传入的多余的位置参数,被args接收。
  • 双星号字典形参:接收传入的多余的关键字参数,被kwargs接收。

位置形参

# 所有的形参全都一一列举出来
def 函数名(形参名1,形参名2,...,形参名n):
语句块

单星号元组形参

def 函数名(*args):
语句块

def main(name, *args):
print name, args, type(args)
return "success!!!"

main("张三", "男", "playgame")
main("张三", {"sex": "男"}, "dancing") # 即使传入字典,字典当成整体也会以元组的方式被接收
main("张三", ["hello", "world"], "dancing")
main("张三", *["hello", "world"]) # 相当于遍历该列表,逐个添加至列表并且转为元组,*args接收。
main("张三", *"hello") # 相当于遍历该字符串,逐个添加至列表并且转为元组,*args接收。

# *args 表示创建一个名为 args 的空元组,该元组可接受任意多个外界传入的非关键字实参。
# *args 将多于的实参,以位置参数的方式传入,以元组的形式接收。保存在args元组中。*args名称可以自己随意取,如*word。
# 参数收集的本质就是一个元组, Python 会将传给 args 参数的多个值收集成一个元组,以元组为对象进行参数传递。
# 输出为:
# 张三 ('男', 'playgame') <type 'tuple'>
# 张三 ({'sex': '男'}, 'dancing') <type 'tuple'>
# 张三 (['hello', 'world'], 'dancing') <type 'tuple'>
# 张三 ('hello', 'world') <type 'tuple'>
# 张三 ('h', 'e', 'l', 'l', 'o') <type 'tuple'>

双星号字典形参

def 函数名(**kwargs):
语句块

def main(name, **kwargs):
print name, kwargs, type(kwargs)
return "success!!!"

main("张三", sex="男", age=28)
main(name="张三", sex="男", age=28)
main(name="张三", **{"sex": "男", "age": 28})
# **kwargs 表示创建一个名为 kwargs 的空字典,该字典可接受任意多个外界传入的关键字实参。
# **kwargs 将多于的实参,以关键字参数的形式传入,以字典的形式接收。保存在kwargs字典中。
# 输出为:
# 张三 {'age': 28, 'sex': '\xe7\x94\xb7'} <type 'dict'>
# 张三 {'age': 28, 'sex': '\xe7\x94\xb7'} <type 'dict'>
# 张三 {'age': 28, 'sex': '\xe7\x94\xb7'} <type 'dict'>

单星号元组形参与双星号字典形参混合使用

# 当在函数定义参数时,同时定义*args与**kwargs时,可以接收在调用函数时传入的任何参数(任意位置传参和关键字传参)。
# 多余的位置参数,传入函数,以元组的方式被存储在*args中。多余的关键字参数,传入函数,以字典的方式被存储在**kwargs中。
def func(*args, **kwargs):
pass def main(x, y, *args, **kwargs):
print x, y # 结果: 100 200
print args, type(args) # 结果: (300, ['hello', 'python']) <type 'tuple'>
print kwargs, type(kwargs) # 结果: {'age': 28, 'sex': '\xe7\x94\xb7'} <type 'dict'>
return "success!!!"

main(100, 200, 300, ["hello","python"], age=28, sex="男")
def main(a, b, *args, **kwargs):
print a,b # 结果:100 200
print args # 结果:(300, 'A', 'B')
print kwargs # 结果:{'c': 'C', 'd': 'D'} main(100, 200, 300, *"AB", **{"c": "C", "d": "D"})

函数的缺省参数(默认参数)

定义函数时我们可以给参数传递默认值,当调用函数时没有传递该参数值时使用默认参数值。带默认值的参数称为默认参数,无默认值的参数称为必需参数,调用函数时必需参数必填,默认参数选填。

缺省规则

  • 缺省参数必须自右至左依次存在。即默认参数一定在必需参数之后。即 score 在 name 之后。
  • 缺省参数可以有0个,1个,多个,甚至全部都是缺省参数。
  • 缺省参数的绑定对象存在于函数内,同函数的生命周期一致。
  • 函数体里面如果对缺省参数操作了,则会保存,下次调用时候,是保存的最新的了。
def 函数名(形参名1 = 默认实参1,形参名2 = 默认实参2,...):
语句块

def main(name, score=60, *args, **kwargs):
print name, score, args, kwargs
return "success!!!"

main("张三", sex="男") # 不给默认参数传值时,使用默认参数值
main("张三", 80, sex="男") # 当给默认参数传值时,则覆盖
main("张三", 80, 90, sex="男") # 多余的值用*args 和 **kwargs 接收
# 输出为:
# 张三 60 () {'sex': '\xe7\x94\xb7'}
# 张三 80 () {'sex': '\xe7\x94\xb7'}
# 张三 80 (90,) {'sex': '\xe7\x94\xb7'}
def main(a, lst=[]):
lst.append(a)
print(lst)
l = [1, 2, 3]
main(5, l) # 结果:[1, 2, 3, 5]
main(6, l) # 结果:[1, 2, 3, 5, 6]
main(1.1) # 结果:[1.1]
main(2.2) # 结果:[1.1, 2.2]

Python—函数的参数传递的更多相关文章

  1. python:函数的参数传递方法演示

    """ 函数的参数传递方法演示 """ #1.位置传参 def normal(a, b, c): print("1.位置传参:&q ...

  2. python函数的参数传递问题---传值还是传引用?

    摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...

  3. Python 函数的参数传递

    C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...

  4. Python函数(二)-参数传递

    位置参数 根据位置顺序来传递参数 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def test(a,b): #a和b为形参 ...

  5. Python 函数 参数传递

    参数传递    在 python 中,类型属于对象,变量是没有类型的:        a=[1,2,3]        a="Runoob"    以上代码中,[1,2,3] 是 ...

  6. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  7. python函数知识点(详解匿名函数)

    Python函数是组织好的.单一的.具有独立功能模块的代码块. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定 ...

  8. Python系列-python函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  9. python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变

    函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...

随机推荐

  1. localStorage本地存储技术

    localStorage 本地存储技术 本地存储技术,“不是永久的永久存储” 特点: 将数据存储到浏览器当中 存储的数据都是以字符串的形式存储的 和传统的数据库相比: 优点: 操作简单,容易学习 数据 ...

  2. arcgis api 4.x for js 地图加载多个气泡窗口展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  3. iOS中数组的倒序、升序、降序

    NSMutableArray *array = [NSMutableArray arrayWithObjects:",nil]; // 倒序 NSMutableArray *resultAr ...

  4. Java反射01 : 概念、入门示例、用途及注意事项

    1.Java反射定义 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79360452 官方定义如下: Reflection enabl ...

  5. 43-安装 Docker Machine

    前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和销毁,相关容器会通过网络 ...

  6. Android获取实时连接热点的设备IP地址

    因为最近玩树莓派,需要手机做热点,目前我发现的有两种办法 得到“已连接手机热点的设备的ip地址,推荐第二个办法,我最开始是第二个办法解决问题的, 第一个办法推测可行,但还未验证, 第一个办法需要手机有 ...

  7. 北京地区dns

    为了提高网页的访问打开速度我们可以配置一些解析速度较快的dns,下面小编搜集了一些常用的DNS地址,可以根据自己所在地区可以选择不同的dns 首先可以在我们的客户端打开cmd命令行工具测试一些,去pi ...

  8. IDEA中增加日志相关的Live Templates

    1.新增一个Template Group 来将一个类型的放一起 2.在Template Group增加Live Template 这里可以分为三步 第一步填写想要看到的代码,变量部分用$paramet ...

  9. 第05组 Beta冲刺(2/4)

    第05组 Beta冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  10. PUT和POST区别

    POST是用来提交数据的.提交的数据放在HTTP请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多).PUT操作是幂等的.所谓幂等 ...