以下代码均以Python3为基础理解。

初识Python函数

大部分常见的语言如C、Java、PHP、C#、JavaScript等属于C系语言,Python不属于他们中的一员(ruby亦然)。在这些语言中,Python也属于比较新奇的一派,就函数来说,它没有大括号,用def关键字定义一个函数,定义后用:然后换行tab指定函数函数的范围,当然也不存在什么分号。

作为一个函数,那个它肯定是有参数的,Python对于参数的定义比较繁杂,如果了解ES6,那么在Python函数的各个参数中差不多都能够找到对应的ES6定义,因为JS是我最为熟悉的编程语言,所以在下面介绍各种参数类型时都会对照JS中对应的类型,以加强理解。

Python函数参数分为位置参数、默认参数、可变参数、关键字参数、命名关键字参数五大类。

位置参数

这是最大众化的一种参数类型了,就是函数中定义确定的形参,然后调用函数的实参传入一一对应的参数,参数的位置、个数都不得有偏差。不同于JS中实参与形参可不同个数,这里的要求是非常严格的。

def desc(name,age,city)

print('name = ' , name,'age = ' , age,'city = ' , city)

# name = zhaobo age = 12 city = luzhou

desc('zhaobo',12,'luzhou')

默认参数

ES6中也有默认参数这种用法,Python中的用法与在ES中的用法出差不多的。在定义形参时即指定好默认参数,如果在实参没有传入这个位置的参数,那么这里的参数就为默认参数,默认参数要写在位置参数后面。

def desc(name,gender,city = 'luzhou',age = 15):

print('name = ' , name,'gender = ' , gender,'city = ' , city,'age = ' , age)

desc('zhaobo','male') # name = zhaobo gender = male city = luzhou age = 15

desc('YeJ.Q','female','Deyang') # name = YeJ.Q gender = female city = Deyang age = 15

desc('WeiC.M','female',age = 16) # name = WeiC.M gender = female city = luzhou age = 16

如上代码,desc函数有四个参数,其中后面两个是默认参数,第一种调用方式只传了必选的两个位置参数,那么通过打印结果来看,name和age是我们传进去的值,后面的city和age是默认参数中的值;第二种方式按照顺序三个值,前两个必选参数自然不必说,第三个参数覆盖了默认参数的值,第四个参数还是默认参数的值,是实际写代码的时候,要将变化小的参数写在参数列后面;最后一种调用方式,我们想的是在city上取默认值,但是在age上需要传新值,这个就在实参里面直接指定age的值,所以体现出默认参数的传递不一定要按照参数的顺序来传值。

总结:

默认参数必须在必选参数之后;

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

默认参数也可以不安默认的顺序提供参数,enroll(‘Adam’, ‘M’, city=’Tianjin’),这样调用即可

默认参数必须指向不变对象(str、None、int、float等)!不可指向list

可变参数

ES6中新增了一种rest参数(不定参数),是JS中arguments的语法糖,在传参的时候可传不定个数的参数,在函数中打印出不定参数是一个数组。

在Python中也有类似的语法,叫做不定参数,他的参数用*param定义,写在函数的最后(有且只能写一个),进行传参的时候,也可传也可不传参数,参数的个数也可变。

def power(name,*desc):

# 打印出来是一个tuple

# ('12', 'male', 'student')

print(desc)

power('zhaobo','12','male','student')

power('zhaobo',*['12','male','student'])

power('zhaobo',*('12','male','student'))

上述代码定义了使用不定参数的三种类型

完全体现“不定”两个字的含义,在对位置参数进行了对应的传参之后,剩下的就是不定参数,注意这里总共传入了四个参数,第一个是位置参数,后三个都将作为不定参数传入,在函数中作为不定参数打印出来的是一个元组(tuple);

传入了两个参数,第一个是位置参数,第二个在列表(list)的前面加上了一个*,这样就可以直接传入一个列表,然后打印结果与第一种是一样的。利用这一个语法糖就可以直接将参数传入一个列表。

这种方式与传入列表几乎无异,只是可以传入一个元组。

关键字参数

在使用JS尤其是jQuery的时候,常见用对象当作参数传递,在Python中也有类似的用法,而且功能也非常强大。

def foo(name,**kw):

# {'age': 8, 'gender': 'male'}

print(kw)

foo('zhaobo',**{'age': 8,'gender': 'male'})

foo('zhaobo',age = 8,gender = 'male')

关键字参数有两个调用方式,第一种,最简单直接的调用,可以在字典前加入**,然后直接传入字典,打印出来之后就是传入的这一个字典;第二种,将字典的key-value写成对应的表达式,然后每一个表达式对应一个参数传入,最后也会打印出这个字典,注意在写参数的时候,key不能用引号包起来。

命名关键字参数

前面的关键字参数是传一个字典到函数中,然后在函数中打印出来也是一个字典的形式。命名关键字参数,即是指定这个字典的key,使得传入的参数只能是当前指定的这些key。如下代码:

# 一般情况

def power(name,*,age,gender):

print(name) # zhaobo

print(age) # 12

print(gender) # male

power('zhaobo',age = 12, gender = 'male')

power('zhaobo',**{'age': 12,'gender': 'male'})

# 有可变参数的情况

def power(name,*kw,age = 10,gender):

print(name) # zhaobo

print(kw) # ('param1', 'param2', 'param3')

