内置函数的使用方法:

locals:函数会以字典的类型返回当前位置的所有局部变量
globals:函数会以字典的类型返回全部局部变量
zip: 可以把多个可迭代内容进行合并
sorted: 排序
filter: 筛选
map: 映射

locals和globals

locals:函数会以字典的类型返回当前位置的所有局部变量:

globals:函数会以字典的类型返回全部局部变量:

locals:

下面这段代码:此时locals被写在了全局作用域范围内. 此时看到的就是当前作用域(全局)中的变量内容

a = 188

print(locals())  # 此时locals被写在了全局作用域范围内. 此时看到的就是当前作用域(全局)中的内容

#执行结果
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000166DC5150D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\Python\\装饰器.py', '__cached__': None, 'a': 188}

下面这段代码:此时locals放在局部作用域范围, 看到的就是局部作用域的变量内容

a = 188

def func():
b = 336
print(locals()) # 此时locals放在局部作用域范围, 看到的就是局部作用域的内容
func() #运行结果
{'b': 336}

globals

此时globcals虽然放在局部作用域范围, 但是看到的是全局作用域的变量内容

a=188

def func():
b = 336
print(globals()) # 此时globals虽然放在局部作用域范围, 但是看到的是全局作用域的内容
func() #运行结果
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000166DC5150D0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\Python\\装饰器.py', '__cached__': None, 'a': 188, 'func': <function func at 0x00000166DC7EA020>}

globcals不论写在哪里都是全局作用于的变量内容

zip

zip: 可以把多个可迭代内容进行合并

我们想把每个列表的第1位、第2位、第3位打包放在一起,手写的操作方法如下:

#       0         1       2
lst1 = ["赵本山", "范伟", '苏有朋']
lst2 = [40, 38, 42]
lst3 = ["卖拐", "耳朵大有福", "情深深雨蒙蒙"] result = []
for i in range(len(lst1)):
first = lst1[i]
second = lst2[i]
third = lst3[i]
result.append((first, second, third))
print(result) #运行结果
[('赵本山', 40, '卖拐'), ('范伟', 38, '耳朵大有福'), ('苏有朋', 42, '情深深雨蒙蒙')]

在python中的zip函数可以直接实现这样的操作,下面我们用dir先来看下zip中有哪些功能,

result =zip(lst1,lst2,lst3)
print(dir(result)) #运行结果
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

dir()中我们可以看到,通过zip内置函数得到的result函数内部是拥有__iter__证明是可迭代的;又有__next__代表它是迭代器。因此:我们用for循环,把里面的数都拿出来即可。

lst1 = ["赵本山", "范伟", '苏有朋']
lst2 = [40, 38, 42]
lst3 = ["卖拐", "耳朵大有福", "情深深雨蒙蒙"] result = zip(lst1, lst2, lst3)
for item in result:
print(item) #运行结果
('赵本山', 40, '卖拐')
('范伟', 38, '耳朵大有福')
('苏有朋', 42, '情深深雨蒙蒙')

我们还能一步就拿到列表:前面讲过了list中是存在循环遍历的。

result =zip(lst1,lst2,lst3)
lst= list(result)
print(lst) #运行结果
[('赵本山', 40, '卖拐'), ('范伟', 38, '耳朵大有福'), ('苏有朋', 42, '情深深雨蒙蒙')]

sorted: 排序

sorted()有三个参数,基本语法是:

sorted(__iterable, key=None, reverse=False)

其中:

  1. iterable: 要排序的可迭代对象,例如列表、元组等。

  2. key: 用于指定一个函数(或其他可调用对象),它将被用于提取比较键(排序关键字)的值。默认为 None,表示直接比较元素本身而不进行特殊的处理。

  3. reverse: 一个布尔值,表示是否按逆序排序。默认为 False,表示升序排序;如果设置为 True,则按降序排序。

因为key的默认值是None并且reverse默认值是False,因此可以只写可迭代的对象:

lst = [4, 2, 7, 1, 9]

# 默认升序排序
s = sorted(lst)
print(s) # 输出 [1, 2, 4, 7, 9]

key=abs是绝对值reverse=True是从大到小reverse=False是从小到大

# 按绝对值降序排序
s1 = sorted(lst, key=abs, reverse=True)
print(s1) # 输出 [9, 7, 4, 2, 1]

注意:sorted() 函数返回一个新的已排序的列表,而不会修改原始的可迭代对象。如果你想要在原地排序(修改原始对象),可以使用列表的 sort() 方法。

思考:key应该怎么用

如果我有一个这样的列表,需要排序。他们不是数字,该如何操作呢?

lst = ["秋", "张二嘎", "比克", "卡卡罗特", "超级宇宙无敌大帅G"]

这里我们就要用到一个排序函数func来处理key的算法

