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自定义解析简单xml格式文件的方法
May 11 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
python相似模块用例
Mar 04 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
Feb 05 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
是否存在第一台收音机的说法
2021/03/01 无线电
PHP生成带有雪花背景的验证码
2006/10/09 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
UI Events 用户界面事件
2012/06/27 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
2013的个人自我评价
2013/12/26 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
公司表扬信格式
2015/05/04 职场文书
电台广播稿范文
2015/08/19 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python