学习日志---python(函数式编程)

函数式编程

后面的闭包和装饰器很重要,参数可以是函数,把函数传进去参与运算。

过程是一个没有返回值的函数,函数本身也是一个对象,因此可以赋值给引用;

一个模块中函数不可重名,因此不支持重载,因为python是以函数名来识别调用的哪一个;

模块中函数的定义是自上而下的;

可以多个返回值,看作是一个元组;也可以分开多个变量接受返回值;

def p():
    return 1,2,3
a=p()
print a
a,b,c=p()
print a,b,c

函数的属性

文档属性:__doc__

可以对函数直接传东西进去;

函数参数

位置参数,必须传入;默认参数,可传入,在函数定义时用=..输入默认值,在外界不传入时,使用默认值;可变长度参数,*args元组类型的可变参数,**kwargs字典类型的可变参数;

这几种不同的参数类型可以单个使用,也可以一同使用。

#       位置参数,默认参数,可变参数(元组,字典)
def func(name,count=1,*args,**kwargs):
    print name
    print count
    print args
    print kwargs

# 如果传入为确认名字值,和函数一样,则对号入座
func(count=1,name=2)

func("python",12,13,14,15,code=12)
# 对应输出为  
   python
   12
   (13, 14, 15)
   {‘code‘: 12}
   
func("python",*(12,13,14,15),**{‘code‘=12})
#这里后面的可变参数会有一部分当作默认参数传入,即12当作默认传入,后面才是可变参数

函数的参数,只有满足前面的参数,才会依次使用,位置参数一定要传入。

Lambda

本身也是一个函数,是一个匿名函数,只能是一行

#表示传入x,返回x+1
a = lambda x:x+1
print a(1)

变量的作用域

x = 1
def func():
    #这里的global作用是声明这个x是外部的x
    global x
    x+=1
    print x

func()

函数的闭包:

def f1(x):
    def f2(y):
        return x*y
    return f2
#这里把函数f1的值传入后,给f2,相当于在操作F2之前,注入了一个预先的值,输入了x
f2 = f1(10)
#输入了y
print f2(10)

装饰器

@start(‘shizhen‘)

这个就是装饰器,用在函数的上面

函数的调用可以是一层一层的,外面传入参数,内层的可以使用;

def start(name):
    def wrapper(f):
        def wrapper1():
            print "start by "+name
            f()
        return wrapper1
    return wrapper

#装饰器要放在函数的上面
@start(‘shizhen‘)
def f():
    print "function"

#这里运行时运行@的这个函数start,会把f这个函数在第二层的时候传进去执行,特点是参数可以是函数,
 不再只是单独的对象,而是函数。start的第一层如果无参数‘shizhen’的话,则直接传入f函数。
f()


练习题:

1.实现一个函数max,接受任意个整数的参数,返回其中的最大值

def max(*args):
    length = len(args)
    if length == 0:
        print "empty"
    else:
        result = args[0]
        for i in range(0,length):
            if result < args[i]:
                result = args[i]
        print " max is "  + str(result)

max(1,2,3,5,2,3,7,8,2,1,10)

2.实现一个带参数的装饰器@callfunction(caller name), 传入的参数是调用者的名字,在调用函数之前,先打印一句 "The caller is [caller name]"的log

def callfunction(name):
    def wrapper(f):
        #这一层的作用是传入f的传入参数,这里是空,可用*args(可变参数)作为通用的参数
        def wrapper1():
            print "the caller is " + name
            f()
        return wrapper1
    return wrapper

@callfunction("shizhen")
def f():
    print "shizhen is so cool"

f()

装饰器需要一层一层的先把参数和函数全都传入后,在内部自建一层才能把前面传入的所有进行运算。

callfunction(‘shizhen‘)(f)()

3.实现一个装饰器@timeit, 这个装饰器的作用是当函数执行完毕以后,打印出来具体使用的时间

#第一层传入func函数
def timeit(f):
    #第二层传入func函数的输入参数
    def wrapper(*args,**kwargs):
        print (time.strftime("%H:%M:%S"))
        f(*args,**kwargs)
        print (time.strftime("%H:%M:%S"))
    return wrapper

@timeit
def func(*args):
    for i in range(0,len(args)):
        if args[i] > 10:
            print "find:" + str(args[i])
            time.sleep(1)

func(1,23,12,31,2,1,23,12,31,23,1,23,1,23,4,3,42,3,42,34,111)

函数式编程时,参数的传入是分开的,一个整体一个整体的传,先传函数本体,再传函数的输入参数

timeit(f)(*agrs)

