Python—函数的参数传递
形参和实参
- 形参即形式参数,函数完成其工作时所需的信息。形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放。
- 实参即实际参数,调用函数时传给函数的信息。
# -*- 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—函数的参数传递的更多相关文章
- python:函数的参数传递方法演示
""" 函数的参数传递方法演示 """ #1.位置传参 def normal(a, b, c): print("1.位置传参:&q ...
- python函数的参数传递问题---传值还是传引用?
摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...
- Python 函数的参数传递
C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...
- Python函数(二)-参数传递
位置参数 根据位置顺序来传递参数 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def test(a,b): #a和b为形参 ...
- Python 函数 参数传递
参数传递 在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 ...
- Python函数解析
对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...
- python函数知识点(详解匿名函数)
Python函数是组织好的.单一的.具有独立功能模块的代码块. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定 ...
- Python系列-python函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...
随机推荐
- [转]UiPath: How to Capture a Mouse Event on Hover Menus?
本文转自:https://www.uipath.com/kb-articles/how-to-capture-mouse-event-on-hover-menus he Knowledgebase a ...
- Nginx四层负载均衡概述
目录 Nginx四层负载均衡概述 什么是负载均衡 负载均衡应用场景 四层,七层集群架构 四层负载均衡总结 Nginx如何配置四层负载均衡 nginx四层负载均衡端口转发 Nginx四层负载均衡概述 什 ...
- Notification 弹出一个通知在桌面右下角
if (!("Notification" in window)) { //alert("This browser does not support desktop not ...
- lambada 表达式
1.lambada的存在来由 匿名类的一个问题是,如果匿名类的实现非常简单,例如只包含一个方法的接口,那么匿名类的语法可能看起来不实用且不清楚.在这些情况下,您通常会尝试将功能作为参数传递给另一个方法 ...
- 公司员工表示 nginx 之父被警方带走
ZDNet 12 日报导,俄罗斯警方当天突击搜查了 NGINX 公司(nginx 服务器项目商业化公司)在莫斯科的办事处,并带走了 NGINX 公司联合创始人 Igor Sysoev 与 Maxim ...
- 3. java 方法入门
一.方法定义 1. 定义格式 public static void 方法名称(){ 方法体 } 1. 方法名称:命名和变量一致,小驼峰式 2. 方法体:大括号中可以包含任意条语句 注意事项: 1. 方 ...
- misc-4-1
记录一题盲水印的misc,缅怀昨天高校运维挑战赛的twocats翻车车 下载下来binwalk一下 然后在里面发现了压缩包,并找到两长一模一样的图片,还要tip.txt Although two da ...
- CSS旋转动画和动画的拼接
旋转动画 第一个样式: @keyframes rotating { from { transform: rotate(0deg); } to { transform: rotate(360deg); ...
- MySQL中使用group_concat遇到的坑
在使用group_concat的过程中遇到个问题,这里记录一下:在MySQL中有个配置参数group_concat_max_len,它会限制使用group_concat返回的最大字符串长度,默认是10 ...
- 纯手打AJAX,还有一个对象转查询字符串的小方法obj=>url
function json2url(json){ var arr=[]; for(var name in json){ arr.push(name+'='+json[name]); } return ...