形参和实参

  • 形参即形式参数,函数完成其工作时所需的信息。形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放。
  • 实参即实际参数,调用函数时传给函数的信息。
# -*- 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. Cobalt Strike系列教程第三章:菜单栏与视图

    通过前两章的学习,我们掌握了Cobalt Strike教程的基础知识,及软件的安装使用. Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  2. Dynamics CRM - js中用webapi基于fetchxml查询遇到的问题 -- Invalid URI: The Uri scheme is too long.

    最近用WebApi做基于Fetchxml的查询的时候,遇到一个很蛋疼的报错:Invalid URI: The Uri scheme is too long. 检查了整个URL,也没发现有什么问题. - ...

  3. OpenCV:获取图像当中某一点的坐标

    import numpy as np image=np.zeros((300,300,3),dtype='uint8') (cx,cy)=image.shape[1]//2,image.shape[0 ...

  4. Php—使用phpMyAdmin报错

    1.Warning in ./libraries/config/FormDisplay.php#661  "continue" targeting switch is equiva ...

  5. LINUX中查看、添加、删除PATH以及永久添加PATH

    1.查看PATH变量 echo $PATH 会出现: 路径1:路径2:路径3 2.添加PATH变量 export PATH=$PATH:新添加的路径 用此方法添加的PATH,在关闭或者重启LINUX后 ...

  6. Codeforces Global Round 5

    传送门 A. Balanced Rating Changes 签到,分正负搞一下就行. B. Balanced Tunnel 题意: 给出\(n\)辆车的进洞顺序和出洞顺序,问有多少量车实现了洞中超车 ...

  7. HDU2899Strange fuction(二分/三分)

    传送门 题目大意:求 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100):的最小值 题解:求个导,二分导函数零点,就是原函数最小值所在的 ...

  8. 《大数据技术应用与原理》第二版-第三章分布式文件系统HDFS

    3.1分布式文件 HDFS默认一个块的大小是64MB,与普通文件不同的是如果一个文件小于数据块的大小,它并不占用整个数据块的存储空间. 主节点又叫名称节点:另一个叫从节点又叫数据节点.名称节点负责文件 ...

  9. Note | 用Hugo搭建博客并部署到GitHub Pages

    目录 1. 本地搭建 1.1 安装Hugo 1.2 创建站点 1.3 新建页面和文章 1.4 使用主题 1.5 修改配置文件 1.6 预览 2. 部署 之前担心过现有博客平台(如博客园,CSDN)突然 ...

  10. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...