编程语言中函数的定义:函数式逻辑结构化和过程化的一种编程方法。
def test(x):"The function definitions"
x+=1return x
def: 定义函数的关键字
test:函数名(): 内可定义形参
"":文档描述(非必要,但建议为函数添加描述信息)
x+=1: 泛指代码块或程序处理逻辑
return: 定义返回值
例子1、
def logger():withopen("a.txt","a+",encoding ="utf-8")as f:
f.write('end action\n')
def test1():print("in the test1")logger()
def test2():print("in the test2")logger()
def test3():print("in the test3")logger()test1()test2()test3()--->in the test1
in the test2
in the test3
---> #cat a.txt
end action
end action
end action
例子2、加入时间模块
import time
def logger():
time_format ='%Y-%m-%d %X' #%Y-%m-%d(年月日),%X(时:分:秒)
time_current = time.strftime(time_format) #按照上面的时间格式调用
withopen("a.txt","a+",encoding ="utf-8")as f:
f.write('%s end action\n'%time_current)
def test1():print("in the test1")logger()
def test2():print("in the test2")logger()
def test3():print("in the test3")logger()test1()test2()test3()--->in the test1
in the test2
in the test3
---> #cat a.txt
2019-09-0614:03:45 end action
2019-09-0614:03:45 end action
2019-09-0614:03:45 end action
例子3、关于函数的return
def test1():print("in the test1")return0
x =test1() #x就代表test1函数体中return返回的结果
print(x)--->in the test1
0
例子4、有return和无return的区别
def test1():print("in the test1")
def test2():print("in the test2")return0
def test3():print("in the test3") #返回值可以是任意的数据类型,多的话返回一个元组
return1,['lishang','zhaoxiaomeng'],{'lishang':'zhaoxiaomeng'},'zxm love ls'
x =test1()
y =test2()
z =test3()print(x) #test1没有return,返回值将为空(None)print(y) #y=0print(z) #z=(1,['lishang','zhaoxiaomeng'],{'lishang':'zhaoxiaomeng'},'zxm love ls')--->in the test1
in the test2
in the test3
None
0(1,['lishang','zhaoxiaomeng'],{'lishang':'zhaoxiaomeng'},'zxm love ls')
#函数第三行的(name)就是局部变量,只在局部生效
def change_name(name):print("before name:",name)
name ="LiShang" #这个函数是这个变量的作用域,这里改变的name只在函数中生效
print("after name:",name)
name ="lishang"change_name(name)print("name:",name) #因此哪怕函数中已经改为了大写,最后输出的还是小写
--->
before name: lishang
after name: LiShang #只改变了函数中的变量
name: lishang #输出与一开始一致
3.2、全局变量
#函数中的(school)是局部变量,只影响函数中他自己
#最外层定义的(school)是全局变量,函数中的school改变,它不会变
school ="old boy" #全局变量
def change_name(name):
school ="baoge edu" #局部变量
print("before name:",name,school)
name ="LiShang"print("after name:",name)
name ="lishang"change_name(name)print("name:",name)print(school)--->
before name: lishang baoge edu #这里输出的是函数中局部变量(school)的值
after name: LiShang
name: lishang
old boy #这里输出的是最外层全局变量的值
3.3、如果要在局部改全局变量,添加—global------但是不要用这种方式
school ="old boy" #全局变量
def change_name(name):
global school #加上这个,在局部可修改全局变量
school ="baoge edu" #局部变量
print("before name:",name,school)
name ="LiShang"print("after name:",name)
name ="lishang"change_name(name)print("name:",name)print(school)--->
before name: lishang baoge edu
after name: LiShang
name: lishang
baoge edu #这次就输出了局部变量中(school)的值
def calc(n):print(n)returncalc(n+1)calc(0)``--->123...995
RecursionError: maximum recursion depth exceeded while calling a Python object
当调用python的时候,超出了最大的递归深度,内部保护机制,最大深度为999层
一、定义
简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。主要思想是
把运算过程尽量写成一系列嵌套的函数调用。
举例来说,现在有这样一个数学表达式:(1+2)*3-4
传统的过程式编程,可能这样写:
var a =1+2;var b = a *3;var c = b -4;
函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:
var result =subtract(multiply(add(1,2),3),4);
这段代码再演进以下,可以变成这样
add(1,2).multiply(3).subtract(4)
这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函数式编程的代码更容易理解。
要想学好函数式编程,不要玩py,玩Erlang,Haskell, 好了,我只会这么多了。。。