参数类型:
1、必填参数,位置参数(positional arguments,官方定义,就是其他语言所说的参数)
2、默认值参数,非必传
3、可变参数,非必传,不限制参数个数,比如说给多个人发邮件,发邮件的人数不确定
4、关键字参数,非必传,不限制参数个数,会把传过来的关键字参数,放到一个字典里面,传参的时候必须得用k=v这样子来传
5、命名关键字参数 1. 位置参数:其他语言没有分参数的种类是因为只有这一种参数,所有参数都遵循按位置一一对应的原则。
定义:就是在给函数传参数时,按照顺序,依次传值。
def power(n,m):
result=1
while n>1:
n = n-1
result=result*m
return result res=power(5,3)
print(res) #输出结果:81 #解释说明:
# 函数power(n,m)中有两个参数,m和n,这两个参数都是位置参数,调用的时候,传入的两个值按照顺序,依次赋值给m和n。

2. 默认值参数:完全等同于C++,引入默认参数是为了在某些情境下提供方便。

定义:就是在写函数的时候直接给参数传默认的值,调用的时候,默认参数已经有值,就可以不用再传值了。作用:最大的好处就是降低调用函数的难度。形式: 参数名 = 默认值

def students(name,grade,gender='Male'):
print(name,grade,gender) students('Kitty',3) ##有了默认参数之后,gender这个参数即使不提供 也可以调用函数gender被赋了的默认值Male
students('Lily',2,'Famale') # 以上输出结果如下:
# Kitty 3 Male
# Lily 2 Famale

默认参数需要注意的地方

a. 默认参数必须在最右端(最后),这样才能被解释器正确识别,否则会产生二义性。

def fun(a=10, b): #这里会报错:SyntaxError: non-default argument follows default argument
return a + b
fun(10) #二义性:这个20究竟是赋值给a的还是b的
#人都无法分辨清楚,解释器就更不行了

b. 默认参数一定要指向不变对象!

def defaultzero(list = []):  #我们的本意是提供的list参数为0时 返回只有一个0的list
list.append(0)
return list
print(defaultzero()) #输出:[0]
print(defaultzero()) #输出:[0, 0] 显然重复调用的时候结果不是我们所期望的 #解决方案 使用None
def defaultzero1(list = None):
if list == None:
list = []
list.append(0)
return list
print(defaultzero1()) #输出:[0]
print(defaultzero1()) #输出:[0] 重复调用的时候,也输出相同 #这说明list是一个对象
#事实上Python所有的数据类型其实都是对象

结果说明python解释器会将默认参数作为一个公共对象来对待,多次调用含有默认参数的函数,就会进行多次修改。
因此定义默认参数时一定要使用不可变对象(int、float、str、tuple)。使用可变对象语法上没错,但在逻辑上是不安全的,代码量非常大时,容易产生很难查找的bug。

3. 可变参数:Python函数提供了可变参数,来方便进行参数个数未知时的调用。可变参数将以tuple形式传递。

定义:可变参数就是传入的参数个数是可变的,可以是0个,1个,2个,……很多个。作用:就是可以一次给函数传很多的参数特征(格式):*args  【*参数 (即在参数前加*号)】

def power(*args):
result=0
for n in args:
result=result+n*n
return result # 调用函数1
tupleArray=(1,2,3)
# *tupleArray这种方式很常见,很重要
print(power(*tupleArray)) #输出结果:14 # 调用函数2
listArray=[1,2,3]
# *listArray这种方式很常见,很重要
# *listArray表示把listArray这个list中所有元素作为可变参数传进去
print(power(*listArray)) #输出结果:14 #调用函数3
print(power(1,2,3)) #输出结果:14

请注意: *在C语言中是取内容运算符,变量前加该符号意为指针变量,Python中只是一个标识符,表示将以tuple形式传递,星号本身有”全部的”意思, 两者无任何关系,下同。

4. 关键字参数:Python的可变参数以tuple形式传递,而关键字参数则是以dict形式传递。 即可变参数传递的是参数值,关键字参数传递的是参数名:参数值键值对。

定义:关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在调用函数时,可以只传入必选参数:
作用:扩展函数的功能
特征:**kw  这是惯用写法,建议使用,容易被理解

def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw) #案例一:
person('Michael', 30) #输出结果:name: Michael age: 30 other: {} #案例一:
person('Michael', 30, city='Beijing') #输出结果:name: Michael age: 30 other: {'city': 'Beijing'} #案例三:
#定义一个字典数据
dictArray = {'city': 'Beijing', 'job': 'Engineer'}
#调用函数
person('Jack', 24, **dictArray )
#输出结果 name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'} #解释说明:
#**dictArray表示把dictArray这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict。注意kw获得的dict是dictArray的一份拷贝,对kw的改动不会影响到函数外的dictArray。

5. 命名关键字参数:Python的命名关键字参数对传入的关键字参数做了进一步的限制。

定义:例如只接收city和job的参数,其他,不接收。
def person(name, age, *, city, job):
print(name, age, city, job)

作用:限制要传入的参数的名字,只能传我已命名关键字参数。
特征:命名关键字参数需要一个特殊分隔符*,而后面的参数被视为命名关键字参数。

def personinfo(name, age, *, gender, city): #只能传递gender和city参数
print(name, age, gender, city)
personinfo('Steve', 22, gender = 'male', city = 'shanghai') #输出:Steve 22 male shanghai

