函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件
函数用于将相关功能打包并参数化
在Python中可以创建4种函数
全局函数:定义在模块中 //仅限单个文件
局部函数:嵌套于其它函数中
lambda函数:表达式
方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
Python提供了很多内置函数
语法
def functionName(parameters)
suite
一些相关的概念
def是一个可执行语句
因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其它语句,例如if或while中
def创建了一个对象并赋值给一个变量名(即函数名)
return用于返回结果对象,其为可选;无return语句的函数自动返回None对象
返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象
def语句运行之后,可以在程序中通过函数后附加括号进行调用
Python函数作用域
Python创建、改变或查找变量名都是在名称空间中进行过
在代码中变量被赋值的位置决定了其能被访问到方位
函数定义了本地作用域,而模块定义了全局作用域
1.每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件
2.每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非声明(global)为全局变量,否者均为本地变量。
3.所有的变量名都可以归纳为本地、全局或内置的(由_bultin_模块提供)
变量名解析:LEGB原则
变量名引用分三个作用域进行:首先是本地、之后是函数内、接着是全局、最后是内置
local(funtion)\Enclosin function locals\Global(module)\Builtt-in(Python)
Python的闭包:
定义在外层函数内,却又在内层函数引用的变量,在外层函数返回时,如果说外层函数直接返回了内层函数作为返回结果,再次调用外层函数,可以直接仍然使用外层函数的变量。
函数的参数
def functionName()
l1 = [1,2,3]
def f4(x):
x.pop()
print x
f4.(l1)
f4.(l1[:]) //区别
参数传递形式
1位置参数:从左到右
2关键字参数:按关键名称匹配
混用上面两种方式时:所有位置参数在前,所有关键字参数
3默认参数:定义函数时使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
混用默认和无默认值的参数时,无默认值放前面
4可变参数:定义函数使用*开头的参数,可用于收集任意多基于位置或关键字的参数。
def f1(*x) def f1(**x) 一个传参数,一个传字典 因此参数中不能有name=value
5可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打散,
匿名参数lambda
lambda运算符
lambda args:expression f20 = lambda x,y: x + y
args: 以逗号分割的参数列表
expression:用到args中各参数的表达式
lambda语句定的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和其他非表达十语句,如for和while等
lambda的首要用途是指短小的回调函数
lambda将返回一个函数而不是将函数赋值给某个变量名
注意1.lambda是一个表达式而非语句
2.lambda是一个单个表达式,而不是一个代码块。
def 语句创建的函数将赋值给某变量名,而lambda表达式则直接返回函数
def testFunc(x,y,z):return x+y+z testFunc(4,5,6)
lambda也支持使用默认函数
f20 = lambda x,y,z: x + y + zf(4,5,6)
f20 = (lambda x,y,z=10: x + y + z) f(4,5)
l3 = [(lambda x: x*2),(lambda y: y*2)]
for i in l3:
print i(4)
Python函数式编程
也称为泛函编程,是一种编程范型
它将电脑运算是为教学上的函数计算,并且避免状态以及可变数据
函数式编程语言的基础是lambda演算,而且lambda演算的函数可以接收函数作为当作输入和输出
Python支持有限的函数式编程功能
1.过滤器
filter() 为已知的序列的每个元素调用给定的布尔函数
调用中,返回值为非零值的元素将被添加至一个列表中
def f1():
2.映射器
map()将
yield 和生成器
def genNum(n):
while i > n:
yield i ** 2
i+=1
g1 = genNum(20)
for i in g1:
装饰器:
1.装饰器本身是一个函数,用于装饰其它函数
2.功能:增强被装饰函数的功能
装饰器一般接收一个函数对象作为参数,对其进行增强
def deco(func):
def wrapper():
print "plz say someting:"
func()
return wrapperprint "Nozuo dodai"
@deco
def show():
return "i am from Mars"
递归:
递归需要边界条件,递归前进段和递归返回段:
def fact(n):
if n
else:return n*fact(n-1)
fact(3)
协程:
函数的设计规范
耦合性
1.通过参数输入,以及通过return产生输出以保证函数的独立性
2.尽量减少使用全局变量今昔你个函数间通信:
3.不要在函数中修改可变类型的参数:
4.避免直接改变定义在另外一个模块中的变量
聚合性
1.单个函数都应该有一个单一的,统一的目标
2.每个函数的功能都应该相对简单
———————————————————————————————————————————————————————————
做有思想的新青年
领取专属 10元无门槛券
私享最新 技术干货