python函数

函数基础概念
函数是Python为了代码最大程度地重用和最小化代码冗余而提供地基本程序结构
函数是一种设计工具,它能让程序员将复杂地系统分解为可管理地部件
函数用于将相关功能打包并参数化
在Python中可以创建4种函数:
全局函数:定义在模块中
局部函数:嵌套于其它函数中
lambda函数:表达式
方法:与特定数据类型关联地函数,并且只能与数据类型关联一起使用
Python提供了很多内置函数
语法
def functionName(parameters):
suite

一些相关地概念
    def是一个可执行语句
    因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其它语句,例如if或while中
def创建了一个对象并将其赋值给一个变量名(即函数名)
return用于返回结果对象,其为可选;无return语句的函数自动返回None对象
    返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象
def语句运行之后,可以在程序中通过函数后附加括号进行调用
Python创建、改变或查找变量名都是在名称空间中进行
在代码中变量名被赋值的位置决定了其能被访问到的范围
函数定义了本地作用域,而模块定义了全局作用域
每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件
每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非声明为全局变量,否则均为本地变量
所有的变量名都可以归纳为本地、全局或内置的(由__builtin__模块提供)

变量名解析:LEGB原则
变量名引用分三个作用域进行:首先是本地、之后是函数内、接着是全局,最后是内置

函数:
def funcName(arg1,arg2,…):
参数传递形式:
默认情况下,参数通过其位置进行传递,从左至右,这意味着,必须精确地传递和函数头部参数一样多的参数
但也可以通过关键字参数、默认参数或参数容器等改变这种机制
位置:从左至右
关键字参数:使用”name=value”的语法通过参数名进行匹配
默认参数:定义函数时使用”name=value”的语法直接给变量一个值,从而传入的值可以少于参数个数
可变参数:定义函数时使用开头的参数,可用于收集任意多基于位置或关键字的参数
可变参数解包:调用函数时,使用
开头的参数,可用于将参数集合打散,从而传递任意多基于位置或关键字的参数

匿名函数lambda
lambda运算符
lambda args:expression
args:以逗号分隔的参数列表
expression:用到args中各参数的表达式
lambda语句定义的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和其它非表达式语句,如for和while等
lambda的首要用途是指定短小的回调函数
lambda将返回一个函数而不是将函数赋值给某变量名
注意
lambda是一个表达式而非语句
lambda是一个单个表达式,而不是一个代码块
def语句创建的函数将赋值给某变量名,而lambda表达式则直接返回函数
lambda也支持使用默认函数
def testFunc(x,y,z): return x + y +z
testFunc(4,5,6)
>>15
f = lambda x,y,x: x+y+z
f(4,5,6)
>>15
f2 = (lambda x,y,z=10: x+y+z)
f2(4,5)
>>19

python函数式编程
函数式编程也称作泛函编程,是一种编程范型
它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据
函数式编程语言最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出
python支持有限的函数式编程功能
filter(func,seq) :调用一个布尔函数func来迭代遍历每个seq中的元素,返回一个使func返回值为ture的元素的序列
map(func,seq) :将函数func作用于给定序列(s)的每个元素,并用一个列表来提供返回值:如果func为none,func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表
reduce(func,seq[,init]):将二元函数作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续地将现有的结果和下一个值作用在获得地随后地结果上,最后减少我们地序列为一个单一地返回值;如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列地头两个元素

练习1:返回/etc/passwd中包含了/bin/bash字串的所有用户名为一个列表
练习2:将/etc/passwd文件中的每一行都分割为一个列表
练习3;将任意文件按用户指定的分隔符把每一行都分隔为一个列表
练习4:用折叠的方式(reduce)求阶乘

python闭包:闭包叫lexical closure
例1:
def startPos(m,n):
def newPos(x,y):
print “The old position is (%d,%d),and the new position is (%d,%d).” % (m,n,m+x,n+y)
return newPos
action = startPos(10,10)
action(1,2)
运行结果:
The old position is (10,10), and the new position is (11,12)

例2:
    def genNum(n):
        i = 1
        while i<=n:
            yield i ** 2
            i +=1
    g1 = genNum(10) //生成一个生成器
    for i in g1:
        print i,
    运行结果:1 4 9 16 25 36 49 64 81 100
函数中使用yield,会返回一个生成器对象。

装饰器:
1 装饰器本身是一个函数,用于装饰其他函数
2 增强被装饰函数的功能:
装饰器一般接受一个函数对象作为参数
例1;
def deco(func):
def wrapper(x):
print(“Please say someting”)
func(x)
print “no zuo no die”
return wrapper
@deco
def show(x):
print x
show(‘hello, mars’)
运行结果:
please say someting
hello, mars
no zuo no die

递归函数:
递归需要边界条件,递归前进段和递归返回段
def fact(n):
if n<=1:
return 1
else:
return n * fact(n-1)
fact(3)
运行结果:6
斐波那契数列:
def feibo(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return feibo(n-1) + feibo(n-2)
feibo(0)
feibo(1)
feibo(2)
运行结果:0,1,1
费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数、斐波那契数列、费氏数列、黄金分割数列。
在数学上,费波那契数列是以递归的方法来定义:
F_{0}=0
F_{1}=1
F_{n}=F_NaN+F_NaN(n≧2)
用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。
首几个费波那契系数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
函数的设计规范:
耦合性:
1 通过参数接受输入,以及通过return产生输出以保证函数的独立性:
2 尽量减少使用全局变量进行函数间通信
3 不要在函数中修改可变类型参数
4 避免直接改变定义在另一个模块中的变量
聚合性:
1 每个函数都应该有一个单一的、统一的目标
2 每个函数的功能都应该相对简单
面向对象的基础概念:
程序 = 指令+数据
代码可以选择以指令为核心或以数据为核心进行编写
两种范型
以指令为核心:围绕”正在发生什么”进行编写
面向过程编程:程序具有一系列线性步骤;主题思想是代码作用于数据
以数据为核心:围绕”将影响谁”进行编写
面向对象编程(OOP):围绕数据及为数据严格定义的接口来组织程序,用数据控制对代码的访问
类型由状态集合(数据)和转换这些状态的操作集合组成


文章作者: 阿培
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 阿培 !
 上一篇
python异常 python异常
python异常python的运行时错误称作异常语法错误;软件的结构上有错误而导致不能被解释器解释或不能被编译器编译逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者输出结果需要的过程无法执行等python异常是一个对象
2017-04-14 阿培
下一篇 
文件对象 文件对象
文件对象: 文件系统和文件 文件系统是0S用于明确磁盘或分区上的文件的方法和数据结构–即在磁盘上组织文件的方法 计算机文件(或称文件、电脑档案),是存储在某种长期存储设备或临时存储设备中的一段数据流,并且归属于计算机文件系
2017-04-07
  目录