数据分析 --- day13函数进阶

一、匿名函数

1. 匿名函数

匿名函数: 本质还是函数(除了定义函数的语法以外的,函数相关内容都适用于匿名函数)

  • 语法:
函数名 = lambda 形参列表: 返回值


# 相当于:
def (形参列表):
    return 返回值

案例:求任意两个数的和

sum2 = lambda num1, num2: num1 + num2

print(sum2(10, 20))
print(sum2(150, 200))

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

sum3 = lambda n1 ,n2 , n3: n1 % 10 + n2 % 10 + n3 % 10

print(sum3(11,46,27))

二、高阶函数

1.高阶函数

高阶函数: 实参高阶函数和返回值高阶函数

  • 实参高阶: 参数是函数的函数

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

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

x可以是任何数据

def func1(x):
    print(x)

x可以传整数、浮点数、布尔、列表、字符串、元组

def func2(x):
    print(x * 2)

x可以传列表、字符串、元组、字典(有键为1的字典)

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)
  1. func7是一个返回值高阶函数
def func7():
    def func8():
        print('abc')
    return func8

三、常见的实参高阶函数

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

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

1.max、min、sorted(sort)

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

print(max(nums, key=lambda item: item))
  1. 求nums中个位数值最大的元素
nums = [19, 23, 90, 34, 56, 78]
print(max(nums, key=lambda item: item % 10))
  1. 求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)根据student列表按照年龄的大小对students中元素从小到大排序

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

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

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

names.sort(key=lambda item: -len(item))
print(names)

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

nums = [123, 98, 562, 90, 990, 1000]

# 方法1:
print(max(nums,key=lambda item:sum(int(x) for x in str(item))))

# 方法2
def temp(item):
    s = 0
    for x in str(item):
        s += int(x)
    return s
print(max(nums,key=temp))

2. map

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

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

map(函数, 序列1, 序列2, 序列3,…) — 函数要求如上类推

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

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

案例:计算3个学生的总分

score1 = [98, 78, 80]
score2 = [99, 90, 60]
reslut = map(lambda item1,item2:item1 + item2,score1,score2)
print(list(reslut))

练习1:使用map函数提取nums中所有元素的十位数

nums = [68, 1023, 23.34, 145.89, 192]
# [6, 2, 2, 4, 9]
reslut = map(lambda item:int(item) % 100 // 10,nums)
print(list(reslut))

练习2:将学科和班号合并成班级名称

subjects = ['Python', 'java', 'h5']
nums = [2206, 2214, 2219]
# ['python2206', 'java2214', 'h52219]

reslut = map(lambda item1,item2:item1 + str(item2),subjects,nums)
print(list(reslut))

练习3:根据提供的学生信息,创建学生字典

names = ['张三', '李四', '王五', '小明']
genders = ['男', '女', '男', '男']
tels = ['1110', '12091', '27181', '18231']
# [{'name': '张三', 'gender':'男', 'tel': '1110'}, ....]

reslut = map(lambda item1,item2,item3:{'name':item1, 'gender': item2,'tels':item3},names,genders,tels)
print(list(reslut))

练习4:使用map函数来创建字典

keys = ['name', 'age', 'gender', 'tel']
values = ['小明', 18, '男', '110']
# {'name': '小明', 'age': 18, ...}


result = map(lambda i1, i2: (i1,i2) ,keys,values)
print(dict(result))

练习5:使用map函数将nums中所有的偶数除以2,所有的奇数乘以2

nums = [1, 4, 5, 7, 8]
# [2, 2, 10, 14, 4]
result = map(lambda item:item // 2 if item % 2 == 0 else item * 2,nums)
print(list(result))

3. reduce

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

reduce(函数, 序列, 初始值)

reduce(函数, 序列, 初始值) 是将序列中的元素按照函数制定的规则合并成一个数据

  • 函数的要求:
    • 有且只有两个参数(第一个参数指向初始值,第二个参数代表序列中的每个元素)
    • 有一个返回值 (用来描述合并规则)

在使用reduce的时候,需要导入一个python自带的模块: from functools import reduce
下面案例使用前提都导入了reduce模块

from functools import reduce

案例:求nums中所有元素的和

nums = [12, 30, 89, 76, 55]
# 12 + 30 + 89 + 76 + 55
result = reduce(lambda i,item:i + item, nums, 0)
print(result)

案例:求nums中所有元素的乘积

nums = [12, 30, 89, 76, 55]
# 12 * 30 * 89 * 76 * 55
result = reduce(lambda i,item:i * item,nums,1)
print(result)

案例:求nums中所有元素的个位数和

nums = [12, 30, 89, 76, 55]
# 2+0+9+6+5
result = reduce(lambda i,item: i + item % 10 ,nums,0)
print(result)

案例:将nums中所有元素合并成一个数字

nums = [12, 30, 89, 76, 55]
# 1230897655
result = reduce(lambda i,item: i + str(item),nums,'')
print(result)

案例:将list1中所有字符串的最后一个字符合并成一个新中字符串

list1 = ['anm', 'abc', 'hello', 'world']
# 'mcod'
result = reduce(lambda i,item: i + item[-1],list1,'')
print(result)

4. filter(自学)

四、迭代器

1. 什么是迭代器(iter)

**容器型数据类型: **

迭代器作为容器打印的时候无法显示元素;无法通过len获取迭代器中的元素个数;

如果要使用迭代器中元素必须将元素从迭代器中取出来,而且一旦取出来就无法再放回去。

2. 怎么创建迭代器

  1. 将其他序列转换成迭代器

直接用 iter(序列)

i1 = iter('abcdefg')
i2 = iter([10, 20, 30, 40])

print(i1)
print(i2)
print(len(i1))          # 报错!
  1. 创建生成器

3. 怎么获取迭代器中的元素

注意: 不管以什么样的方式获取到了迭代器中的元素,对应的元素一定会从迭代器中消失

1. 查单个: next(迭代器)

print(next(i1))         # a
print(next(i1))         # b
print(next(i1))         # c

注: 如果查空的迭代器,会报错

2. 遍历

for i in i2:
    print(f'x:{i}')

i3 = iter('hello')
print(i3)
print(list(i3))
# print(next(i3))         # 报错

五、生成器

1.什么是生成器

  • 容器型数据类型
  • 打印生成器也无法查看生成器中的元素;生成器无法统计个数;
  • 获取生成器中的元素,也是取一个就少一个。(生成器获取元素的方式和迭代器一样)

2. 怎么创建生成器

  • 调用带有yield关键字的函数就可以得到一个生成器
def func1():
    print('abc')
    yield
    return 100

result = func1()
print(f'reslit:{result}')

3. 生成器的元素

生成器的元素: 控制生成器产生数据的个数和产生的值

  • 控制生成器产生数据的个数和产生的值
  • 每次遇到yield的时候,yield后面的数据就是这个生成器能够创建的值
def func2():
    for i in range(5):
        yield i * 2

g2 = func2()
for x in g2:
    print('====', x)


def func3():
    print('=========1========')
    yield 100
    print('=========2========')
    yield 200
    print('=========3========')
    yield 300

g3 = func3()
print(next(g3))

s = 0
for x in range(100):
    s += x
print(s)

print(next(g3))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值