13 函数进阶

01 匿名函数

  • 本质还是函数(除了定义函数的语法以外的函数相关内容都适用于匿名函数)
    语法:
函数名 = lambda 形参列表: 返回值

相当于:

def 函数名(形参列表):
    return 返回值

案例1: 写一个匿名函数求任意两个数的和

sum1 = lambda num1, num2: num1 + num2
print(sum1(100, 200))
print(sum1(num2=100, num1=200))

案例2: 写一个匿名函数求任意三个整数的个位数的和

sum2 = lambda num1, num2, num3: num1 % 10 + num2 % 10 + num3 % 10
print(sum2(123, 215, 111))

02 高阶函数(了解)

1.高阶函数 - 实参高阶函数和返回值高阶函数

  • 实参高阶: 参数是函数的函数
  • 返回值高阶函数: 返回值是函数的函数

2.函数的参数的确定方式

# x可以传任何数据
def func1(x):
    print(x)

# x可以传整数、浮点数、布尔、列表、字符串、元组
def func2(x):
    print(x * 2)


# x可以传列表、字符串、元组、字典
def func3(x):
    print(x[1])

# x只能传列表
def func4(x):
    print(x.append(100))

1) func5和func6是实参高阶函数

# x必须是不需要传参就可以调用的函数
def func5(x):
    # x = t1
    print(x())   # print(t1())

def t1():
    print('abc')

func5(t1)


# x必须是一个可以接收两个实参的函数,并且函数的返回值是数字
def func6(x):
    print(x(10, 20) + 30)

2) func7是一个返回值高阶函数

def func7():
    def func8():
        print('abc')
    return func8

03 常见的实参高阶函数

注意: 函数的参数如果是函数,提供实参方式有两种:

1.直接使用匿名函数
2.使用普通函数的函数名

1.max、min、sorted(sort)

  1. max(序列) - 直接比较序列中元素的大小求最大值
  2. max(序列, key=函数) - 根据函数自定的比较规则比较序列中元素的大小获取最大值
    要求: a. 有且只有一个参数(代表序列中的每个元素)
    b.需要一个返回值(返回值代表比较对象 - 将参数看成序列中的元素,返回值对应的位置描述清楚比较对象和元素之间的关系)

1) 求nums中值最大的元素

nums = [19, 23, 90, 34, 56, 78]
print(max(nums))

print(max(nums, key=lambda item: item))

2) 求nums中个位数值最大的元素

nums = [19, 23, 90, 34, 56, 78]
print(max(nums, key=lambda item: item % 10))

3) 求nums中绝对值最大的元素

nums = [19, 23, 90, 34, 56, 78]
print(max(nums, key=lambda item: item**2 ))
print(max(nums, key=lambda item: abs(item)))   # abs(数据)  -  返回数据的绝对值

4)求student中分数最高的学生

student = [
    {'name': '小明', 'age': 19, 'score': 73},
    {'name': '小红', 'age': 22, 'score': 99},
    {'name': '小花', 'age': 32, 'score': 80},
    {'name': '张三', 'age': 20, 'score': 77}
]
print(max(student, key=lambda item: item['score']))

5)按照年龄的大小对students中元素从小到大排序

print(sorted(student, key=lambda item: item['age']))

6)将names中所有的元素按照每个名字的长度从大到小排序

names = ['路飞', '乌索布', '索罗', '鲁班7号', '烬']
names.sort(key=lambda item: -len(item))
print(names)

print(sorted(names, key=lambda item: len(item),reverse=True))

7) 求nums各个位数之和最大的元素

nums = [123, 98, 562, 90, 990, 1000]
# 方法1-匿名函数
print(max(nums, key=lambda item: sum(int(i) for i in str(item))))
# 方法2-普通函数
def temp(item):
    s = 0
    for i in str(item):
        s += int(i)
    return s
print(max(nums, key=temp))

def sum1(x:int):
    a = []
    for x in range(len(str(x))):
        b = x%10
        a.append(b)
        x = x//10
    return sum(a)

print(max(nums, key=sum1))

2.map

基于原序列中的元素通过指定的规则创建一个新的序列

1) map(函数, 序列)

