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)

 

 
posted @ 2024-05-10 00:25  jason8826  阅读(4)  评论(0编辑  收藏  举报