数学函数
函数定义
传统函数的定义:给定一个集合A,假设其中的元素为x,现对A中的元素x实加对应法则f,记作f(x),得到另一个数集B。假设B中的元素为y,则x和y直接的等量关系可以用y=f(x)表示,我们把这个关系式就叫函数关系式。
近代函数的定义:设A,B是非空的数集如果按照某种确定的对应关系f,使对于集合A中任意一个数x,在集合B中有唯一确定的数y和它对应,那么就称映射f:A-B为集合A到B的一个函数y=f(x)
数学模型
数据表模型
映射模型
由映射关系图可知,一个自变量x经过关系式后得到唯一的一个值,其中这个关系式也叫函数,得到的这个值就叫做函数返回值
函数模型
转化为程序语言为:
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-14
def f(x):
y = 0
if x < 0:
y = x-10
return y
elif x > 0:
y = x+10
return y
print(f(3))
运行结果:
[python@centos7 414]$./t.py
13
模型对照总结
- 函数返回值是一个具体经过关系式处理后得到一个数值或对象结果,而不是一个关系式(或表达式)
- 函数中的自变量经过关系式后,必定在因变量中得到一个唯一的值
- 数学函数中的f相当于计算机语言函数中的函数名,调用函数用()进行传参
- 数学函数中的关系式在计算机语言中相当于函数体,用计算机语言来描述关系式
- 函数得到返回值时,表示自变量经过关系式处理得到结果,说明计算完毕,函数调用完成
函数返回值
错误案例1
错误返回值是表达式
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-14
def f(n):
if n ==1:
return 1
return sumfactor = n*f(n-1)
print(f(5))
运行结果:
[python@centos7 414]$./factor.py
File "./factor.py", line 7
return sumfactor = n*f(n-1)
^
SyntaxError: invalid syntax
错误案例2
错误案例2:无法到达返回值
案例知识地基:压栈
字节码指令:https://docs.python.org/2/library/dis.html?highlight=load_const#opcode-LOAD_CONST
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-14
import dis
def f(n):
#sumfactor = n*f(n-1)
a = 100000
if n ==1:
return 1
return n*f(n-1)
print(dis.dis(f))
运行结果:
[python@centos7 414]$./factor.py
7 0 LOAD_CONST 1 (100000) #加载常量
3 STORE_FAST 1 (a) #添加本地
8 6 LOAD_FAST 0 (n) #push到stack
9 LOAD_CONST 2 (1) #加载常量
12 COMPARE_OP 2 (==) #执行bool操作
15 POP_JUMP_IF_FALSE 22 #若错误弹出最顶层的栈帧
9 18 LOAD_CONST 2 (1) #加载常量
21 RETURN_VALUE #返回
10 >> 22 LOAD_FAST 0 (n) #压栈
25 LOAD_GLOBAL 0 (f) #压栈全局对象f
28 LOAD_FAST 0 (n) #压栈
31 LOAD_CONST 2 (1) #加载常量
34 BINARY_SUBTRACT #tos=tos1-tos
35 CALL_FUNCTION 1 (1 positional, 0 keyword pair) #系统调用函数
38 BINARY_MULTIPLY #tos=tos1*tos
39 RETURN_VALUE
None
错误案例循环无法到达返回值
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-14
def f(n):
sumfactor = n*f(n-1)
if n ==1:
return 1
return sumfactor
print(f(5))
- 函数在压栈时,首先对n*f(n-1)进行压栈,压栈发现又有函数调用,依次类推导致递归层到达限制,退出函数体
返回值为单值
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-14
def f(n):
return 1,2,3
def fn(n):
return 1
def fnn(n):
return [1,2,3]
print(f(5))
print(fn(5))
print(fnn(5))
运行结果:
[python