函数的要求: a. 有且只有一个参数(代表序列中的每个元素)
b. 有一个返回值(就是新序列的元素,在这儿通过参数来描述新序列的元素和原序列中的元素的关系)

案例: 将nums中所有的元素乘以2

nums = [2, 11, 33, 40, 9]
# [4, 22, 66, 80, 18]
result = map(lambda item: item*2, nums)
print(list(result))

以此类推 ——>

map(函数, 序列1, 序列2)
函数的要求: a. 有且只有2个参数(分别代表两个序列中的每个元素)
b. 有一个返回值(就是新序列的元素,在这儿通过参数来描述新序列的元素和原序列中的元素的关系)
map(函数, 序列1, 序列2, 序列3)
函数的要求: a. 有且只有3个参数(分别代表3个序列中的每个元素)
b. 有一个返回值(就是新序列的元素,在这儿通过参数来描述新序列的元素和原序列中的元素的关系)
map(函数, 序列1, 序列2, 序列3,…)

案例1:计算三个学生的总分

score1 = [98, 78, 80]
score2 = [99, 90, 60]
# [197, 168, 140]
result = map(lambda item1, item2: item1+item2, score1, score2)
print(list(result))
练习
练习1: 使用map函数提取nums中所有元素的十位数
nums = [68, 23, 23.34, 45.89, 192]
# [6, 2, 2, 4, 9]
result = map(lambda item: int(item)%100//10, nums)
print(list(result))
练习2:将学科和班号合并成班级名称
subjects = ['Python', 'java', 'h5']
nums = [2206, 2214, 2219]
# ['python2206', 'java2214', 'h52219]
result = map(lambda item1, item2: item1+str(item2), subjects, nums)
print(list(result))
练习3:根据提供的学生信息,创建学生字典
names = ['张三', '李四', '王五', '小明']
genders = ['男', '女', '男', '男']
tels = ['1110', '12091', '27181', '18231']
# [{'name': '张三', 'gender':'男', 'tel': '1110'}, ....]
result = map(lambda item1, item2, item3: {'name': item1, 'gender': item2, 'tel': item3}, names, genders, tels)
print(list(result))
练习4:使用map函数来创建字典
keys = ['name', 'age', 'gender', 'tel']
values = ['小明', 18, '男', '110']
# {'name': '小明', 'age': 18, ...}
result = dict(map(lambda item1, item2: (item1, item2), keys, values))
print(result)
练习5:使用map函数将nums中所有的偶数除以2,所有的奇数乘以2
nums = [1, 4, 5, 7, 8]
# [2, 2, 10, 14, 4]
result = map(lambda item: (int(item/2) if item % 2 == 0 else item*2), nums)
print(list(result))

3.reduce - 将序列中所有的元素合并成一个数据

reduce(函数, 序列, 初始值) - 将序列中的元素按照函数制定的规则合并成一个数据
函数的要求: a. 有且只有两个参数(第一个参数指向初始值,第二个参数代表序列中的每一个元素)
b. 有一个返回值(用来描述合并规则)

  • 导入reduce
from functools import reduce
案例1:求nums中所有元素的和
nums = [12, 30, 89, 76, 55]
# 12 + 30 + 89 + 76 + 55
result = reduce(lambda i, item: i+item, nums, 0)
print(result, sum(nums))
案例2:求nums中所有元素的乘积
nums = [12, 30, 89, 76, 55]
# 12 * 30 * 89 * 76 * 55
result = reduce(lambda i, item: i*item, nums, 1)
print(result)
案例3:求nums中所有元素的个位数和
nums = [12, 30, 89, 76, 55]
# 2+0+9+6+5
result = reduce(lambda i, item: i + item%10, nums, 0)
print(result)
案例4:将nums中所有元素合并成一个数字
nums = [12, 30, 89, 76, 55]
# 1230897655
result = reduce(lambda i, item: i + str(item), nums, '')
print(result)
案例5:将list1中所有字符串的最后一个字符合并成一个新中字符串
list1 = ['anm', 'abc', 'hello', 'world']
# 'mcod'
result = reduce(lambda i, item: i+item[-1], list1, '')
print(result)

4.filter(自学)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值