5.函数和lambda表达式
# python函数 def fun(): return 1,"abcd",2>1 print(fun()) print(type(fun())) print(fun()[1]) # 值传递和引用(地址)传递 # 值传递:适用于实参类型为不可变类型(字符串、数字、元组) # 引用(地址)传递:适用于实参类型为可变类型(列表、字典) # 区别:值传递,形参改变,不会改变实参的值;引用传递,形参改变,会改变实参的值。 list1 = [1,2] def fun(obj): obj[0] = 2 print('形参的值', obj) fun(list1) print('实参的值', list1) # 关键字参数 # 特点:1、对参数位置没有要求;2、但如果位置参数和关键字参数混用时,关键字参数必须位于所有位置参数之后。 def fun(str1,str2): print('str1:', str1, end=' ') print('str2:', str2) fun('111', '222') fun('111', str2='222') fun(str2='222', str1='111') # 默认参数 # 定义函数时,默认参数必须位于所有没有默认值参数的后面。 def fun(str1,str2='444'): print('str1:', str1, end=' ') print('str2:', str2) fun('333','555') fun('333') # 可变参数 # 接收的实参数量不确定时,创建形参*obj,相当于创建了一个名为obj的空元组,并将接收到的参数封装进去 def fun(*obj): print('可变参数',obj) fun('str1','str2') # 位置参数+可变参数(非关键字参数) # 需要将可变参数的形参放在最后 def fun(str1,*obj): print('位置参数',str1,'可变参数(非关键字参数)',obj) fun('str1','str2','str3') # 位置参数+可变参数(关键字参数) # 创建形参**obj,相当于创建了一个名为obj的空字典,并将接收到的参数封装进去 def fun(str1,**obj): print('位置参数',str1,'可变参数(关键字参数)',obj) fun('str1',str2='2',str3='3') # 位置参数+可变参数(非关键字参数)+可变参数(关键字参数) def fun(str1,*obj1,**obj2): print('位置参数',str1,'可变参数(非关键字参数)',obj1,'可变参数(关键字参数)',obj2) fun('str1','str2',str3='3') # 逆向参数收集 # 列表、元组前添加*,字典前添加** def fun(a,b): print(a,b) list1 = (1,2) dict1 = {'a':3, 'b':4} # 字典的key必须与函数的形参一致 fun(*list1) fun(**dict1) # 多个返回值 # 多个值以元组的方式返回 def fun(a,b): return a,b,a+b print(fun(1,2)) # partial偏函数 from functools import partial def fun(a,b): print(a,b) fun1 = partial(fun,a=1) fun2 = partial(fun,1) fun1(b=2) # 此处必须使用关键字参数,使用位置参数为被认为按位置传参给a,程序会报错 fun2(2) # 全局变量 a = "全局变量" # 函数外定义的变量,一定是全局变量 def fun(): print(a) fun() # 函数内定义全局变量 def fun(): global a a = "函数内的全局变量" print(a) fun() print('print自己打印', a) # 函数赋值给其它变量执行 def fun(): print("函数赋值给其它变量,使用其他变量来调用函数") fun1=fun fun1() # 闭包函数(又称闭合函数) # 闭包中外部函数返回的不是一个具体的值,而是一个函数。 # 一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。 def fun(a): def fun1(b): return b**a return fun1 square = fun(2) # 计算平方 cube = fun(3) # 计算立方 print(square(10)) print(cube(10)) # lambda表达式(又称匿名函数),常用来表示内部仅包含1行表达式的函数。 # 格式:name = lambda [list] : 表达式 # [list]:可选参数,函数的参数列表 add = lambda x,y:x+y print(add(1,2)) '''相当于 def add(x,y): return x+y ''' # 优势 # 1、对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁; # 2、对于不需要多次复用的函数,使用lambda表达式可以在用完之后立即释放,提高程序执行的性能 # eval()和exec(),用于执行字符串表达式(字符串一定要是可执行的代码),在使用Python开发服务端程序时,这两个函数应用得非常广泛。 # 区别eval返回结果,exec返回None # 格式:eval或exec(str[,globals[,locals]]) # globals:变量作用域,全局命名空间,如果没有提供这个参数,默认使用python的全局命名空间 # locals:变量作用域,局部命名空间,locals的变量与globals冲突时,以locals为准 a=10 b=20 c=30 g={'a':6, 'b':8} #定义一个字典 t={'b':100, 'c':10} #定义一个字典 print('eval返回的结果',eval('a+b+c',g,t)) print('exec返回的结果',exec('a+b+c',g,t)) # 函数式编程 # map(function, iterable, ...)根据提供的函数对指定序列做映射 list1 = [1,2,3,4] list2 = [2,3,4,5] newlist = map(lambda x,y:x+y, list1,list2) print(list(newlist)) # filter(function, iterable) # 对iterable中的每个元素都用function函数判断,并返回True或False,最后将返回True的元素组成一个新的可遍历集合 newlist = filter(lambda x:0==x%2, list1) print(list(newlist)) # reduce(funtion, iterable)对一个集合做一些累积操作 import functools # reduce()在python3.x中已经被移除,放入functools模块 sum1 = functools.reduce(lambda x,y:x+y, list1) product = functools.reduce(lambda x,y:x*y, list1) print(sum1) print(product)