*agrs也就是可以是多个参数,也可以是没有参数。

*args,**kwargs。用这两个作为参数的函数接受参数是非常安全的。

也就是一层一层的把东西传入进去,装饰器参数+函数+函数参数(*args,**kwargs这个很安全)。。

时间: 2024-10-13 01:16:38

学习日志---python(函数式编程)的相关文章

【人生苦短 Python当歌】——Python函数式编程01

对Python有一定了解的人应该知道,Python并不是一门函数式编程语言,而是一门支持多种范式的语言,这也使得在Python中也能实现函数式编程, 对于学习到Python函数式编程的朋友,在这里推荐大家看一本名字叫<Python函数式编程>(Functional Programming in Python)从这本书中你应该能收获不少: 怎么说呢,函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就把复杂的任务分解成简单的任务,这种就称为面向过程的程序设

Python 函数式编程学习

描述:通过将函数作为参数,使得功能类似的函数实现可以整合到同一个函数. Before 1 def getAdd(lst): 2 result = 0 3 for item in lst: 4 result += item 5 return result 6 7 def getMul(lst): 8 result = 1 9 for item in lst: 10 result *= item 11 return result 12 13 print getAdd([1,2,3,4]) 14 pr

我是如何开始去了解Python函数式编程--Python函数式编程初涉

Python函数式编程 1. 开始我们会了解什么是函数式编程: 函数:function 函数式:functional,一种编程范式 函数式编程特点:把计算视为函数而非指令,贴近计算 纯函数式编程:不需要变量,没有副作用,测试简单,支持高阶函数,代码简洁 Python支持的函数式编程特点: 不是纯函数式编程:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度的支持匿名函数 2. 高阶函数 变量可以指向函数,函数名其实就是指向函数的变量,而高阶函数其实就是可以接

学习《Python核心编程》做一下知识点提要,方便复习(一)

学习<Python核心编程>做一下知识点提要,方便复习. 计算机语言的本质是什么? a-z.A-Z.符号.数字等等组合成符合语法的字符串.供编译器.解释器翻译. 字母组合后产生各种变化拿python来说就是.keyword.数值,类,函数,运算符,操作符...... 1.变量不用声明,类型不固定 2.True,False = False,True读出了什么?True是个bool()类实例 3.类型工厂函数就是python2.2后把int() bool()等对数据类型操作的函数分装成对象 类 了

深入浅出 Python 函数式编程

1.函数式编程的定义与由来 如果程序中的函数仅接受输入并产生输出,即输出只依赖于输入,数据不可变,避免保存程序状态,那么就称为函数式编程(Functional Programming,简称FP,又称泛函编程). 这种风格也称声明式编程(Declarative Programming),与之相对的是指令式编程(Imperative Programming),后者中的对象会不断修改自身状态.函数式编程强调程序的执行结果比执行过程更重要,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算

Python 函数式编程之迭代器、生成器及其应用

python 标准库中提供了 itertools, functools, operator三个库支持函数式编程,对高阶函数的支持,python 提供 decorator 语法糖. 迭代器 (iterator)和生成器(generator)概念是 python 函数式编程的基础,利用迭代器和生成器可以实现函数式编程中经常用到的 map(), filter(), reduce() 等过程以及 itertools, functools 中提供的绝大部分功能. 1.迭代器和生成器基础(next, ite

python函数式编程,列表生成式

1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 1 >>> dic={'name':'zhangsan','age':24,'city':'jinhua'} 2 >>> for key,value in dic.items(): 3 print(key,value) 4 5 6 name zhangsan 7 age 24 8 city jinhua 循环

(转)Python函数式编程——map()、reduce()

转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于seq中的每一个元素,并用一个列表给出返回值.如果func为None,作用通zip().当seq只有一个时,将func函数作用于这个seq的每一个元素上,得到一个新的seq. 举个例子来说明,(假设我们想要得到一个列表中数字%3的余数,那么可以写成下面的代码): >>> print map(la

Python函数式编程——map()、reduce()

文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年Apache的Hadoop项目[2]正式将MapReduce纳入到项目中. 好吧,闲话少说,今天要介绍的是Python函数式编程中的另外两个内建函数map()和reduce(),而不是Google的MapReduce. 1.ma

Python函数式编程——filter()、map()、reduce()

提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年Apache的Hadoop项目[2]正式将MapReduce纳入到项目中. 好吧,闲话少说,今天要介绍的是Python函数式编程中的另外两个内建函数map()和reduce(),而不是Google的MapReduce. 1.filter() 格式:filter( func, seq ) 该内建函数的作