一.函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数
1.编程分类
面向对象:—类(class)
面向过程:—过程(def)没有返回值的函数称为过程
函数式编程中:—函数(def)
在Python不区分函数和过程,过程也有返回值,不过返回值为Null
2.定义函数的规则
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
Python 定义函数使用 def 关键字
#Author:橘春二三
def hello(): #def定义函数
print("hello world")
hello() #调用函数
3.函数返回值
(1)返回函数值
(2)终止函数
#Author:橘春二三
def test1(): #定义函数
print("in the test1")
return 0 #函数返回值为0,此时函数结束
print("test end") #此句不会输出
x = test1() #将函数的值给x
print(x) #输出x的值即函数的返回值
返回值类型
当没有返回值时,返回0。
当返回值时一个特定值时,返回这个值。
当返回值是多个值时,返回的是一个元组
当返回值是一个函数名时,返回的是函数的内存地址。
当返回值是一个函数时,返回的是函数的执行结果。
例:
#Author:橘春二三
def test1():
print("in the test1")
def test2():
print("in the test2")
return 0
def test3():
print("in the test2")
return 1,"hello",["dajiang","dajiangliu","xxxx"],{"jingling:shibachai"}
def test4():
print("in the test3")
return test1
x = test1()
y = test2()
z = test3()
w = test4()
print(x)
print(y)
print(z)
print(w)
执行结果:
in the test1
in the test2
in the test3
in the test3
None
0
(1, ‘hello’, [‘dajiang’, ‘dajiangliu’, ‘xxxx’], {‘jingling:shibachai’})
<function test1 at 0x0000019239987730> 存储地址
4.函数调用
- 实参,形参
- 关键参数
- 位置参数
#Author:橘春二三
def test(x,y): #形参
print(x)
print(y)
#test("x","y") #位置实参调运,形参和实参是一一对应 #test(y=2,x=3)
#关键字参数调运,与形参位置无关。
test(x=2,3) #关键参数不能写在位置参数之前。
#test(3,y=2) #位置参数和关键字参数同时存在,以位置参数调运为主
(1)位置实参调运,形参和实参是一一对应
(2)关键字参数调运,与形参位置无关。
(3)关键参数不能写在位置参数之前。
(4)位置参数和关键字参数同时存在,以位置参数调运为主。
- 默认参数
默认参数的特点:调运函数的时候,默认参数非必须传递 用途:参数在不修改其值的情况下,使用默认值
#Author:橘春二三
def test(x,y=2):
print(x)
print(y)
test(1,3)
*args : 接受N个位置参数,转化成元组的形式
**kwargs :接受N个关键字参数,转化成字典的形式
def test(x,y,*args):
print(x)
print(y)
print(args)
test(1,3,4,5,6,7,8,9,)
test(*[1,2,2,4,5,7,])
def test(**kwargs):
print(kwargs)
test(name='anliu',age=8,sex='F')
test(**{'name':"anliu","age":18})
#把N个关键字参数,转换为字典的形式
5.变量
- 局部变量
仅在函数内部有效
def change_name(name):
print("before change",name)
name = "Auliu" #局部变量,这个函数就是变量的作用域
print("after change",name)
name = "anliu"
change_name(name)
print(name)
输出结果为:
before change anliu
after change Auliu
anliu
- 全局变量
全局变量在程序内均有效
一般函数内不能修改全局变量的值
school = "xiyunkeji" #全局变量
def change_name(name):
school = "baiyijishu" #在函数内是不能修改全局变量的值
print("before change",name,school)
name = "Auliu" #局部变量,这个函数就是变量的作用域
print("after change",name)
name = "anliu"
change_name(name)
print(name,school)
输出结果:
before change anliu baiyijishu
after change Auliu
anliu xiyunkeji
定义global之后,全局变量也是可以在函数内修改的
6.递归函数
在函数内部,可以调运其他函数。如果一个函数在内部调运自身,这个函数就是递归函数。
例:
def calc(n):
print(n)
if int(n/2) > 0:
return calc(int(n/2))
print("-->",n)
calc(10)
输出结果:
10
5
2
1
–> 1
7.高阶函数
变量可以指向函数,函数的参数支持能接受变量,那么一个函数就可以接受另一个函数作为参数,这种 函数就称之为高阶函数。
高级函数特性:
(1)把一个函数名当做实参传递给另一个函数
(2)返回值中包含函数名
#Author:橘春二三
def add(a,b,f):
return f(a) + f(b)
x = add(1,-6,abs)
print(x)
abs()是python自带的一个函数,把它当作实参传递给了自定义函数add()
8.嵌套函数
在一个函数体内定义另外一个函数
def foo():
print("in the foo ")
def bar():
print("in the bar")
bar()
foo()
输出结果:
in the foo
in the bar
9.装饰器
定义:装饰器:装饰器本质是函数,(函数是有特定的功能),装饰器的功能就是装饰其他函数,就是 为其他函数添加附加功能。
原则:1.不能修改被装饰函数的源代码。
2.不能修改被装饰的函数的调运方式。 (装饰器对被装饰函数来说是透明的)
装饰器=高阶函数+嵌套函数
#装饰函数
def decorator(foo):
def wrapper():
print 'wrapper'
return foo()
return wrapper
#自定义函数
def abc():
print 'abc'
#装饰abc
abc = decorator(abc)
以上就是装饰器的过程,可以看出调用decorator函数,返回的是wrapper函数对象,而不是abc这个函数对象
abc这个函数在wrapper中已经是被调用了的,只是返回一个结果。可以看出装饰之后的abc是wrapper的函数对象,而不是原来函数了。
python解释题给我们提供了一个“语法糖”,我们可以使用“语法糖”来实现
def decorator(foo):
def wrapper():
print 'wrapper'
return foo()
return wrapper
@decorator
def abc():
print 'abc'
python的装饰器语法就是自动调用decorator函数,并以自定义的函数abc函数对象为参数,
返回wrapper函数对象,这样一个过程。