形参和实参

  • 形参即形式参数,函数完成其工作时所需的信息。形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放。
  • 实参即实际参数,调用函数时传给函数的信息。
# -*- 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. php number_format金钱 价格 格式处理 由分单位转换成元(保留2为小数)

    /** * priceFormat * 价格格式处理 * * @access public * @param null * @since 1.0 * @return object */ if(!fun ...

  2. RPM常用命令总结

    安装 rpm -ivh package_name (package_name指的是RPM包的文件名) 查询 1.查询是否安装,及安装版本 rpm -q 已安装的软件名(ex:rpm -q docker ...

  3. MVC(基础二)

    原文链接:https://blog.csdn.net/wuzxc520/article/details/77880783 1.网站开发介绍 2.响应流程 3.MVC 介绍 4.文件夹含义

  4. 201871010102-常龙龙《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  5. cf之kmp匹配稍稍改一改

    看样例就知道要干嘛了 http://codeforces.com/contest/1200/problem/E 每次我们用新的串和答案串匹配,答案串的匹配位置是max(0,(int)ans.size( ...

  6. AD软件笔记

    问题1:不同网络的线可以重叠在一起         解决方法1: 在AD中,可以通过   SHIFT+R  快捷键     设置 三种布线模式(忽略 避开 或者 推挤) 解决方法2: 设置规则的Ele ...

  7. Linux下修改Mysql密码的三种方式

    前言 有时我们会忘记Mysql的密码,或者想改一个密码,以下将对这两种情况修改密码的三种解决方法做个总结 本文都以用户为 root 为例 一.拥有原来的myql的root的密码 方法一: 在mysql ...

  8. 使用layer.msg 时间设置不起作用

    前几天使用layer.msg设置时间后发现不起作用,这里记录一下. 开始出错误的代码: 后面查看文档后得知调用layer.msg后如果有后续操作需要写在function()中: //eg1 layer ...

  9. 可迭代对象(__iter__()和__next__())

    如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()和__next__()方法,该方法返回一个迭代对象 然后,Python的for循环就会不断调 ...

  10. python同名函数同名参数问题

    如果python有两个函数的函数名与参数列表都相同那么调用该函数时,哪个函数在后,则哪个被最终调用. 举例如下: def test(): print "before hello" ...