最近,在学习python,天天抱着廖雪峰的教材苦练,https://www.liaoxuefeng.com/

但廖老毕竟是如此的才华盈溢,我这等小辈真是读起来教程都有些费力。

关于python-函数中的参数类型和可变参数解析这一章,觉得不 是太清晰,又找了园子里又一位仁兄:http://www.cnblogs.com/tqsummer/ ,感激涕零,他写的真是浅显易懂

1、函数的定义:

def funca():
pass

  funca没有参数,同时啥也不干

2、位置参数:

>>> def funcb(x):
print(x * x)
>>> funcb(2)
4 
>>> def funcc(a,b):
print(a)
print(b)
>>> funcc(2,3)
2
3

很明显,我们需要使用函数名,加上圆括号的参数列表,参数顺序和个数要和函数中定义的一致,

>>> def funcc(a,b):
print(a)
print(b)
>>> funcc(2,3)
2
3
>>> funcc(4)
Traceback (most recent call last):
File "<pyshell#144>", line 1, in <module>
funcc(4)
TypeError: funcc() missing 1 required positional argument: 'b'

 以上的函数定义,都是在预选定义这个函数需要多少个参数的情况下使用,一般是没有问题的

3、默认参数

先来看一个例子:

>>> def funce(a,b):
print(a)
print(b)
>>> funce(5)
Traceback (most recent call last):
File "<pyshell#157>", line 1, in <module>
funce(5)
TypeError: funce() missing 1 required positional argument: 'b'

  funce(a,b)函数定义的没有问题,但是我的调用代码失败了,原因是我方法中新增了一个形参,但调用的时候少调用了一个参数,这个时候

默认参数就能用了

>>> def funce(a,b=5):
print(a)
print(b)
>>> funce(6)
6
5

 到这为止,固定参数已讲完,下面开始讲解可变参数,就是*(一颗星)与**(2颗星的差异)

4、可变参数(*a)

有些时候固定参数没办法满足我们的需求,我们需要使用*a来定义可变参数

>>> def funcd(a,b,*c):
print(a)
print(b)
print("length of c is :%d "% len(c))
print(c)
>>> funcd(1,2,3,4,5,6,7)
1
2
length of c is :5
(3, 4, 5, 6, 7)

 我们看到,前面1,2被a,b参数接收了,剩下的5个参数值,全部被c接收,以在这里是一个tuple(元组)

我们在调用funcd的时候,至少要传2个参数值,大于2个以上的参数值是存在c这个tuple中,如果只有2个值,那么c就是一个empty tuple

tuple和list非常类似,但是tuple一旦初始化就不能修改。tuple是用小括号表示的

5、可变参数(**)

上面的例子,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,在python中,还支持一种用关键字参数(keyword,argument)调用函数的方法,也就是在调用函数的时候,明确指定参数值付给哪个形参,比如还是上面的例子

>>> def funcf(a,b):
print(a)
print(b)
>>> funcf(b=3,a=5)
5
3

 结果是一样的,还是按参数名称的顺序来显示值

在函数调用中,可以混合使用基于位置匹配的参数 和关键字参数,前提必须是先给固定位置的参数

>>> def funcf(a,b):
print(a)
print(b)
>>> funcf(b=3,a=5)
5
3
>>> funcf(5,3)
5
3

 结果是一样的

好了,2颗星的终于可以上来了

如果一个函数中定义的最后一个形参有**(双星)前缀,所有正常形参之外的其它的关键字参数都将被放置在一个字典(dict)中传递给函数,例如:

>>> def funcj(a,**b):
print(a)
for x in b:
print (x + ":" + str(b[x]))
>>> funcj(200,b=500,d='aaa',c='xxx')
200
b:500
d:aaa
c:xxx

首先b是一个字典,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度

调用funcj的时候,除了第一个参数值a是200外,其它b\d\c都是b这个dict实例的参数值了

>>> funcj(200,400,500,'aaa')
Traceback (most recent call last):
File "<pyshell#175>", line 1, in <module>
funcj(200,400,500,'aaa')
TypeError: funcj() takes 1 positional argument but 4 were given

 这样调用显然是不行的,必须指定参数才可以。因为它是可变参数,没有固定形参来匹配,所以调用时候必须指定参数

 

道理都懂了,主要是用的时候看如何灵活运用即可。

 

 

python-函数中的参数类型和可变参数解析的更多相关文章

  1. Python函数中的可变参数

    在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...

  2. Python函数中参数类型

    在学习Python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂.在此做一个小结,加深理解. Python参数的定义 负责给函数提供一些必要的数据或信息,以保证函数 ...

  3. python函数中的参数类型

    python函数中的参数 动态获取函数的参数 python的函数类型详解

  4. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  5. python函数中把列表(list)当参数时的"入坑"与"出坑"

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑!! 入坑 def f(x,li=[]): for i in range(x): li.append(i*i ...

  6. Python——函数中的关键字参数

    关键字参数 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple.而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict.请看 ...

  7. 一道题带你搞定Python函数中形参和实参问题

    昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂.人生苦短,我用Python. 为了解答大家 ...

  8. python 函数中使用全局变量

    python 函数中如果需要使用全局变量,需要使用 global + 变量名 进行声明, 如果不声明,那么就是重新定义一个局部变量,并不会改变全局变量的值 n [1]: a = 3 In [2]: d ...

  9. OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析

    ☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...

随机推荐

  1. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式

    断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...

  2. Theories of Deep Learning

    https://stats385.github.io/readings Lecture 1 – Deep Learning Challenge. Is There Theory? Readings D ...

  3. Google MapReduce到底解决什么问题?

    很多时候,定义清楚问题比解决问题更难. 什么是MapReduce? 它不是一个产品,而是一种解决问题的思路,它有多个工程实现,Google在论文中也给出了它自己的工程架构实现. MapReduce这个 ...

  4. ES6,新增数据结构Set的用法

    ES6 提供了新的数据结构 Set. 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 单一数组的去重. let set6 = new S ...

  5. 【Linux技术】linux之configure,pkg-config和PKG_CONFIG_PATH

    linux之configure,pkg-config和PKG_CONFIG_PATH 1.初衷 1)前面在装gtk时冒出来一个pkg-config,当时虽然不大清楚它是个什么东西,不过大致了解了下它的 ...

  6. MATLAB左除和右除

    矩阵的除法包括左除(A\B).右除(A/B)和点除(A./B)三种. 一般情况下,x = A\b是方程组A*x = b的解, 而x = b/A是方程组x*A = b的解, x = A./B表示同型矩阵 ...

  7. [转]JSTL 与 JSP 或者 Java 相互传递变量的代码

    原文地址:http://blog.csdn.net/joyous/article/details/6689861 两种方式 <c:set var="s1" value=&qu ...

  8. [dts]AM4378的dts中配置和数据手册映射关系

    最近在设置AM4378 GPIO的时候产生了困惑 如何设置GPIO为output_pullup, output_pulldown, input_pullup, input_pulldown, high ...

  9. [培训]keysight培训

    DDR DDR->DDR2->DDR3->DDR4->DDR5->HBM, LPDDR(low power DDR)

  10. JDK自带观察者的使用

    被观察者 package observerForJDK; import java.util.Observable; /** * 新闻派发器,当有新的新闻时派发给所有的订阅读者(观察者) */ publ ...