一、函数参数的类型

  之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求。而在Python中还有一种是通过参数名字来匹配的,这样一来,不需要严格按照参数定义时的位置来传递参数,这种参数叫做关键字参数。

>>> def display(a,b):
  print a
  print b

>>> display('hello','world') # 位置参数,即参数是通过位置进行匹配
hello
world
>>> display('hello') # 这样会报错 Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
display('hello')
TypeError: display() takes exactly 2 arguments (1 given)
>>> display('world','hello')
world
hello
>>>
>>> display(a='hello',b='world') # 关键字参数
hello
world
>>> display(b='world',a='hello')
hello
world # 可以看到通过指定参数名字传递参数的时候,参数位置对结果是没有影响的。

关键字参数最厉害的地方在于它能够给函数参数提供默认值

>>> def display(a='hello',b='wolrd'):   # 分别给a和b指定了默认参数
print a+b

>>> display()
hellowolrd
>>> display(b='world') # 如果不给a或者b传递参数时,它们就分别采用默认值
helloworld
>>> display(a='hello')
hellowolrd
>>> display('world') # 没有指定'world'是传递给a还是b,则默认从左向右匹配,即传递给a
worldwolrd

注意:在重复调用函数时默认形参会继承之前一次调用结束之后该形参的值

>>> def insert(a,L=[]):
L.append(a)
print L

>>> insert('hello')
['hello']
>>> insert('world')
['hello', 'world'] # 重复调用函数时默认形参会继承之前一次调用结束之后该形参的值

二、任意个数参数(包裹传递)

在无法确定参数的个数,就可以使用收集参数了,使用收集参数只需在参数前面加上'*'或者'**'。

'*'和'**'表示能够接受0到任意多个参数,'*'表示将没有匹配的值都放在同一个元组中,'**'表示将没有匹配的值都放在一个字典中。

>>> def func(*name):         # * 表示将没有匹配的值放在同一个元组中
print type(name)
print name >>> func(1,4,6)
<type 'tuple'>
(1, 4, 6)
>>> func(5,6,7,1,2,3)
<type 'tuple'>
(5, 6, 7, 1, 2, 3) >>> def func(**dict): # ** 表示将没有匹配的值放在同一个字典中
print type(dict)
print dict >>> func(a=1,b=2)
<type 'dict'>
{'a': 1, 'b': 2}
>>> func(m=4,n=5,c=6)
<type 'dict'>
{'c': 6, 'm': 4, 'n': 5}

三、递归

如果函数包含了对其自身的调用,该函数就是递归的。

1 def factorial(n):    # 阶乖函数
2 if n==0:
3 return 1 # 0的阶乖返回1
4 else:
5 return n*factorial(n-1) # n的阶乖则返回 n*f(n-1)
6
7 print factorial(10)

四、lambda函数

lambda函数也叫匿名函数,即,函数没有具体的名称。

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,也可以没有,冒号右边的返回值,lambda语句构建的其实是一个函数对象。

>>> g = lambda x : x * 2     # :左边表示参数,右边表示返回值
>>> print g(2)
4

lambda 函数好处:

1、在不需要再复用的地方用lambda,免去函数名,省去函数定义的过程

2、代码更精简

python学习笔记12(函数三): 参数类型、递归、lambda函数的更多相关文章

  1. Python学习笔记【第五篇】:基础函数

    一.函数:函数定义关键字def  后跟函数名称 def 函数名(参数):             ...     函数体     ...     返回值 案例: # 定义函数 def say_hei( ...

  2. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  3. Python 学习笔记12 函数模块

    函数的优点之一,使用它们可将代码块与主程序分离.通过给函数指定描述性的名称.可以让主程序非常好理解.但是如果将过多的函数和主程序放置在一起,会让文件显得非常凌乱.太多的代码混杂在一起,不方便管理.我们 ...

  4. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  5. Python学习笔记 for windows 三

    多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 哺乳类:能跑的哺乳类,能飞的哺乳类: 鸟类:能跑的鸟类,能飞的鸟类. class Animal(object): ...

  6. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

  7. Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝

    python中的对象和类型 在python中,认为系统中的每一个"东西"都是一个对象,在python中,"对象"有着特殊的意义,python中的对象有: 一个标 ...

  8. python学习笔记:第三天(数字)

    Python3 数字(Number) 1. 数字数据类型 用于存储数值.数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 实例在变量赋值时 Number 对象将被创建, ...

  9. Python学习笔记(1)对象类型

    强制转换字符串函数str 如果我们求2的一百万次方是多少那么我们可以 print(2**1000000) 如果我们要求2的一百万次方有多少位那么我们可以用str函数强制转换成字符串然后len函数计算 ...

随机推荐

  1. 查锁表及kill

    当一个表一直被锁住而无法进行操作的时候,可以用如下方法 select l.session_id sid, s.serial#, l.locked_mode 锁模式, l.oracle_username ...

  2. saltstack实战3--配置管理之pillar

    数据系统-Pillar pillar和grains类似,但是它能给minion指定它想要的数据,安全性较好,另外它是在master端设置的   应用场景: grains的特性–每次启动汇报.静态决定了 ...

  3. memcached和redis的区别和应用场景

    一:特性和对比 1.性能上:      性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比 Memcached性能更高 ...

  4. Tomcat - JNDI 配置

    1. Create Your JavaBean Class Create the JavaBean class which will be instantiated each time that th ...

  5. 关于JAVA System常见类的一些总结

    一.JAVA System类概述 1.概述: System 类是一个抽象类,所有的字段和方法都是静态的,即不能被实例化.其中包含一些有用的类字段和方法,它不能被实例化.在 System 类提供的设施中 ...

  6. cocos2dx-lua class语法糖要注意了

    cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便 看定义 function class(classname, super) local ...

  7. 浏览器userAgent大全

    iPhone ●iOSMozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Versi ...

  8. java基础-基础类型包装类型

    想要对基本类型数据进行更多的操作,最方便的方式就是将其封装成对象. 为啥呢?因为在对象描述中就可以定义更多的属性和行为对该基本数据类型进行操作. [八种基本数据类型的包装类] byte --Byte ...

  9. 第一个C++

    输入:cin>>(相当于scanf)   #include <iostream> using namespace std; int main() { int number;   ...

  10. IIS上的错误与解决方案

    1.未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序. 解决方案:在IIS上打开该网站应用程序池-->高级设置-->启动32位程序-->选True