sorted(iterable, key=func, reverse=False)

比如,我们想要以字母长度排序,就可以这样写

lst = ["秋", "张二嘎", "比克", "卡卡罗特", "超级宇宙无敌大帅G"]    #这里是实参

def func(item):  # item这里是形参,对应的就是列表中的每一项数据
return len(item) s = sorted(lst, key=func)
print(s) #执行结果
['秋', '比克', '张二嘎', '卡卡罗特', '超级宇宙无敌大帅G']

然而,这里完全可以用匿名函数来处理

def func(item):    # item是形参
return len(item) #匿名函数来替代
func = lambda x:len(x) # x也是形参

引入匿名函数,一步解决。这就是匿名函数的主要用处1

lst = ["秋", "张二嘎", "比克", "卡卡罗特", "超级宇宙无敌大帅G"]

s = sorted(lst, key=lambda x:len(x), reverse=False)
print(s)

练习:

lst = [
{"id": 1, "name": "周润发", "age": 18, "salary": 5200},
{"id": 2, "name": "周星驰", "age": 28, "salary": 511100},
{"id": 3, "name": "周海媚", "age": 78, "salary": 561230},
{"id": 4, "name": "周伯通", "age": 12, "salary": 532100},
{"id": 5, "name": "周大兴", "age": 35, "salary": 53210},
{"id": 6, "name": "周什么", "age": 47, "salary": 520},
{"id": 7, "name": "周扒皮", "age": 58, "salary": 12},
]

1.根据每个人的年龄排序

s = sorted(lst, key=lambda d: d['age'])
print(s)

2.根据工资进行排序. 从大到小

s = sorted(lst, key=lambda d: d['salary'], reverse=True)
print(s)

filter: 筛选

filter() 函数是 Python 内置函数之一,用于过滤序列中的元素,根据给定的函数(返回布尔值的函数,即谓词函数)决定是否保留元素。该函数的基本语法是:

filter(__function, __iterable)

其中:

  • function: 一个用于筛选元素的函数,该函数应返回 TrueFalse
  • iterable: 要过滤的可迭代对象,如列表、元组等。

filter() 返回一个由函数返回 True 的元素所组成的迭代器。

我们要把这个列表删选所有姓"张"的人找出来

lst = ["张无忌", "张三丰", "张翠山", "灭绝小师太", "小狐仙"]

使用filter进行筛选

#        T        T         T         F             F
lst = ["张无忌", "张三丰", "张翠山", "灭绝小师太", "小狐仙"]
f = filter(lambda x: x.startswith("张"), lst)
print(list(f))

lambda x: x.startswith("张") 是一个谓词函数,用于判断元素是否为"张"开头。filter() 将该函数应用于 lst 列表的每个元素,并返回一个由符合条件的元素组成的迭代器,最后通过 list() 转换成列表。

如果要拿到不是姓"张"的人,我们可以用not做调节

lst = ["张无忌", "张三丰", "张翠山", "灭绝小师太", "小狐仙"]
f = filter(lambda x: not x.startswith("张"), lst)
print(list(f))

注意事项:

  1. 返回类型: filter() 返回的是迭代器,因此需要将其转换为列表或其他类型,以便查看或进一步处理结果。

  2. 谓词函数: 谓词函数是一个返回布尔值的函数,用于判断元素是否应该被保留。

  3. 可读性: 谨慎使用复杂的谓词函数,以保持代码的可读性。

map:映射

map() 函数是 Python 内置函数之一,用于将一个函数应用于可迭代对象的每个元素,返回一个由函数处理后的结果组成的迭代器。其基本语法如下:

map(__function, __iterable, ...)

其中:

  • function: 用于处理每个元素的函数。
  • iterable: 要处理的可迭代对象,如列表、元组等。
  • ...: 可以传递多个可迭代对象,此时 function 函数必须接收对应数量的参数。

map() 返回一个迭代器,它产生将函数应用于每个元素后的结果。

map()filter()的用法非常类似,他们的区别是filter()把筛选出来的值做只真假判断,真就返回,假就丢弃。map()是把筛选出来的值做运算,在运算后把运算结果返回。

map()存在的价值:

在后期如果需要做数据分析,对大量数据做批量的处理,传统的列表推导式无法实现,所以会用到map()的方法。

示例:

我们可以用列表的推导式来实现对lst的所有的数的平方

lst = [1,2,3,4,5,6,7,8,9]

result = [item * item for item in lst]
print(result) #运行结果
[1, 4, 9, 16, 25, 36, 49, 64, 81]

我们可以用到map()直接操作

# 将列表中的每个元素都平方
lst = [1,2,3,4,5,6,7,8,9]
result = map(lambda x: x**2, lst)
print(list(r)) # 输出 [1, 4, 9, 16, 25, 36, 49, 64, 81]

