在编程语言里,将一个个功能定义成函数,能够进行反复调用,而不是每次都重复相同的代码,这种方式能够大幅度降低代码的复杂度。

函数的好处:

1.代码重用

2.保持一致性

3.可扩展性

1.基础

我们定义函数的时候可以带参数,也可以不带参数,可以有返回值,也可以没有返回值(没有返回值时默认为None)。当返回值有多个时,python以元祖的方式返回。

#不带参数、无返回值的函数
def func1():
print("This is a function!") #带参数、无返回值的函数,参数a,b是函数的位置参数
def func2(a,b):
print("Result:", a*b) #有返回值的函数
def func3(a,b):
print("Result:", a*b)
return a*b

在调用函数的时候要按顺序传入参数,调用格式及输出结果:

>>>func1()
This is a function!
>>>func2(2,3)
Result:6
>>>r = func3(2,3)
Result:6

我们在定义函数时,有时候某个参数经常是同一个值,这时我们可以将这样的参数设置为默认参数。比如函数功能是计算一个数的任意次幂,我们用得非常多的是平方,这时我们可以将幂的这个参数设置为默认为2,那么如果是计算平方,在调用函数的时候这个参数就可以不传。当函数有多个参数时,一般把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

#n是默认参数,默认是2
def func4(x,n=2):
r = 1
for i in range(n):
r = r * x
print(r)

对于默认参数,调用的时候如果不传参数,那么就是默认值;如果传参数,可以直接传值,也可以写成定义的格式:参数=值

>>>func4(3)
9
>>>func4(3,4)
81
>>>func4(3,n=4)
81

2.可变参数

对于上述提到的位置参数,在调用的时候必须传入固定数目的参数。而我们经常遇到例如求若干个数的乘积等问题,事先可能不确定参数的个数。这时我们可以定义可变参数,即参数的个数是不固定的,可以是0,1,2或者任意个。

如计算一组数的乘积,我们可以先将这组数组成list或tuple类型,调用函数。

#numbers可以是list或者tuple,元素的个数是任意的
def func5(numbers):
if len(numbers):
r = 1
for i in numbers:
r *= i
print(r)
else:
print(None)
>>>func5([1,2,3,4,5])
120
>>>func5((1,2,3,4,5))
120
>>>func5([])
None
>>>func5(())
None

上面的参数需要是list或者tuple,那么怎样能够简化成形如:func5(1,2,3,4,5)的格式调用呢?

答案是:通过在定义时的参数前面加上*,代码不需要做任何改动。

那么这个时候参数接收的是一个tuple

我们在func5的numbers参数前面加上*号,定义为func6,即func6(*numbers)。这时可以简化参数形式。对于本来是list或tuple类型的变量,调用函数时在变量前对应加*号即可把list或tuple的元素变成可变参数传进去。

>>>func6(1,2,3,4,5)
120
>>>func6()
None
>>>num = [1,2,3,4,5]#定义一个列表
>>>func6(*num)
120
>>>func6(*num[:2])#还可以对列表切片
2

3.关键字参数

我们在注册账号填资料的时候,有的选项是可选的,那么对于开发人员来说,不填的这些变量就是None,且个数不确定。诸如这种情况下,有一种关键字参数能派上用场。关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。关键字参数一般用**kw定义,参数名可自定义,但是习惯用这个,我们就用这个。

#关键字参数
def func7(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)

调用时可以传入任意个数的关键字参数,将一个dict类型变量作为关键字参数时,在变量前加**即可。

>>>func7('Michael', 30)
name: Michael age: 30 other: {}
>>>func7('Michael', 30, city='Beijing')
name: Michael age: 30 other: {'city': 'Beijing'}
>>>func7('Michael', 30, city='Beijing', job='teacher')
name: Michael age: 30 other: {'city': 'Beijing', 'job': 'teacher'} >>>per1 = {'city':'Beijing', 'job':'teacher'}
>>>func7('Michael', 30, **per1)
name: Michael age: 30 other: {'city': 'Beijing', 'job': 'teacher'}

4.命名关键字参数

关键字参数,函数调用时可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部对kw进行检查。如果需要指定或限制传入参数的参数名,那么要用到命名关键字参数,顾名思义,就是对关键字参数进行命名。例如只接收姓名和年龄。

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*号,*号后面的参数被视为命名关键字参数。

#*号后面的参数就是命名关键字参数
def func8(name, age, *, city, job):
print(name, age, city, job)

