一、函数参数的类型

  之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求。而在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. Linux 命令 - cd: 切换工作目录

    命令格式 cd [directory] 实例 a) 将工作目录切换成主目录. cd # 或 cd ~ b) 将工作目录切换成当前工作目录的父目录. cd .. c) 将工作目录切换成上一个的工作目录. ...

  2. DialogFragment

    DialogFragment 从Android 3.0 (API level 11)开始引入,如果想在低于该版本的系统上使用,需用android.support.v4.app.DialogFragme ...

  3. sql常识-SQL 通配符

    在搜索数据库中的数据时,您可以使用 SQL 通配符. SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符. SQL 通配符必须与 LIKE 运算符一起使用. 在 SQL 中, ...

  4. 【网络收集】Sql Server datetime 常用日期格式转换

    ) , sfrq, ) 我们经常出于某种目的需要使用各种各样的日期格式,当然我们可以使用字符串操作来构造各种日期格式,但是有现成的函数为什么不用呢? SQL Server中文版的默认的日期字段date ...

  5. Android布局属性全面剖析

    第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:la ...

  6. 链接器工具错误 LNK2011

    问题描述: 使用visual studio 2015编译apr-iconv失败,提示"链接器工具错误 LNK2011:未链接预编译对象:映像可能不能运行"错误. 原因分析: MSD ...

  7. Aliyun OSS SDK 异步分块上传导致应用异常退出

    问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...

  8. TCP/IP——内外网IP+子网掩码作用+PING(网络总结)

    目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...

  9. Android类库打包方法探究

    原文地址: http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html 开发Android应用的时候,对于可用 ...

  10. PERL 脚本

    PERL: Practical Extraction and Report Language 参考文档 1.Perl 5 version 24.0 documentation