Python函数相关
Python中的函数也是一种对象,而且函数还是一等公民。函数能作为参数,也能作为返回值,这使得Python中的函数变得很灵活。想想前面两篇中介绍的通过内嵌函数实现的装饰器和闭包。
下面就介绍一下Python函数相关的一写内容。
可变长度参数
在编程的过程中,可能会遇到函数参数个数不固定的情况,这时就需要使用可变长度的函数参数。在Python函数定义中,使用*和**符号分别指定元组(非关键字)和字典(关键字)作为参数。
非关键字变长参数(元组)
当函数被调用的时候,所有的参数都将值赋给了在函数声明中对应的局部变量,剩下的非关键字参数按照顺序添加到一个元组中便于访问。
可变长元组参数必须在位置和默认参数之后,所以使用可变长元组参数的函数形式一般如下(中括号表示可选参数),可变长元组参数前有一个"*"符号:
def funcName([fromal_args,] *tuple_grp_nonkw_args):
pass
看一个例子:
def argFunc(positional_arg, keyword_arg="foo", *tuple_grp_nonkw_args):
print "positional_arg:", positional_arg
print "keyword_arg:", keyword_arg
for arg in tuple_grp_nonkw_args:
print "additional_arg:", arg argFunc(3)
argFunc(3, 4)
argFunc(3, 4, "hello", "world")
代码的输出为:

关键字变长参数(字典)
除了上面的方式,Python还可以支持关键字变长参数,额外的关键字参数被放入了一个字典进行使用。
可变长字典参数必须是函数定义中的最后一个参数,所以使用可变长字典参数的函数形式一般如下(中括号表示可选参数),可变长字典参数前有一个"**"符号:
def funcName([fromal_args,] [*tuple_grp_nonkw_args,] **dict_grp_kw_args):
pass
看一个例子:
def argFunc(positional_arg, keyword_arg="foo", *tuple_grp_nonkw_args, **dict_grp_kw_args):
print "positional_arg:", positional_arg
print "keyword_arg:", keyword_arg
for arg in tuple_grp_nonkw_args:
print "additional non-keyword arg:", arg
for argKey in dict_grp_kw_args.keys():
print "additional keyword arg: {'%s': %s}" %(argKey, dict_grp_kw_args[argKey]) argFunc(3, 4, name="wilber", age=28)
argFunc(3, 4, "hello", "world", name="wilber", age=28)
代码输出为:

函数调用的完整形式为:
func( positional_args, keyword_args, *tuple_grp_nonkw_args, **dict_grp_kw_args )
在使用的过程中,所有参数都是可选的,但应当注意的是:上面四种参数的位置是不可调换的。
匿名函数(lambda)
Python允许使用lambda关键字创建匿名函数,通过lambda关键字,可以快速编写简单函数。
使用lambda关键字的形式为:
lambda [arg1 [, arg2, ... argN]]: expression
对于不经常被调用的简单函数,建议直接使用lambda表达式,方便简洁:
addNum = lambda x, y: x+y
print addNum
print "3 + 4 = ", addNum(3, 4)
几个内建函数
Python可以很好的支持面向对象编程,但是通过Python中以下几个内建函数和lambda表达式,也可以体验一下函数式编程。
filter()
filter函数的完整形式为filter(func, seq):调用一个布尔类型的函数func来遍历每一个seq中的元素,返回一个使func返回值为ture的元素的序列。
例如获取100以内的奇数:
print filter(lambda n: (n%2) == 1, range(100))
当然对于上面的例子,也可以使用列表解析实现:
print [i for i in range(100) if i%2 == 1]
map()
map函数的完整形式为map(func, seq1 [, seq2...]):将函数func作用于给定序列的每一个元素,并用一个列表来提供返回值;如果func为None,作用同zip()。
是不是被上面的描述搞晕了,还是看例子吧:
# map的func为None
print map(None, [4, 5, 6])
print map(None, [1, 2, 3], [4, 5, 6]) # map 针对一个序列
print map(lambda x: x*2, [4, 5, 6]) # map 针对多个序列
print map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
代码输出为:

reduce()
reduce函数的完整形式为reduce(func, seq [, init]):func是一个二元函数;reduce对seq中的每一个元素进行迭代,每次迭代将上一次的迭代结果(第一次时使用init,如没有init,则使用seq的第一个元素)与下一个元素执行func函数。
看一个例子,通过reduce函数进行求和操作:
print reduce(lambda x, y: x + y, range(10))
print reduce(lambda x, y: x + y, range(10), 100)
输出为:

