一、定义函数:

  1、位置参数:直接定义参数

  2、默认参数(或者关键字参数):参数名 = "默认值"

  3、位置参数必须在默认参数之前

二、调用函数:

  1、按位置传,直接写参数的值

  2、按关键字传,关键字 = "值"

  3、位置参数必须在关键字参数之前

  4、关键字参数可在*args和**kwargs之前

  注:调用时,无论定义的函数是使用位置参数还是默认值参数,调用函数时,都可以按位置传参或者按关键字进行传参,即调用时的传参形式和定义时的参数形式无关

def foo(a, b, c=3):
print("a={},b={},c={}".format(a, b, c))
foo(1,2,3) # 调用函数时按位置参数进行传参
# 输出 a=1,b=2,c=3 foo(a=1,b=2,c=3) # 调用函数时按关键字参数传参
foo(c=3,a=1,b=2) # 使用关键字传参时,与关键字的位置无关,即关键字参数之间不存在先后顺序
# 上面调用的结果是一样的 def foo(a, b, name=None,*args, **kwargs):
print(name)
print(args)
print(kwargs) A=(1, 2, 3)
B={"k1":"v1","k2":"v2"}
foo(1,2,C=6,*A,**B) #如果写成foo(1,2,C=6,1, 2, 3,**B)则会报错
1------->name
(2, 3)------->args
{'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6传入kwargs中

三、动态参数

定义函数时:

  动态位置参数使用*args进行定义(参数前加一个*),将所有的值进行聚合成一个元组

  动态关键字参数使用**kwargs进行定义(参数前加二个*),将所有的值进行聚合成一个字典

调用函数时:

  1、使用位置参数和关键字参数进行传参

  2、给一个序列加上*,就是将这个序列进行解包,然后按位置进行传参

  3、给一个字段加上**,就是将这个字典进行解包,然后按关键字参数进行传参

def foo(*args):
print(args) foo(*[1,2,3])
#输出 (1, 2, 3) def foo(**kwargs):
print(kwargs) foo(**{"a":1,"b":2})
# 输出 {'a': 1, 'b': 2}

四、默认参数和可变参数混合使用

1、默认参数定义在可变参数之前

def foo(x,y = 1,*args):
print(x)
print(y)
print(args)
foo(1,2,3,4,5,6,7,8,9) #调用函数,改变默认参数的值
1------->x=1
2-------->y=2
(3, 4, 5, 6, 7, 8, 9)----->args的值变成元组

2、默认参数定义在可变参数之后

def foo(x,*args,y = 1000):
print(x)
print(y)
print(args)
foo(1,2,3,4,5,6,7,8,9) #调用函数,使用默认值
1------->x=1
2-------->y=1000
(2, 3, 4, 5, 6, 7, 8, 9)----->args的值变成元组 foo(1,2,3,4,5,6,7,8,y=2000) #调用函数,改变默认值
1------->x=1
2-------->y=2000
(2, 3, 4, 5, 6, 7, 8)----->args的值变成元组

3、位置参数定义在可变位置参数之后

  如果在一个星号参数后,或者在可变位置参数后出现普遍参数即位置参数,实际上已经不是普通参数了,而是keyworld-only参数(python3引入)

def foo(*args, x):
print(args)
print(x) foo(1, 2, 3) # TypeError: foo() missing 1 required keyword-only argument: 'x'
foo(1,2,3,x=4) args------>(1, 2, 3)
x ------>4 1、args可以看做已经截获了所有的位置参数,x不使用关键字传参不可能拿到实参
2、使用foo(x=4,1,2,3)貌似可以,但是违反了关键字参数在位置参数之后的语法

五、复杂混合参数

#使用默认参数时,注意默认参数的位置要在args之后kwargs之前
def foo(x,*args,a=4,**kwargs):
print(x)
print(a)
print(args)
print(kwargs) foo(1,5,6,7,8,y=2,z=3) #调用函数,不修改默认参数
1------->x=1
4------->a=4
(5, 6, 7, 8)------->args
{'y': 2, 'z': 3}------->kwargs
#注意:当需要修改默认参数时,要调整默认参数的位置,要放在args之前即可,但不可放在开头
def foo(x,a=4,*args,**kwargs):
print(x)
print(a)
print(args)
print(kwargs) foo(1,9,5,6,7,8,y=2,z=3) #调用函数,修改默认参数a为9
1------->x=1
9------->a=9
(5, 6, 7, 8)------->args
{'y': 2, 'z': 3}------->kwargs

六、总结

定义函数时参数顺序:

  1、位置参数--->默认参数--->可变位置参数--->可变关键字参数(调用时修改默认参数)

  2、位置参数--->可变位置参数--->默认参数--->可变关键字参数((调用时可不修改默认参数)

调用函数顺序:

  1、位置参数在关键参数之前,调用时的传参形式和定义时的参数形式无关

  2、位置参数在最前,可变位置参数传参和关键字参数传参没有先后之分,可变关键字参数最后

def foo(a, b, *args, name=None,* *kwargs):
print(name)
print(args)
print(kwargs) A=(1, 2, 3)
B={"k1":"v1","k2":"v2"}
foo(1,2,C=6,*A,**B) #关键字在可变位置参数之前
# None------->name
# (2, 3)------->args
# {'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6传入kwargs中 foo(1,2,*A,C=6,**B) #关键字在可变位置参数之后,输出结果和上面一致
foo(1,2,*A,**B,C=6) #SyntaxError: invalid syntax,语法错误

python定义函数时的参数&调用函数时的传参的更多相关文章

  1. Scala 按名称参数调用函数 与 =>的用法

    转自:http://blog.csdn.net/shenxiaoming77/article/details/54835679 通常情况下,函数的参数是传值参数:即参数的值在它被传递给函数之前被确定. ...

  2. python定义的一个简单的shell函数的代码

    把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...

  3. 【C#基础概念】函数参数默认值和指定传参和方法参数

    函数参数默认值和指定传参 最近在编写代码时发现介绍C#参数默认值不能像PL/SQL那样直接设置default,网上也没有太多详细的资料,自己琢磨并试验后整理成果如下: C#允许在函数声明部分定义默认值 ...

  4. explicit:C++规定,当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换

    explicit研究   explicit是C++中的关键字,不是C语言中的.英文直译是“明确的”.“显式的”意思.出现这个关键字的原因,是在C++中有这样规定的基础上:当定义了只有一个参数的构造函数 ...

  5. 使用“1”个参数调用“DownloadString”时发生异常:“操作超时”

    我今天在终端美化时间遇到一个问题是这样的 使用“1”个参数调用“DownloadString”时发生异常:“操作超时” 然后网我看了下,访问链接属于https的东西,根据直觉我觉得是这样的,是由于访问 ...

  6. 使用“2”个参数调用“SetData”时发生异常:“程序集“

    使用"2"个参数调用"SetData"时发生异常:"程序集"Microsoft.VisualStudio.ProjectSystem.VS. ...

  7. js调用函数时传入的参数个数与函数定义时的参数个数不符时的操作

    在js中函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最有一个有效,其他的函数声明都是无效的.比如说声明了两个函数fn(),第一次声明时没有形参,第二次声明时形参有两个 ...

  8. python可变参数调用函数的问题

    已使用python实现的一些想法,近期使用python这种出现的要求,它定义了一个函数,第一种是一般的参数,第二个参数是默认,并有可变参数.在第一项研究中python时间,不知道keyword可变参数 ...

  9. python 定义函数 两个文件调用函数

    在def_function.py文件里面写 #coding=utf-8 #定义函数 def hello(): print "hello world" 在test.py里面调用 #c ...

随机推荐

  1. LeetCode 189. 旋转数组(Rotate Array)

    189. 旋转数组 LeetCode189. Rotate Array 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6, ...

  2. synchronized的不足与redis分布式锁的使用

    这里是一个简单模拟秒杀的逻辑,stock和orders为两个Map,分别模拟库存表和订单表 public void orderProductMockDiffUser(String productId) ...

  3. Java的设计模式(6)— 模板模式

    定义一个操作中算法的骨架,将一些步骤放在子类实现,使得子类可以不改变一个算法结构即子类可以重定义该算法的某些特定步骤. 主要有两个角色: 1. 抽象模板 :是一个抽象类,并实现了一个具体模板方法,这个 ...

  4. 用jquery和php实现ajax异步请求响应

    ajax技术可以实现异步请求和响应,下面的是用jquery向一个php脚本发送异步请求,并得到响应. 第一步,准备好前台的html表单,和jquery实现的ajax请求 <html lang=& ...

  5. python 之 前端开发( DOM操作)

    11.47 DOM操作 查找节点: 11.471 直接查找 document.getElementById //根据ID获取唯一一个标签 document.getElementsByClassName ...

  6. jmeter接口测试中的用例数据分离

    用jmeter做接口测试的话,一个jmx文件就可以是一个用例,而用例的设计多数还是等价类.边界值等方法.用例越来越多的时候,维护比较麻烦,所以可以把用例的数据存在csv文件中,然后通过组件(CSV D ...

  7. 【SQL Server高可用性】数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表

    原文:[SQL Server高可用性]数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表 经常在论坛中看到有人问数据同步的技术,如果只是同步少量的表,那么可以考虑使 ...

  8. python之爬取小说

    继上一篇爬取小说一念之间的第一章,这里将进一步展示如何爬取整篇小说 # -*- coding: utf- -*- import urllib.request import bs4 import re ...

  9. vue动态请求到的多重数组循环遍历,取值问题,如果某个值存在则显示,不存在则不显示。

    数据结构: 需求:我在vue页面需要拿到url值并显示图片 代码写法: 注意:一定要判断否则拿到的large对象一直是空值, 那么img.large.url将会取不到值,会报 url  'undefi ...

  10. MIG(ddr3)工程报错解决:IO constraint DQS_BIAS\Multiple Driver Net

    现象 在布线自己写的ddr3压力测试代码时,报如下错误. [Constraints 18-586]IO constraint DQS_BIAS with a setting of TRUE for c ...