print(age) # 12

print(gender) # male

power('zhaobo','param1','param2','param3',age = 12,gender = 'male')

power('zhaobo','param1','param2','param3',**{'age': 12, 'gender': 'male'})

power('zhaobo','param1','param2','param3',**{'gender': 'male'})

上述代码展示了对命名关键字调用的两种形式。在一般的形式中,命名关键字参数用*分隔,注意*两边要打上逗号,然后就是指定命名命名关键字参数的key值,在调用函数时,有两种方式,一是key = value的形式,key与定义函数的命名关键字参数对应(顺序可以不一样),注意这里的key不要用引号包起来;另一中方式就是直接传一个字典,然后在字典前面加上**。

在有可变参数的情况下,对函数的定义就不用再单独写*了,指定在可变参数后面定义好关键字参数即可,在调用上,也是有key = value,直接传字典两种形式,在可变参数后面指定关键字参数即可。

需要注意的是,命名关键字参数也可以指定默认值,指定了默认值即代表这个key可传可不传,如果没有指定默认值那个key的参数多传或者是漏传都会导致语法错误。

多种参数类型

在Python中定义函数,上述的五种参数是可以混合定义的,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

# 定义一个函数,包含上述若干种参数:

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)的形式调用它,无论它的参数是如何定义的。

python函数支持哪些参数类型_Python函数的几种参数类型相关推荐

  1. dhcp服务器有哪些消息类型,DHCP 协议的 8 种消息类型及功能服务器

    1) 主机发送 DHCP Discover 广播包在网络上寻找 DHCP 服务器: 单播数据包, 地址. 2) DHCP 服务器向主机发送 DHCP Offer 单播数据包,包含 IP 地址.MAC ...

  2. python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  3. python函数定义中参数列表里的参数是_python函数参数中的/和*是什么意思?

    在python3.8之后函数参数中允许出现/和*号,/用来指明某些函数形参必须使用位置参数而非关键字参数的形式,*出现在函数参数中第一种含义可以表示为可变参数,一般写作*args:对于单独出现在参数中 ...

  4. python函数定义中参数列表里的参数是_python函数定义中的参数说明

    原博文 2020-05-23 07:50 − > 描述函数定义时 涉及到的 位置参数,默认参数,关键字参数,可变参数等的概念及用法 ## 1 示例代码 ``` #! /usr/bin/env p ...

  5. python函数参数学习_python函数学习1

    函数1 (1)定义: def 函数名(参数列表) 函数体 (2)参数传递: 在python中,一切都是对象,类型也属于对象,变量是没有类型的. a = [1,2,3] a = "hellow ...

  6. python中函数分为哪四类_Python函数参数分类原理详解

    1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号,隔开 案列: # 利用函数的参数,定义一个可以完成任意两个数 ...

  7. 定义一个没有参数的函数、输出python3次_Python函数参数详解,三天让你掌握python,不再是小白

    原标题:Python函数参数详解,三天让你掌握python,不再是小白 引言 随着程序功能的增多,代码量随之增大,此时仍不加区分地把所有功能的实现代码放到一起,将会使得程序的组织结构不清晰,可读性变差 ...

  8. python函数参数列表_python函数列表

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python函数函数是python里组织代码的最小单元,python函数包含以下 ...

  9. python函数参数定义_Python函数定义及参数详解

    函数定义 首先我们来创建一个函数,输出指定范围内的斐波拉契数列(Fibonacci series). #!/usr/bin/env python #coding=utf-8 ''' Created o ...

最新文章

  1. 数组-移除元素(交换移除)
  2. java斗破苍穹游戏阵容,斗破苍穹手游竞技场阵容搭配解析 最强阵容你知道吗
  3. VTK:可视化之TextureMapImageData
  4. java web redis_java web redis使用(二)
  5. 2020年浙江高考考python吗_2020年浙江高考改革最新消息 浙江新高考规则解读
  6. 浮点类型float double 以及BigDecimal
  7. 无可奈何花落去,数据丢失时时来;何当共谈完整性,却话巴山夜雨时----详解SQL Server 数据库库完整性检查和置疑修复
  8. Linux 系统编程技巧与概念 第11章 不透明指针
  9. Lync Server新特性
  10. xxl-job使用笔记
  11. linux 递归查看文件个数,Linux下递归读取文件数量
  12. web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
  13. C文件编译、链接指令
  14. VS Code好看的主题
  15. 20155339 《信息安全技术》实验二、Windows口令破解实验报告
  16. w10 计算机配置在哪里,w10如何查看电脑配置
  17. 网盘有哪些?网盘哪个好用?
  18. 用网盘和git来管理资源
  19. 《CSS菜鸟教程》学习
  20. windows server2012R2 apache+mod_wsgi+django

热门文章

  1. mysql导出数据到文件_MySQL导出数据到文件中
  2. python自动化测试-基于 Python 的接口自动化测试实例
  3. python官网下载好慢-python 官网慢
  4. python对电脑配置要求-学python对电脑配置有要求么
  5. python编程入门-Python 基础教程
  6. 怒拒Facebook:语音识别大神、Kaldi之父将加盟小米
  7. 在vue项目中导入element-ui
  8. yarn在vscode里启动报错
  9. polyfill 与 transform-runtime
  10. 【动态规划】线性dp P1043 数字游戏