函数和数学意义上的函数概念没有本质上的区别
定义格式:
def fun_name(args):
'''
函数说明文档
'''
函数体逻辑
[return 表达式]
def fun1(num):
'''
这个函数用来返回值为一个list 其元素为num的因子
ex: a = fun1(10)
result: a is [1,2,5,10]
@param:num 要计算的数字 必须整形
'''
l = []
for x in range (1,num+1):
if num % x:
pass
else:
l.append(x)
return l
在一个函数中如果运行逻辑遇到return
则直接终止函数运行
,将return之后的表达结果作为函数的返回值返回,若没有表达式则返回None
当函数中没有明确声明 return 语句 则函数的返回值为None
形式参数 未来参与运算的对象的一个替代表达(例如上述函数中的num)
函数的调用 其本质就是使用函数,调用的结果为函数的返回值
实际参数 在函数调用时传入的和形式参数对应的参与函数中逻辑的真实的对象(例如上述函数中的10)
函数的参数传递形式
传值传递: 函数内部对传入的对象进行修改,不影响原始对象 深复制 是堆层面的复制
引用传递: 函数内部对传入的对象进行修改,会影响原始数据 浅复制 是栈层面的复制 指向的还是同一个实体
可变类型作为函数的参数传入均以引用形式传递,不可变均以传值方式传递。
如果不希望影响原始对象请使用深复制的形式传入参数 例如:fun(copy.deepcopy(l))
import copy
def fun2(l):
'''
这个函数为一个list 其元素有序排列
@param l 是一个数字序列
'''
for x in range(len(l)):
for y in range(len(l)-x-1):
if l[y] > l[len(l)-x-1]:
l[y],l[len(l)-x-1] = l[len(l)-x-1],l[y]
return l
l = [4,5,8,1,5,9,8,5,3]
print(fun2(l))
print(l)
print(fun2(copy.deepcopy(l)))
print(l)
函数三参数形式
必须函数:
我们声明的形式参数和调用时传入的实际参数必须保持数量以及顺序的一致.
def fun(a,b,c):
print(a,b,c)
return a + b + c
print(fun(1,5,3)) #必须输入三个参数
默认函数:
在函数声明定义时以 parame=defaultvalue 的形式定义的参数被称之为默认函数,该参数在调用时可以不传入,当不传入时使用默认值参与函数逻辑
def fun_circle_area(r,pi=3.14): #默认pi为3.14
print('pi:',pi)
return r**2*pi
print('pi = None', fun_circle_area(4))
print('pi=3',fun_circle_area(4,pi = 3))
变长参数:
当我们不知道在调用时需要多少参数的情况下使用,有如下两种形式
元组形式
定义形式参数前加一个*号 例如:※ards 在函数内部使用 args获取传入的参数,传入的参数将以元组形式由args获取。
我们可以使用※加上一个列表或者元组的方式传入,这种情况下列表或者元组的每一个元素将以参数的形式传入
def fun3(*args):
print(args,type(args))
fun3(1,5,4,8)
def fun2(*args):
'''
这个函数为一个list 其元素有序排列
@param l 是一个数字序列
'''
l = list(args)
for x in range(len(l)):
for y in range(len(l)-x-1):
if l[y] > l[len(l)-x-1]:
l[y],l[len(l)-x-1] = l[len(l)-x-1],l[y]
return l
l = (4,5,8,1,5,9,8,5,3)
print(fun2(*l))
l1 = [4,5,8,1,5,9,8,5,3]
print(l1)
print(fun2(*l1))
print(l1)
字典形式:
定义一个参数可以在前面加上** 例如: ※※kwargs 在函数内部使用 kwargs获取传入的参数 传入的参数将以字典的形式由kwargs获取
实际的参数需要以关键字的形式传入,或者使用**dict的形式传入
def fun4(**kwargs):
print(kwargs)
fun4(a =1, b =2, c =3 ) #关键值形式调用
fun4(**{'a':1,'b':2,'c':3})#字典形式调用
我们可以以关键字的形式进行参数的传入,避免因参数顺序错位导致参数的传入失败。
def fun5(a,b,c,d,e):
print(e,d,c,b,a)
fun5(1,2,3,4,5) #必须方式传入
fun5(a=1,d=4,e=5,b=2,c=3) #以关键字的形式将对应的值传递给对应的参数
强制关键字参数: 强制关键字参数必须以关键字形式进行调用,在定义时定义在不定长参数之后。
当多种模式的参数混合使用时, 定义顺序为:必须参数、默认参数、不定长参数、必须关键字参数。
def fun6(a,b,*_,c,d):
print(a,c,_)
fun6(1,2,5,8,9,7,c=2,d=3)
def fun7(a,b,*,c,d):
print(a,b)
def fun8(*,c,d='host'):
print(c,d)
fun8(*='hello')
变量作用域:该变量生效的范围。在python中变量的作用域由大到小一次为:
内建(built_in B )> 全局(globle G)> 函数内闭包外(Encloseing E)> 局部(local L)
内建作用域有python的运行环境决定,全局作用域当前程序文件的内部封装代码(函数、类)之外,
在函数内部的函数之外的作用域为E作用域,函数内部的作用域为局部作用域。
小作用域可以访问外部作用域的内容,但不能修改.大作用域无法直接访问小作用域。
在当前作用域没有声明某个变量,但是需要使用时则向上依次查找,找到即使用并不再向上。若一直到内建都没找到则引发 not defeined
可以使用global关键词声明 变量为全局作用域。
可以使用 nonlocal 关键字声明 变量为E作用域中的
变量(只能在闭包函数之外使用)。
可以使用globals函数查看全局作用域的变量列表
可以使用locals函数查看当前作用域中的变量列表
abs #内建作用域
ab = 12 #全局作用域
def f():
print(ab)
a = 1 #闭包外作用域
print('a_start',a)
def f1():
global ab
nonlocal a
a = a * ab
ab = ab * 5
print(ab,a)
b = 3 #局部作用域
f1()
print(globals())
print(locals())
f()
print(ab)
匿名函数:
(lambda表达式): Python中的匿名函数主要用来处理一些简单表达式的封装
使用lambda关键字
一般格式为: var = lambda args:表达式
例如:
f = lambda x,y:x*y
print(f(1,3))
该函数的调用结果为 冒号后紧跟的表达式所表示的结果