码迷,mamicode.com
首页 > 其他好文 > 详细

函数与函数式编程

时间:2016-08-05 18:01:20      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:python基础   函数和函数式编程   

函数与函数式编程

  1. 介绍


在过去的十年间,大家广为熟知的编程方法无非两种:面向对象和面向过程,其实,无论哪种,都是一种编程的规范或者是如何编程的方法论。而如今,一种更为古老的编程方式:函数式编程,以其不保存状态,不修改变量等特性重新进入人们的视野。下面我们就来依次了解这一传统的编程理念,让我们从基本的函数概念开始。


函数定义:


初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域


编程语言中函数定义:函数是逻辑结构化和过程化的一种编程方法。

python中函数定义方法:

def test(x):
    "The function definitions"
    x+=1
    return x
    
def:定义函数的关键字
test:函数名
():内可定义形参
"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值


补充:

   函数式编程就是:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。至于具体如何实现和这么做的好处,后续我会详细介绍。


为何使用函数


没有函数的编程只是在写逻辑(功能),想脱离函数,重用你的逻辑,唯一的方法就是拷贝


例一:

假设我们编写好了一个逻辑(功能),用来以追加的方式写日志:
with open(‘a.txt‘,‘ab‘) as f:
    f.write(‘end action‘)


现在有三个函数,每个函数在处理完自己的逻辑后,都需要使用上面这个逻辑,那么唯一的方法
就是,拷贝三次这段逻辑

def test1():
    print ‘test1 starting action...‘
    
    with open(‘a.txt‘,‘ab‘) as f:
        f.write(‘end action‘)
    
def test2():
    print ‘test2 starting action...‘
    
    with open(‘a.txt‘,‘ab‘) as f:
        f.write(‘end action‘)
     
def test3():
    print ‘test3 starting action...‘

    with open(‘a.txt‘,‘ab‘) as f:
        f.write(‘end action‘)
 
 
那么假设有>N个函数都需要使用这段逻辑,你可以拷贝N次吗?


例二:

优化后的代码

def logger_test():
    with open(‘a.txt‘,‘ab‘) as f:
    f.write(‘end action‘)
def test1():
    print ‘test1 starting action...‘
    
    logger_test()
    
def test2():
    print ‘test2 starting action...‘
    
    logger_test()
     
def test3():
    print ‘test3 starting action...‘

    logger_test()


例三:

需求变了(让我们来为日志加上时间吧)

import time
def logger_test():
    time_format=‘%Y-%m-%d %X‘
    time_current=time.strftime(time_format)
    with open(‘a.txt‘,‘ab‘) as f:
    f.write(‘time %s end action‘ %time_current)
def test1():
    print ‘test1 starting action...‘
    
    logger_test()
    
def test2():
    print ‘test2 starting action...‘
    
    logger_test()
     
def test3():
    print ‘test3 starting action...‘

    logger_test()


总结例二和例三可概括使用函数的三大优点

1.代码重用

2.保持一致性

3.可扩展性


函数和过程


过程定义:过程就是简单特殊没有返回值的函数

这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程,没错,但是在python中有比较神奇的事情


def test01():
    msg=‘hello The little green frog‘
    print msg

def test02():
    msg=‘hello WuDaLang‘
    print msg
    return msg


t1=test01()

t2=test02()


print ‘from test01 return is [%s]‘ %t1
print ‘from test02 return is [%s]‘ %t2


总结:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,

所以在python中即便是过程也可以算作函数。


函数返回值
def test01():
    pass

def test02():
    return 0

def test03():
    return 0,10,‘hello‘,[‘alex‘,‘lb‘],{‘WuDaLang‘:‘lb‘}

t1=test01()
t2=test02()
t3=test03()


print ‘from test01 return is [%s]: ‘ %type(t1),t1
print ‘from test02 return is [%s]: ‘ %type(t2),t2
print ‘from test03 return is [%s]: ‘ %type(t3),t3


总结:

   返回值数=0:返回None

   返回值数=1:返回object

   返回值数>1:返回tuple


函数调用


调用方法:

    1.test()执行,()表示调用函数test,()内可以有参数也可没有

参数:

    1.形参和实参

    形参:形式参数,不是实际存在,是虚拟变量,。在定义函数和函数体的时候使用形参,      目的是在函数调用时接收实参(实参个数,类型应与实参一一对应)

    实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参

    2.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)

    3.默认参数

   4.参数组


阿斯蒂芬按时打发第三方大事发生的f# with open(‘a.txt‘,‘wb‘) as f: #     f.writelines([‘hello %s lhf\n‘ %i for i in range(10000)]) with open(‘a.txt‘,‘rb‘) as f:     offset=-100     while True:         f.seek(offset,2)         l=f.readlines()         if len(l) > 1:             last_line=l[-1]             break         offset*=2     print last_line

本文出自 “一个好人” 博客,请务必保留此出处http://egon09.blog.51cto.com/9161406/1834777

函数与函数式编程

标签:python基础   函数和函数式编程   

原文地址:http://egon09.blog.51cto.com/9161406/1834777

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!