函数基础二&匿名函数&函数本质

一、函数基础【重点掌握】

1.返回值
# return关键字的作用


# 1.注意1:如果给函数没有显式的设置返回值,则默认返回None
def test1():
    print('1111')
r1 = test1()
print(r1)

# 等价于
def test1():
    print('1111')
    return None
# 注意2:函数在哪里调用,返回值就返回到哪里,如果一个函数有返回值,可以使用变量将返回值接出来
r1 = test1()
print(r1)

print("*" * 30)

# 2.注意3:return是一个关键字,可以单独作为一条语句使用,作用:只能使用在函数中,作用是结束函数
# 所以,如果return语句有机会执行,则return后面其他语句将没有执行的机会
# a.
def test2():
    print("start~~~2222")
    return
    print("end~~~2222")
test2()

# b.
def test2(n):
    print("start~~~2222")
    if n > 2:
        return
    print("end~~~2222")
test2(3)
test2(1)

print("*" * 30)

# 3.break和return的区别
# 注意4:break是结束当前循环,return是结束函数,而且return只能使用在函数中
# 从一定程度上来说,return的作用大于break
def test3():
    print("start")
    for i in range(3):
        for j in range(5):
            print(f"{i} = {j}")
            if j == 2:
                break   # 结束当前循环
    print("end")
test3()

print("over")

print("*" * 30)

def test3():
    print("start")
    for i in range(3):
        for j in range(5):
            print(f"{i} = {j}")
            if j == 2:
                return  # 结束函数
    print("end")
test3()

print("over")

print("*" * 30)

# def test3():
#     print("start")
#     for i in range(3):
#         for j in range(5):
#             print(f"{i} = {j}")
#             if j == 2:
#                 exit()  # 结束进程
#     print("end")
# test3()
# print("over")

print("*" * 30)

# 4.return xxxx
# 注意5:return  xxx表示结束函数,同时将指定的值返回,建议:封装函数的时候,尽量将print替换为return
# a.
def test4(a,b):
    total = a + b
    print(total)
test4(3,6)


def test4(a,b):
    total = a + b
    return  total
r4 = test4(3,6)
print(r4)
print(r4 + 10)

print(test4(23,78))

# b
# 注意6.return的后面可以跟多个数据,最终会将数据进行打包,返回值会被当做元组处理
def test5(num1,num2,num3):
    return num1,num2,num3
r5 = test5(3,5,7)
print(r5)  # (3, 5, 7)

# c.
# 注意7:return可以使用在不同的分支中,每个分支的返回值类型可以不相同

"""
注意8:如何封装一个函数
    是否需要设置参数:观察需求中是否有未知项参与运算,如:指定数,某个数,指定列表.....
    是否需要设置返回值:观察需求实现完毕之后是否有结果
"""

# 需求:封装一个函数,比较两个数的大小,返回较大值
def compare(num1,num2):
    if num1 > num2:
        return num1
    elif num1 < num2:
        return num2
    else:
        return "相等"

r = compare(34,34)
print(r)
2.空函数和主函数
# 1.空函数
def test():
    pass

# 2.主函数
# 主函数的作用是整个程序的入口,在Java语言中,有一个主函数main,但是,Python中没有主函数一说,我们可以通过if语句模拟
# 主要应用在模块中,目前只用于调用函数

def func():
    pass

if __name__ == '__main__':
    func()
3.函数练习
"""
如何封装一个函数
    是否需要设置参数:观察需求中是否有未知项参与运算,如:指定数,某个数,指定列表.....
    是否需要设置返回值:观察需求实现完毕之后是否有结果
"""

# 1.判断年份的平闰性
def isleapyear(year):
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        return True
    return False
r = isleapyear(2020)
print(r)

# 2.统计2~某个数中质数的个数
# a.判断某个数是否是质数
def isprime(num):
    if num < 2:
        return False
    else:
        result = True
        for i in range(2,num):
            if num % i == 0:
                result = False
                break
        return result

# b.统计质数的个数
def get_count(n):
    count = 0
    for m in range(2,n + 1):
        if isprime(m):
            count += 1
    return count

r = get_count(100)
print(r)


# 3.模拟列表的sort功能,对列表进行排序,默认升序,也可以降序
def custom_sort(numlist,reverse=False):
    if reverse:
        # 降序
        for i in range(len(numlist) - 1):
            for j in range(i + 1,len(numlist)):
                if numlist[i] < numlist[j]:
                    numlist[i],numlist[j] = numlist[j],numlist[i]
    else:
        # 升序
        for i in range(len(numlist) - 1):
            for j in range(i + 1,len(numlist)):
                if numlist[i] > numlist[j]:
                    numlist[i],numlist[j] = numlist[j],numlist[i]

list1 = [23,45,6,6,45,124]
custom_sort(list1)
print(list1)

list1 = [23,45,6,6,45,124]
custom_sort(list1,reverse=True)
print(list1)

一、匿名函数【重点掌握】

