python-(5-3)内置函数-zip locals globals sorted filter map

一. zip()

作用:将多个可迭代的内容进行合并
需求:已知有3个列表,按照相同索引为一组的原则,将其打印到一个列表中。

lst1 = ["赵本山","范伟","苏有朋"]
lst2 = [40, 36, 34]
lst3 = ["刘老根", "耳朵大有福", "教主"]

例如,赵本山,40,刘老根都是3个列表的索引为0的元素,这三个元素就打印在一起。

方法一:
手写算法如下:

lst1 = ["赵本山","范伟","苏有朋"]
lst2 = [40, 36, 34]
lst3 = ["刘老根", "耳朵大有福", "教主"]

# 创建一个空列表,接收结果
result = []

# 用for循环遍历所有元素
for i in range(len(lst1)):
    # 接收lst1的元素
    first = lst1[i]
    # 接收lst2的元素
    second = lst2[i]
    # 接收lst3的元素
    third = lst3[i]
    # 将结果依次累加赋值给空列表
    result.append((first,second,third))
# 打印结果
print(result)

代码执行结果如下:
在这里插入图片描述

方法二:

# 使用zip()内置函数
result = zip(lst1,lst2,lst3)
# 遍历结果
for item in result:
    print(item)

代码执行结果如下:

在这里插入图片描述

如果要将最终结果放在同一列表中,代码如下:

# 将结果放在列表中
result = zip(lst1,lst2,lst3)
lst = list(result)
print(lst)

最终执行结果与方法一一样。

二. locals() 和 globals()

当locals()写在全局作用域范围内,此时看到的就是全局作用域中的内容。
执行下面代码:

lst1 = ["赵本山","范伟","苏有朋"]
lst2 = [40, 36, 34]
lst3 = ["刘老根", "耳朵大有福", "教主"]

a = 100
print(locals())

得到结果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000015768AE7C70>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\python\\py_work_01\\main.py', '__cached__': None, 'lst1': ['赵本山', '范伟', '苏有朋'], 'lst2': [40, 36, 34], 'lst3': ['刘老根', '耳朵大有福', '教主'], 'a': 100}

我们只看最后的:‘a':100表示此时在全局作用域中

然后构造一个函数,将其放在函数中执行代码:

def fun():
    a = 10
    print(locals())
fun()

执行代码后的结果是:
在这里插入图片描述
表示此时locals在局部作用域范围内,看到的是局部作用域中的内容。

与之相对应的是,无论写在哪里,globals都显示全局作用域的内容。

# 在全局中写入
a = 100
print(globals())

# 在函数内写入
def fun():
    a = 10
    print(globals())
fun()

执行结果如下:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000022962377C70>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\python\\py_work_01\\main.py', '__cached__': None, 'lst1': ['赵本山', '范伟', '苏有朋'], 'lst2': [40, 36, 34], 'lst3': ['刘老根', '耳朵大有福', '教主'], 'a': 100}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000022962377C70>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\python\\py_work_01\\main.py', '__cached__': None, 'lst1': ['赵本山', '范伟', '苏有朋'], 'lst2': [40, 36, 34], 'lst3': ['刘老根', '耳朵大有福', '教主'], 'a': 100, 'fun': <function fun at 0x00000229623D3E20>}

三. sorted()

首先简单使用sorted()函数,将列表中的一组数据从大到小排序

lst = [10, 99, 3, 200, 54, 102]
# 如果不加reverse=True,那么默认reverse=False,即从小到大排序
ret = sorted(lst,reverse=True)
print(ret)

但现实情况是,我们排序的数据不一定是数字,需要自定义排序规则。

lst = ["卡卡罗特","比鲁斯","奥斯特洛夫斯基","维斯","宇宙无敌超级暴龙战士"]

# 构建函数,自定义排序规则
def func(item):
    # 根据每个元素的长度作为返回值,进行排序
    return len(item)

# 使用排序规则,func不能加括号,否则就是调用函数
ret = sorted(lst,key=func)
# 输出结果
print(ret)

此外,我们可以用lambda代替函数func,将上述的第三、五、八行换成下面两行

func = lambda x:len(x)
ret = sorted(lst,key=func)

甚至,上面的两行最终又精简为一行总共三行代码:

lst = ["卡卡罗特","比鲁斯","奥斯特洛夫斯基","维斯","宇宙无敌超级暴龙战士"]
ret = sorted(lst,key=lambda x:len(x))
print(ret)

最后自定义一个列表,根据年龄和工资进行排序

lst = [
    {"name":"李四","age":39, "salary":3000},
    {"name":"李非","age":19, "salary":30000},
    {"name":"李大嘴","age":30, "salary":8000},
    {"name":"李明","age":20, "salary":300},
    {"name":"李云龙","age":35, "salary":900},
]

# 根据年龄从小到大排序
ret1 = sorted(lst, key=lambda x:x["age"])
# 根据工资从高到低排序
ret2 = sorted(lst, key=lambda x:x["salary"], reverse=True)
print(ret1,ret2)

四. filter() 和 map()

filter()的作用是筛选

# 给出列表数据
lst = ["周星驰", "周润发", "张三丰", "周伯通", "王老七", "灭绝师太"]
# 筛选出姓周的人
ret1 = filter(lambda x:x.startswith("周"),lst)
# 由于是生成器,所以不能直接打印结果,可以转化成列表打印出来
print(list(ret1))
# 筛选出不姓周的人
ret2 = filter(lambda x: not x.startswith("周"),lst)
print(list(ret2))

map()的作用是映射

给出一组数据,要求得出每个数据的三次方结果,并打印出来

方法一:使用循环遍历

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ret = [item ** 3 for item in lst]
print(ret)

方法二:使用map()内置函数

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ret = map(lambda x:x**3, lst)
print(list(ret))

此处需要注意的是,与zip() filter()相同,最终得到的都是生成器,需要将其转换成列表才能输出结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值