键字参数必须要传入  参数名=  ,来指定参数,否则就会报错。

>>>func8('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
>>>person('Jack', 24, city='Beijing', job='Engineer', sex='meal')
报错,不能传入除命名关键字参数以外的参数

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了。

#*args是可变参数,因此后面的关键字参数city, job就不需要特殊分隔符*号了
def func9(name, age, *args, city, job):
print(name, age, *args, city, job)
<<<func9('Jack', 24, 'placehold', city='Beijing', job='Engineer')
Jack 24 placehold Beijing Engineer
<<<func9('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

这里涉及到参数的组合,那么定义参数有一个顺序:位置参数、可变参数、命名关键字参数、关键字参数。

好好理解下面的两个函数的调用方式和结果。

#位置参数、默认参数、可变参数、关键字参数组合
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)
>>>f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>>f1(1, 2, 3)
a = 1 b = 2 c = 3 args = () kw = {}
>>>f1(1, 2, 'placehold')
a = 1 b = 2 c = placehold args = () kw = {}
>>>f1(1, 2, 3, 'placehold')
a = 1 b = 2 c = 3 args = ('placehold',) kw = {}
>>>f1(1, 2, x='%')
a = 1 b = 2 c = 0 args = () kw = {'x': '%'}
>>>f1(1, 2, x='%', y='&')
a = 1 b = 2 c = 0 args = () kw = {'x': '%', 'y' :'&'}
>>>f1(1, 2, 'a', 'b', x='%', y='&')
a = 1 b = 2 c = a args = ('b',) kw = {'x': '%', 'y' :'&'}
>>>f1(1, 2, 3, 'a', 'b', x='%', y=None)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': '%', 'y': 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)
>>>f1(*args, **kw)
a = 1 b = 2 c = 3 args = () kw = {'d': 99, 'x': '#'}
>>>f2(*args, **kw)
a = 1 b = 2 c = 3 d = 99 kw = {'x': '#'}

Python--函数参数类型、用法及代码示例的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  7. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  8. python 函数参数介绍

    python 函数参数介绍 python 使用过程总,总会遇到 *args,**kw形式的参数,总是一头雾水,而且网上介绍的或是叫法不一,为此专门深入实践进而了解了函数参数的使用 具体请看代码 #-* ...

  9. 使用Python处理CSV文件的一些代码示例

    笔记:使用Python处理CSV文件的一些代码示例,来自于<Python数据分析基础>一书,有删改 # 读写CSV文件,不使用CSV模块,仅使用基础Python # 20181110 wa ...

  10. Python函数参数详解

    Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...

随机推荐

  1. Java简单公式计算器

    最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...

  2. markdown表情

    Emoji表情 将对应emoji表情的符号码复制后输入你的markdown文本即可显示emoji表情. 如:blush:,显示为

  3. 林大妈的JavaScript基础知识(一):JavaScript简史

    前言:做一名Web设计师是一件令人兴奋的事.在Web技术中,JavaScript是一个经历从被人误解到万众瞩目的巨大转变,在历史的冲击中被留存下来的个体.因为JavaScript的引导,Web开发也从 ...

  4. Flume+Kafka收集Docker容器内分布式日志应用实践

    1 背景和问题 随着云计算.PaaS平台的普及,虚拟化.容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端.通常,我们需要需要获取日志,来进行监控.分析.预测.统计等工作,但是云端 ...

  5. Floyd—Warshall算法

    我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...

  6. jsp数据交互(二).1

    对象的作用域:   JSP中提供了四种作用域,分别是page作用域,request作用域,session作用域和application作用域. page作用域: page作用域指单一JSP页面的范围, ...

  7. windows上使用pip下载东西时报编码错误问题解决方法

    原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...

  8. Python实现网络多人聊天室

    网络多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── server.py  # 服务端代码 └── set ...

  9. Thrift框架快速入门

    Thrift介绍1.什么是thrift?thrift早期由facebook内部团队开发,主要用于实现跨语言间的方法调用,属于远程方法调用的一种,后开源纳入apache中,成为了apache thrif ...

  10. [Chat]实战:仿网易云课堂微信小程序开发核心技术剖析和经验分享

    本Chat以一个我参与开发并已上线运营近2年——类似网易云课堂的微信小程序项目,来进行微信小程序高级开发的学习. 本场Chat围绕项目开发核心技术分析,帮助你快速掌握在线视频.音频类小程序开发所需要的 ...