关键字参数和命名关键字参数的区别在于,前者可以传递任何名字的参数,而后者只能传递*后面名字的参数。如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def personinfo(name, age, *args, gender, city): #args可以传递一个list 其后只能传递gedner和city参数
print(name, age, gender, city, args)
personinfo('Steve', 22, [1,2,3,4],city = 'shanghai',gender = 'male')
# 输出:Steve 22 male shanghai ([1, 2, 3, 4],)

6. 各种参数之间组合

定义:把以上五种参数组合在一起的参数组合
排放顺序:在Python中定义函数,可以用必选参数、默认参数、可变参数、命名关键字参数和关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数–>默认参数–>可变参数–>命名关键字参数–>关键字参数可读性是代码的一个很重要的要求,所以尽量避免使用多种参数的组合。

#比如定义一个函数,包含若干种参数:
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) #在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
f1(1, 2) # 输出:a = 1 b = 2 c = 0 args = () kw = {}
f1(1, 2, c=3) # 输出:a = 1 b = 2 c = 3 args = () kw = {}
f1(1, 2, 3, 'a', 'b') # 输出:a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
f1(1, 2, 3, 'a', 'b', x=99) # 输出:a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
f2(1, 2, d=99, ext=None) # 输出:a = 1 b = 2 c = 0 d = 99 kw = {'ext': None} # 最神奇的是通过一个tuple和dict,你也可以调用上述函数:
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw) # 输出:a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} args = (1, 2, 3)
kw = {'d': 88, 'x': '#'}
f2(*args, **kw)# 输出:a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'} #所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

小结

1,Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。 2,默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误! 3,要注意定义可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

4,以及调用函数时如何传入可变参数和关键字参数的语法: 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3)); 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。

5,使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

6,命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。 7,定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

7,定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
 

Python的参数类型的更多相关文章

  1. Python 函数参数类型大全(非常全!!!)

    Python 函数参数类型大全(非常全!!!) 1.在python编写程序里面具有函数文档,它的主要作用是为了让别人可以更好的理解你的函数,所以这是一个好习惯,访问函数文档的方式是: MyFuncti ...

  2. python函数参数类型及其顺序

    根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...

  3. Python之参数类型、变量

    一.参数类型 (一)形参与实参 要使用局部变量时,只能通过return的方式返回 def my(name): #函数体 return name my('lrx') #name是形参,lrx是实参 不写 ...

  4. Python各种参数类型

    1. Python的参数传递是值传递还是引 举例说明Python函数参数传递的几种形式,并说明函数传参是值传递还是引用传递 一.位置参数 调用函数时根据函数定义的参数位置来传递参数.例子: def p ...

  5. python可变参数类型 a,*args,**kwargs

    a - int *args --tuple **kwargs -- dict *args是非关键字参数,用于元组,**kw是关键字参数,用于字典 可变参数 在Python函数中,还可以定义可变参数.顾 ...

  6. python函数参数类型:位置参数、默认参数、动态参数、关键字参数

    1.位置参数:调用函数的时候传的参数,参数默认按顺序赋值,如果是指定那个参数赋值,不关注顺序.指定参数a=1,b=2 就在函数体内a=1,b=2 2.默认参数:在定义函数的时候,给某个参数设置默认值 ...

  7. Python函数参数的五种类型

    之前项目需求,需要通过反射获取函数的参数,python中可以通过函数签名(signature)来实现. 首先需要了解函数参数的类型,Python的参数类型一共有5种:POSITIONAL_OR_KEY ...

  8. Python函数小结(1)--参数类型(*, ** 的区别), 闭包

    刚开始学习python,python相对于java确实要简洁易用得多.内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来 ...

  9. Python 带参数的装饰器 [2] 函数参数类型检查

    在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...

随机推荐

  1. A1088. Rational Arithmetic

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  2. 如何在疲劳的JS世界中持续学习

    作者简介 cnfi 蚂蚁金服·数据体验技术团队 本文翻译自<Stay updated in JS fatigue universe>,并对内容有所补充和修改. 部分内容参考<HOW ...

  3. haploview出现“results file must contain a snp column”的解决方法

    将plink文件用“--recode HV ”的参数生成即可 /software/plink --file yourfile --recode HV --snps-only just-acgt --o ...

  4. AOP和IOC

    AOP切面编程,作用:事务,日志,统一调用,统一实现,拦截,分发: 切点:告诉编译器切面作用于哪个package中的class IOC:控制反转,相对于new 对象来说的,依赖注入:AuthorWar ...

  5. 多元线性回归(Multivariate Linear Regression)简单应用

    警告:本文为小白入门学习笔记 数据集: http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearnin ...

  6. nginx.conf配置文件详解

    一:nginx配置文件结构 nginx配置文件主要分为六个区域: main(全局设置).events(nginx工作模式).http(http设置). sever(主机设置).location(URL ...

  7. linux 内核代码结构

    1.ARM的核心代码保存在arch/arm目录下 2.ARM SoC core architecture code保存在arch/arm目录下 3.ARM SOC的周边外设模块的驱动保存在driver ...

  8. go tcp

    TCP编程 1.客户端和服务器 2.服务端的处理流程 监听端口 接收客户端的链接 创建goroutine,处理该链接 3.客户端的处理流程 建立与服务端的链接 进行数据收发 关闭链接 服务端代码 pa ...

  9. MySQL 8.0X的安装与卸载命令

    1,下载 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12-winx64.zip 2,解压 将mysql-8.0.12-winx64 ...

  10. Chrome刷新缓存

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键  Ctrl+Shift+R  重新加载当前网页而不使用缓存内容