概念:不再使用def这种标准形式定义函数,而是使用lambda表达式来创建函数,该函数没有函数名,被称为匿名函数

语法:lambda 形参列表:返回值

说明:

​ a.lambda只是一个表达式,用一行代码实现一个简单的逻辑,可以达到对函数的简化【优点】

​ b.lambda主体是一个表达式,而不是一个代码块,只能封装有限的逻辑【缺点】

​ c.lambda拥有自己的命名空间,不能访问自有列表之外或者全局命名空间里的参数

# 语法:lambda  形参列表:函数体和返回值

# 1.基本用法
# 标准定义
def func1():
    print("111")
# 直接调用
func1()
r1 = func1()      # 函数的调用,直接调用
print(r1)
f1 = func1       # 函数本身
# print(f1)       # <function func1 at 0x109fb21e0>
# print(func1)   # <function func1 at 0x109fb21e0>
# func1()
f1()   # 间接调用

# 匿名函数:lambda表达式
# 直接调用
r1 = (lambda :print("111~~~~~~"))()
print(r1)

# 间接调用
f2 = lambda :print("111~~~~~~")
r2 = f2()
print(r2)

# 注意1:不管是def定义的函数,还是匿名函数,函数定义完成之后,都需要手动调用

print("*" * 30)

# 2.匿名函数的返回值
# 需求:封装函数,求两个数的和
def add1(num1,num2):
    return num1 + num2
r1 = add1(3,5)
print(r1)

# 注意2:书写匿名函数的时候,如果有返回值,不需要通过return声明
add2 = lambda num1,num2:num1 + num2
r2 = add2(4,7)
print(r2)

# 3.在匿名函数中可以使用if语句,但是只能使用三目运算符
# 需求:封装函数,比较两个数是否相等
def compare1(a,b):
    if a == b:
        return True
    return False
print(compare1(34,78))

compare2 = lambda a,b: True if a == b else False
print(compare2(345,79))

compare3 = lambda a,b:a == b
print(compare3(34,34))

# 需求:封装一个函数,比较两个数的大小,返回较大值
def compare4(num1,num2):
    if num1 >= num2:
        return num1
    else:
        return num2
r = compare4(34,34)
print(r)

compare5 = lambda num1,num2:num1 if num1 >= num2 else num2
print(compare5(34,789))

# 4.在匿名函数中,同样可以使用默认参数,关键字参数和不定长参数
f1 = lambda x,y = 0:x ** 2 + y ** 2
print(f1(2))
print(f1(2,3))
print(f1(x=2,y=3))

f2 = lambda  *x:sum(x)
print(f2(45,7,5,8,8))

# 5.应用:将列表按学生成绩从大到小排序
students = [
{'name': '小花', 'age': 19, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '明明', 'age': 20, 'score': 40, 'gender': '男', 'tel':
'15300022838'},
{'name': '华仔', 'age': 18, 'score': 90, 'gender': '女', 'tel':
'15300022839'},
{'name': '静静', 'age': 16, 'score': 90, 'gender': '不明', 'tel':
'15300022428'},
{'name': 'Tom', 'age': 17, 'score': 59, 'gender': '不明', 'tel':
'15300022839'},
{'name': 'Bob', 'age': 18, 'score': 90, 'gender': '男', 'tel':
'15300022839'}
]
# sort的工作原理:将列表中的元素依次传参给key指定的函数,该函数的返回值就是排序的规则,返回值一定要支持关系运算符
# 方式一
def rule1(a):
    return a['score']
students.sort(key=rule1,reverse=True)

# 方式二
students.sort(key=lambda subdict:subdict["score"],reverse=True)
for stu in students:
    print(stu)


list1 = [45,67,7,8]
list1.sort()


"""
【面试题】什么是匿名函数,说明优缺点
"""

二、函数的本质

函数就是一个变量,可以重新赋值,可以作为函数的参数,也可以作为函数的返回值

# 1.函数就是一个变量,可以重新赋值
print(abs(-18))   # 函数的调用
print(abs)       # 函数本身

r = abs(-17)
# 注意1:函数其实就是一个变量,函数名其实就是一个变量名,所以,将一个函数赋值给另一个变量,则该变量可以被当做函数调用
f = abs
print(r)
print(f)

print(f(-13))


# 2.一个函数可以作为另一个函数的参数
def func(x,y,f):
    return f(x) + f(y)
r = func(45,6,abs)   # 传递系统函数
print(r)


def test(n):
    return  n ** 2
r = func(3,4,test)   # 传递系统函数
print(r)

# 注意2:一个函数可以作为另一个函数的参数使用,传参的时候,只需要传递函数名即可,表示将函数本地传递进去


# 3.一个函数也可以作为另一个函数的返回值
def t1():
    return "abc"
r1 = t1()
print(r1)

def t2(f):
    f()
    return f
r2 = t2(t1)   # f = t1   r2 = f   r2 = t1
print(r2)
print(r2())

# 注意3:一个函数可以作为另一个函数的返回值使用,只需要使用函数名即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值