Python

函数是一个能完成特定功能的代码块,可在程序中重复使用,减少程序的代码量和提高程序的执行效率。在python中函数定义语法如下:

def  function_name(arg1,arg2[,…]):
statement
[return value]

返回值不是必须的,如果没有return语句,则Python默认返回值None。

>>> def hello():
... print 'Hello World!'
...
>>> res = hello()
Hello World!
>>> res
>>> print res
None
>>> type(res)
<type 'NoneType'>
>>>

Python函数没有声明和定义的区分。

python函数能返回多个值?

>>> def foo():
... return 1,'',[1,'a']
>>> res = foo()
>>> print res
(1, '', [1, 'a'])
>>> res
(1, '', [1, 'a'])
>>> type(res)
<type 'tuple'>
>>>

Python看起来能返回多个返回值,但其实是一个元组,因为元组在语法上不需要一定带上圆括号。

所以表面上看上去是返回了多个值,实际上上述代码是组包和解包的过程,元组使用逗号打包,序列通过放置几个逗号分隔的目标到语句的左边来解包。

函数也是对象,可以被引用,可以作为函数的参数,可以作为容器对象的元素,如List, Dictionary等。

>>> def func():
... print 'call func.'
...
>>> def foo(func):
... func()
...
>>> foo(func)
call func.
>>>

函数参数:
参数的传递规则如下:

p  参数的传递是通过把对象赋值给局部的名字。

赋值在Python中就意味着引用。函数中的参数与调用者共同引用的同一个对象。

p  在函数内部中给参数赋值不会影响调用者。
p  在函数内部修改可变类型的参数会影响到调用者。

参数的行为可以与C语言进行类比:

p  不可变类型的参数的行为就像C语言的“by value”方式。

如参数是整数,字符串

p  可变类型的参数的行为就像C语言的“by pointer”方式。

如参数是列表

参数匹配的模式:

p  位置:位置匹配,从左到右
p  关键字:根据参数名进行匹配
p  可变参数:匹配任意多的参数
p  默认值:提供参数的默认值
 
Syntax  Location  Interpretation
func(value)  Caller  Normal argument: matched by position
func(name=value)  Caller  Keyword argument: matched by name
def func(name)  Function  Normal argument: matches any by position or name
def func(name=value)  Function  Default argument value, if not passed in the call
def func(*name)  Function  Matches remaining positional args (in a tuple)
def func(**name)  Function  Matches remaining positional args (in a dictionary)
 
规则:
p 默认参数必须在非默认参数之后
p  在单个函数定义中,只能使用一个tuple参数(*ARG)和一个字典参数(**ARG)
p  tuple参数必须在位置参数和默认参数之后
p  字典参数必须在最后定义
 

python函数是否支持重载?

重载(overload)的特点:

1、参数类型不同

2、参数个数不同

Python的动态类型+可变参数,天然就支持了重载的特性,而且不需要像C++那样去定义多个同名函数。动态类型的特性还让python函数具备了C++中函数模板的功能。

lambda表达式/匿名函数:

lambda [arg1[, arg2, … argN]]: expression

注意:表达式与参数以及lambda都必须在同一行。lambda 函数可以接收任意多个参数(包括 可选参数)并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。

>>> foo = lambda x,y:x+y
>>> foo(1,3)
4
>>> (lambda x,y:x+y)(5,4)
9
>>>

内嵌函数:在函数内部定义函数

在函数体内创建另外一个函数是合法的,内部函数整个函数体都在外部函数的作用域内,除了在函数体内,任何地方都不能对其进行调用

>>> def foo():
... def inner():
... print 'call inner.'
... print 'call foo'
... inner()
...
>>> foo()
call foo
call inner.
>>>

Python基础(7) - 函数的更多相关文章

  1. python基础——匿名函数

    python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.  在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...

  2. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  3. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  4. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  5. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  6. 八. Python基础(8)--函数

    八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x):     ' ...

  7. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  8. Python学习笔记(一)python基础与函数

    1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world > ...

  9. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  10. Python基础__函数

    本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...

随机推荐

  1. [LeetCode 题解]: palindromes

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  2. mysql 循环插入

    在mysql添加测试数据,想和mssql一样用循环实现,发现不管怎么样都执行失败 经查询发现mysql不支持匿名块,只能先创建出一个存储过程,执行,然后删除 CREATE PROCEDURE test ...

  3. MySQL分页查询存储过程

    -- 分页查询delimiter $create procedure p_List(in i_Name varchar(50),in i_CName varchar(20),in pageIndex ...

  4. centos 7 安装mysql5.6rpm格式

    1查看是否安装了mysql   rpm -qa|grep -i mysql 如果安装了请卸载:rpm -e --nodeps MySQL... 2.没有安装则进行如下操作 下载mysql rpm ta ...

  5. javascript小数求整

    Math.ceil(arg) 返回一个比参数arg大的整数 Math.floor(arg) 返回一个比参数arg小的整数 Math.round(arg) 返回一个参数arg四舍五入的后的整数 pars ...

  6. OI图论 简单学习笔记

    网络流另开了一个专题,所以在这里就不详细叙述了. 图 一般表示为\(G=(V,E)\),V表示点集,E表示边集 定义图G为简单图,当且仅当图G没有重边和自环. 对于图G=(V,E)和图G2=(V2,E ...

  7. “全栈2019”Java第三十六章:类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Java面试必问

    1. 图灵 1.1 聊聊哈希算法与HashMap 1)一个优秀的哈希算法有什么特点? 快速.不可逆.敏感性.低碰撞性 2)自己写一个Hash算法 取模 3)Java中的Hash算法 HashMap,侧 ...

  9. java使用freemarker导出复杂的excel表格

    正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel. 1.都是先生成一个Excel表格的模板,最好是增加一行数据.具体看图里 ...

  10. ubuntu配置多网,网关不起作用的问题

    在/etc/network/interfaces 中设置网络 auto eth0 iface eth0 inet static address 192.168.50.1 gateway 192.168 ...