Python函数式编程


Posted in Python onJuly 20, 2017

主要内容

1.函数基本语法及特性
2.参数与局部变
3.返回值 4.递归
5.名函数 6.函数式编程介绍
7.阶函数 8.内置函数

函数基本语法及特性

定义

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

但编程中的「函数」概念,与数学中的函数是有很 同的 函数是逻辑结构化和过程化的一种编程方法

函数的优点

减少重复代码
使程序变的可扩展
使程序变得易维护

函数与过程

定义函数
def fun1(): #函数名称
"The function decription" print("in the func1") return 0 #返回值

定义过程

def fun2():
"The progress decription"
print("in the func2")

函数与过程 过程就是没有返回值的函数 但是在python中,过程会隐式默认返回none,所以在python中即便是过程也可以算作函数。

def fun1():
  "The function decription"
  print("in the func1")
  return 0
def fun2():
  "The progress decription"
  print("in the func2")

x=fun1()
y=fun2()

print("from func1 return is %s" %x)
print("from func2 return is %s" %y)

结果为:

in the func1
in the func2
from func1 return is 0
from func2 return is None

返回值

要想获取函数的执 结果,就可以 return语 把结果返回。

函数在执 过程中只要遇到return语 ,就会停 执 并返回结果,所以也可以 解为 return 语 代表着函数的结束,如果未在函数中指定return,那这个函数的返回值为None。

接受返回值

赋予变量,例如:

def test():
  print('in the test')
  return 0
x=test()

返回什么样的变量值
return 个数没有固定,return的类型没有固定。 例如:

def test1():
  print('in the test1')


def test2():
  print('in the test2')
  return 0

def test3():
  print('in the test3')
  return 1,'hello',['alex','wupeiqi'],{'name':'alex'}

def test4():
  print('in the test4')
  return test2

x=test1()
y=test2()
z=test3()
u=test4()
print(x)
print(y)
print(z)
print(u)

结果是:

in the test1
in the test2
in the test3
in the test4
None
0
(1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})
<function test2 at 0x102439488>
返回值数=0:返回None 没有return
返回值数=1:返回object return一个值,python 基本所有的数据类型都是对象。
返回值数>1:返回tuple, return多个值。
返回可以返回函数:return test2会将test2的内存地址返回。
为什么要有返回值?
想要整个函数执行的结果。 可能对执行结果进行相关操作。 比如登陆,返回true 接下来就可以进行其他操作。 如果是false 则不给操作。

函数参数

形参和实参定义

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

变量只有在被调时才分配内存单元

实参
实际参数,调用函数时传给函数的参数,可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以 把这些值传送给形参。因此应预先用赋值,输入 等办法使参数获得确定值。

区别
形参是虚拟的,不占用内存空间.形参变量只有在被调用时才分配内存单元,,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调函数后,则不能再使该形参变量。

实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参。

def calc(x,y): #x,y为形参
  res = x**y
  return res
c = calc(a,b) #a,b为实参
print(c)
def test(x,y): #x,y为形参
  print(x)
  print(y)
x=1 #x为实参
y=2 #y为实参

test(x=x,y=y) #等号左边x,y为形参,等号右边x,y为实参,引用不分顺序,按关键字引用。

默认参数

定义函数的时候,还可以有默认参数。 函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。

#定义一个计算 x 的N次方的函数,默认是2次方
def test6(x,n=2):
  s=1
  while n>0:
    n=n-1
    s=s*x
  print(s)
  return s
test6(2)

默认参数只能定义在必需参数的后面.

可变参数

如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

def fn(*args):
    print args
可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数: Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了。

定义可变参数的目的也是为了简化调用。假设我们要计算任意个数的平均值,就可以定义一个可变参数:

def average(*args):
    ...
这样,在调用的时候,可以这样写:

>>> average()
0
>>> average(1, 2)
1.5
>>> average(1, 2, 2, 3, 4)
2.4

位置参数和关键字

位置参数调用:实参与形参位置一一对应; 关键参数调用:位置无需固定。

正常情况下,给函数传参数要按顺序,如果不按顺序就可以用关键参数调用,只需指定参数名即可,但关键参数必须放在位置参数之后。

def test5(u,v,w):
  print(u)
  print(v)
  print(w)
test5(3,w=2,v=6)

函数调用

Python内置了很多有用的函数,我们可以直接调用。

要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数。

调用 abs 函数:

>>> abs(-21)
21
调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个:

>>> abs(21,8)
Traceback (most recent call last):
  File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 67, in <module>
    abs(21,8)
TypeError: abs() takes exactly one argument (2 given)
如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型:

>>> abs('a')
Traceback (most recent call last):
  File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 69, in <module>
    abs('a')
TypeError: bad operand type for abs(): 'str'

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示:

def fact(n):
  if n==1:
    return 1
  return n * fact(n - 1)

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

嵌套函数

python允许在定义函数的时候,其函数体内又包含另外一个函数的完整定义。

name = "test1"
def changeout():
  name = "test2"
  def changeinner():
    name = "test3"
    print("changeinner赋值打印", name)

  changeinner() # 调用内层函数
  print("外层调用内层打印", name)


changeout()
print("调用外层打印", name)

内部函数可以访问其外部函数的作用域,但是外部函数不能访问内部函数的作用域。

def change1(name):

匿名函数

匿名函数就是不需要显式的指定函数

#这段代码 def calc(n): return n**n print(calc(10))

#换成匿名函数 calc = lambda n:n**n print(calc(10))

函数式编程

单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

主要思想是把运算过程尽量写成一系列嵌套的函数调用。

参考页面

Python 相关文章推荐
深入理解Python 代码优化详解
Oct 27 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python中subprocess的简单使用示例
Jul 28 Python
理解Python中的With语句
Mar 18 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
对pandas中apply函数的用法详解
Apr 10 Python
详解python使用turtle库来画一朵花
Mar 21 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
python文件编写好后如何实践
Jul 07 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
python 换位密码算法的实例详解
Jul 19 #Python
python实现rsa加密实例详解
Jul 19 #Python
Python中标准库OS的常用方法总结大全
Jul 19 #Python
spyder常用快捷键(分享)
Jul 19 #Python
JPype实现在python中调用JAVA的实例
Jul 19 #Python
简单谈谈Python中的json与pickle
Jul 19 #Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 #Python
You might like
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python私有属性和方法实例分析
2015/01/15 Python
python批量生成本地ip地址的方法
2015/03/23 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
python 连接sqlite及简单操作
2017/06/30 Python
python如何修改装饰器中参数
2018/03/20 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
会计电算化专业毕业生推荐信
2013/12/24 职场文书
生物学专业求职信
2014/07/23 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
民主生活会意见
2015/06/05 职场文书
英语导游欢迎词
2015/09/30 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS