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中isnumeric()方法的使用简介
May 19 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python日志logging模块使用方法分析
May 23 Python
用python解压分析jar包实例
Jan 16 Python
Python如何省略括号方法详解
Mar 21 Python
基于python实现地址和经纬度转换
May 19 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
python如何保存文本文件
Jun 07 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 Python
Python 中的函数装饰器和闭包详解
Feb 06 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
PHP分页显示制作详细讲解
2006/10/09 PHP
php+mysql 实现身份验证代码
2010/03/24 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
js输出列表实现代码
2010/09/12 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
python 简单的多线程链接实现代码
2016/08/28 Python
详解python基础之while循环及if判断
2017/08/24 Python
python机器学习之神经网络(一)
2017/12/20 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
会计毕业生自我鉴定
2013/11/04 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
鲜花方阵解说词
2014/02/13 职场文书
建房协议书
2014/04/11 职场文书
中文专业自荐书
2014/06/29 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书