Python函数与函数式编程

函数

进行结构化的一种编程方法,是重要的代码组织和复用手段,能节省空间和保持一致性。

参数

  • 位置参数(位置参数必须以在被调用函数中定义的准确顺序来传递)
  • 关键字参数(关键字参数必须位于位置参数之后)
参数组(可变长度的参数)

func(*tuple_grp_nonkw_args, **dict_grp_kw_args)

  • *tuple_grp_nonkw_args是以元组形式体现的非关键字参数组
  • **dict_grp_kw_args是装有关键字参数的字典

返回多个值

其实只是返回了一个对象,也就是一个元组,最后该元组会被拆包到各个结果变量中

返回对象的数目Python实际返回的对象
0None
1object
1
tuple

函数亦为对象(传入函数)

将函数作为参数传递,并在函数体内调用这些函数

#! /usr/bin/env python

def convert(func, seq):
    return [func(eachNum) for eachNum in seq]

myseq = (123, 45.67)
print convert(int, myseq)
print convert(long, myseq)
pirnt convert(float, myseq)

[123, 45]
[123L, 45L]
[123.0, 45.67]
>>> sorted(sent)
[...]
>>> sorted(sent, cmp)
[...]
>>> sorted(sent, lambda x, y : cmp(len(x), len(y)))
[...]

将需要执行的所有运算做成一个列表

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

clean_ops = [str.strip, remove_punctuation, str.title]

def clean_strings(strings, ops)
    result = []
    for value in strings:
        for function in ops:
            value = function(value)
        result.append(value)
    return result

clean_strings(strings, clean_ops)

这种多函数模式能在很高的层次上轻松修改字符串的转换方式。增强可复用性

函数式编程

匿名函数(lambda)

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

内建函数

filter(func, seq): 调用一个布尔函数func来迭代遍历每个Seq中的元素,返回一个使func返回值为true的元素的序列

map(func, seq):将函数调用映射到每个序列的元素上,并返回一个含有所有返回值的列表。

reduce(func, seq):使用了一个二元函数(一个接受带两个值作为输入,进行了一些计算然后返回一个值作为输出)

reduce(func, [1,2,3]) = func(func(1,2),3)

闭包:返回函数的函数

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量

闭包也是函数,但是他们能携带一些额外的作用域

注意: 虽然可以修改任何内部状态对象(比如向字典中添加键值对),但不能绑定外层函数作用域中的变量。

解决方法: 修改字典或者列表,而不是绑定变量。

def counter():
    count = [0]
    def incr():
        count[0] += 1
        return count[0]
    return incr

>>>count = counter()
>>>print count()
1
>>>print count()
2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值