在这个例子中,lambda x: x**2 是应用于 numbers 列表中每个元素的函数,map() 返回一个迭代器,其中包含了每个元素平方的结果。

多个可迭代对象的示例:

# 将两个列表对应位置的元素相加
list1 = [1, 2, 3]
list2 = [4, 5, 6]
sum_result = map(lambda x, y: x + y, list1, list2)
print(list(sum_result)) # 输出 [5, 7, 9]

在这个例子中,lambda x, y: x + y 函数接收两个参数,分别来自 list1list2 的对应位置的元素,然后返回它们的和。

注意事项:

  1. 返回类型: map() 返回的是迭代器,因此需要将其转换为列表或其他类型,以便查看或进一步处理结果。

  2. 函数的参数: 函数必须接受与提供的可迭代对象相同数量的参数。如果提供了多个可迭代对象,则函数必须接受相应数量的参数。

  3. 可读性: 谨慎使用复杂的函数,以保持代码的可读性。

Python——第四章:内置函数(下)的更多相关文章

  1. python字符串——"奇葩“的内置函数

      一.前言 python编程语言里的字符串与我们初期所学的c语言内的字符串还是有一定不同的,比如python字符串里的内置函数就比语言的要多得多:字符串内的书写格式也会有一点差异,例:字符串内含有引 ...

  2. python 类(object)的内置函数

    python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...

  3. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

  4. [Python笔记]第四篇:内置函数

    本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...

  5. 万恶之源 - Python装饰器及内置函数

    装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...

  6. Python之生成器及内置函数篇4

    一.可迭代对象 #1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来 #2.可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象 #3.迭代 ...

  7. Python每日一练------内置函数+内置变量+内置模块

    1.内置函数 Python所有的内置函数     Built-in Functions     abs() divmod() input() open() staticmethod() all() e ...

  8. Python 的基本运算和内置函数

    一.运算符 (一)Python算术运算符 以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a ...

  9. Python学习日记(十一) 内置函数

    什么是内置函数? 就是Python中已经写好了的函数,可以直接使用 内置函数图表: 以3.6.2为例 内置函数分类: 一.反射相关 1.hasattr() 2.getattr() 3.setattr( ...

  10. Python装饰器及内置函数

    装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...

随机推荐

  1. 支持JDK19虚拟线程的web框架,之四:看源码,了解quarkus如何支持虚拟线程

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...

  2. Solution -「HDU 3507」Print Article

    Description Link. 给出 \(N\) 个单词,每个单词有个非负权值 \(C_{i}\),现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数 \(M\),即 \(( ...

  3. RK3568开发笔记(十一):开发版buildroot固件移植一个ffmpeg播放rtsp的播放器Demo

    前言   目标开发任务还有个功能,就是播放rtsp摄像头,当然为了更好的坐这个个,我们必须支持rtsp播放失败之后重新尝试,比如5s重新尝试打开一次,从而保障联网后重新打开,然后达成这个功能.   D ...

  4. Springboot简单功能示例-5 使用JWT进行授权认证

    springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...

  5. 基于react18+vite4+arco.design搭建极简版后台管理模板

    趁着国庆前夕整了一个vite4结合react18搭建后台管理模板,搭配上字节团队react组件库ArcoDesign,整体操作功能非常丝滑.目前功能支持多种模板布局.暗黑/亮色模式.国际化.权限验证. ...

  6. gitlab ci 集成 eslint/prettier/tsc 做代码审查,并使用 eslint 输出作为显示代码质量

    前言 想自动化一下公司里代码的部分审查,最初想用 reviewdog 的,但是公司的域名基本都在 VPN 中访问的,gitlab ci 的容器中是访问不到的,于是乎实验了 gitlab 代码质量功能. ...

  7. Util应用框架Web Api开发快速入门

    本文是使用Util应用框架开发 Web Api 项目快速入门教程. 前面已经详细介绍了环境搭建,如果你还未准备好,请参考前文. 开发流程概述 创建代码生成专用数据库. Util应用框架需要专门用来生成 ...

  8. helm仓库harbor搭建及上传helm

    1.仓库搭建(harbor) 注意: 基础环境为docker 使用docker-compose安装 1.1.docker安装 # 安装需要的软件包 # yum-util 提供yum-config-ma ...

  9. Windows系统下,GoLand的Terminal选定Git Bash作为终端,使用其上传代码时,出现中文乱码的问题

    问题描述 按照这位博主博客写的没有完全解决乱码问题博主博客 这个博主博客是我后来发现,暂时还没去验证是否可行博主博客 解决方案 notepad++直接Free Download,然后就一直下一步就无脑 ...

  10. 全网最详细4W字Flink全面解析与实践(下)

    本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 承接上篇未完待续的话题,我们一起继续Flink的深入探讨 Flink S ...