根据上面的介绍,我们自己也可以实现一个reduce函数:
def xreduce(bin_func, seq, init=None):
Iseq = list(seq)
if init is None:
res = Iseq.pop(0)
else:
res = init
for obj in Iseq:
res = bin_func(res,obj)
return res
总结
本文介绍了Python函数相关的一些内容:
- 可变长参数
- 匿名函数lambda
- 内建函数filter(),map(),reduce
Python函数相关的更多相关文章
- python 函数相关定义
1.为什么要使用函数? 减少代码的冗余 2.函数先定义后使用(相当于变量一样先定义后使用) 3.函数的分类: 内置函数:python解释器自带的,直接拿来用就行了 自定义函数:根据自己的需求自己定义的 ...
- Python开发【第四篇】函数
函数的作用 函数可以让编程逻辑结构化以及模块化 无论是C.C++,Java还是Python,函数是必不可少的知识点,也是很重要的知识点,函数是完成一个功能的代码块,使用函数可以使逻辑结构变得更加清晰以 ...
- python拓展1 week1-week5复习回顾
知识内容: 1.python基础概念及基础语法 2.python基础数据类型 3.python模块相关 4.python函数相关 5.python面向对象相关 6.python文件处理相关 注:本节内 ...
- 有道笔记链接地址 -----关于python
一.python相关 python列表的操作[list[]]: http://note.youdao.com/noteshare?id=93922f3174b1d8fac04514064656 ...
- 『Python题库 - 填空题』151道Python笔试填空题
『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...
- python函数(一)
今天记一下学到的python函数相关知识. 目录: 1.函数简介 2.函数定义 3.函数参数 第一部分:函数简介 我们在编程过程中往往会碰到这样的事情-----很多地方都用到了相同的一段代码.虽 ...
- Python函数参数和注解是什么
四种参数 Python函数func定义如下: def func(first, *args, second="Hello World", **kwargs): print(first ...
- python之路(六)-函数相关
在没有学习函数之前我们的程序是面向过程的,不停的判断,不停的循环,同样的代码重复出现在我们的代码里.函数可以更好的提高我们的 代码质量,避免同样的代码重复出现,而只需要在用的时候调用函数即可执行.此为 ...
- python(2)-函数相关
可变参数 def enroll(name, gender, age=6, city='Beijing'): print 'name:', name print 'gender:', gender pr ...
随机推荐
- android开发(38) 使用 DrawerLayou t实现左侧抽屉式导航菜单
最近流行 左侧抽屉式的导航条菜单,知乎,360,QQ都使用了这样的导航菜单,我们也了解下: Android Design 的流行趋势:Navigation Drawer 导航抽屉 参考这篇文章:htt ...
- DBExportDoc V1.0 For MySQL
win7系统下或者64位系统下,安装完mysql-connector-odbc驱动后,直接进入:管理工具--数据源(ODBC),点击添加不显示该驱动,该问题解决如下:进入dos命令行,输入:C:\Us ...
- 如何利用jsp实现防盗链功能
index.jsp ----------------------------- Place your content here here is index jsp get header info a. ...
- JAVA多线程笔试题
一.题目内容 二.我的答案 利用了线程池.考虑了超时处理.不知道这样写是否还有其他问题,或者更好更优的解决方案? import java.util.*; import java.util.concur ...
- js类型判断的方法
var arr=[]; alert(Object.prototype.toString.call(arr)=='[object Array]');
- 我写的javascript常用静态方法类,分享给大家
util=function(){ return { $:function(id){ return document.getElementById(id); ...
- Sword websocket分析二
//websocket发送数据 int send(uint8_t* message, uint64_t message_size) { //掩码 ] = { 0x12, 0x34, 0x56, 0x7 ...
- 区分重载(overload),覆盖(Override)和隐藏(hide)
重载overload,这个概念是大家熟知的.在同一可访问区内被声名的几个具有不同参数列的(参数的类型.个数.顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载.重载不关 ...
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...
- Xianfeng轻量级Java中间件平台:流水号管理、组织机构管理
流水号管理:现实中,经常都会和流水号打交道,至于什么是流水号,简而言之,就是按照特定格式要求产生的一个号码,并且总是按照递增的规则生成的,对于要求比较高的业务,需要流水号是连续的,比如移动营业厅排号小 ...