匿名函数、偏函数、内置函数

匿名函数

匿名函数语法:lambda 参数1,参数2:函数 返回值表达式
适用场景:函数内部代码非常简单(通常只有一个返回值的表达式)
一般用于函数作为参数传递的场景

# 常规函数定义:
def func(x, y):
    return x * y


# 匿名函数:
func2 = lambda x, y: x * y

res1 = func(11, 22)
res2 = func2(11, 22)
print(res1, res2)

# 运行结果为:
242 242

=========================================================================================

匿名函数应用场景

# 问题需求一:对下面的列表进行排序(规则:根据列表中每个元素的第二个值的大小进行排序)
li = [[1, 10, 32], [3, 22, 99], [2, 7, 77]]

# 备注:列表的 sort 方法中的参数 key 是用来接收排序的规则函数
li.sort(key=lambda x: x[1])
print(li)

# 运行结果为:
[[2, 7, 77], [1, 10, 32], [3, 22, 99]]

在这里插入图片描述

=========================================================================================

# 问题需求二:对下面的列表进行排序(规则:根据元素 name 字段的值的大小进行排序)
li2 = [{'id': 1, 'name': 100}, {'id': 7, 'name': 9}, {'id': 3, 'name': 1}]
li2.sort(key=lambda i:i["name"])
print(li2)

# 运行结果为:
[{'id': 3, 'name': 1}, {'id': 7, 'name': 9}, {'id': 1, 'name': 100}]

=========================================================================================

面试题:(挖坑的题目)

li = [lambda x: x * i for i in range(5)]
print(li)
for i in li:
    res = i(4)
    print(res)

=========================================================================================

偏函数

from functools import partial


# 内置函数 filter:过滤器
# 参数1:过滤规则函数,会根据函数的返回值来进行过滤
# 参数2:要进行过滤的可迭代对象
# 需求:获取列表中大于10的数据
li = [11, 22, 33, 44, 5, 6, 8, 55]
res = filter(lambda x: x > 10, li)
print(res)
print(list(res))


# ----------------------------
li1 = [1, 22, 3, 44, 5, 66, 7, 88, 9]
s1 = filter(lambda x: x > 10, li1)

li2 = [13, 24, 3, 4, 53, 6, 78, 8, 9]
s2 = filter(lambda x: x > 10, li2)

li3 = [2, 4, 3, 4, 51, 61, 7, 81, 9]
s3 = filter(lambda x: x > 10, li3)

# 偏函数的作用:可以用来固定函数的函数
my_filter = partial(filter, lambda x: x > 20)

res = my_filter(li2)
print(my_filter)
print(list(res))


# ----------------------------------------------------
def func(a, b, c):
    print("a:", a)
    print("b:", b)
    print("c:", c)


func2 = partial(func, 11, 22)

func(11, 22, 33)
print("----------------------")
func2(33)

=========================================================================================

对批量的数据执行相同的函数

# 对批量的数据执行相同的函数
li = [11, 22, 33, 44, 55, 66, 77]


def handle_data(number):
    return number * 2

# 将li中的元素,遍历,传入handle_data,再把结果放入一个新的列表
list(map(handle_data, li))


li2 = [handle_data(i) for i in li]
print(li2)
# 包含url地址的列表
li = ["http://www.baidu.com-{}".format(i) for i in range(10)]


def rueqsts(url):
    print("请求:", url)


list(map(rueqsts, li))

=========================================================================================

all:迭代对象内所有的元素为真,返回 True

# all:迭代对象内所有的元素为真,返回 True
def work(name=None, age=None, sex=None):
    if name and age and sex:
        print('---成立01---')

    if all([name, age, sex]):
        print("---成立02---")

=========================================================================================

any:迭代对象内只要有一个元素为真,返回True

def work(name=None, age=None, sex=None):
    if name or age or sex:
        print('---成立01---')

    if any([name, age, sex]):
        print("---成立02---")

=========================================================================================

eval:识别字符串中有效的 python 表达式

str1 = "10 > 9"
print(str1)
print(eval(str1))

# str1 = "a = 109"    # 报错,eval不能执行赋值语句
print(str1)
print(eval(str1))

=========================================================================================

exec:执行字符串中有效的 python 代码

str1 = """
def tian():
    print("tian--100")
"""

exec(str1)
tian()

str1 = "a = 109"
print(str1)
print(exec(str1))

=========================================================================================

练习题三道

"""
1、现在有一个列表   li = [11,21,4,55,6,67,123,54,66,9,90,56,34,22], 
请将 大于5的数据过滤出来,然后除以2取余数,结果放到一个生成器中
"""


def job1():
    li = [11, 21, 4, 55, 6, 67, 123, 54, 66, 9, 90, 56, 34, 22]
    res = (i % 2 for i in li if i > 5)
    print(res)


job1()
"""
2、定义一个可以使用send传入域名,自动生成一个在前面加上http://,在后面加上路径/user/login的url地址,
生成器最多可以生成5个url,生成5条数据之后再去生成,则报错StopIteration
使用案例:
# 例如:
res = g.send('www.baidu.com')
# 生成数据res为:http://www.baidu.com/user/logim'
"""


def job2():
    res = yield
    for i in range(5):
        res = yield f"http://{res}user/logim'"


g = job2()
next(g)
print("生成的数据:", g.send('www.hao121.com'))
print("生成的数据:", g.send('www.hao122.com'))
print("生成的数据:", g.send('www.hao123.com'))
print("生成的数据:", g.send('www.hao124.com'))
print("生成的数据:", g.send('www.hao125.com'))
# print("生成的数据:", g.send('www.hao126.com'))

"""
3、面试笔试扩展题
有一个正整数列表(数据是无序的,并且允许有相等的整数存在),
编写一个能实现下列功能的函数,传入列表array,和正整数X,返回下面要求的2个数据
def func(array, x)
    '''逻辑代码'''
    return count, li
1、统计并返回在列表中,比正整数x大的数有几个(相同的数只计算一次),并返回-----返回值中的的count
2、计算列表中比正整数X小的所有偶数,并返回  -----------返回值中的li
"""


def job3(array, x):
    # 比正整数x大的数
    count = len({i for i in array if i > x})
    # 比正整数X小的所有偶数
    li = [i for i in array if i < x and i % 2 == 0]
    return count,li

res = job3([1,22,3,44,5,66,77,88],99)
print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值