python(九)常用的内置函数builtins.py

本文深入探讨Python中的惰性求值概念,解释了生成器对象的特点,并详细分析了如map、reduce、filter等函数的工作原理。同时,介绍了Python内置函数的使用方法,包括数据类型判断、数字运算、排序、迭代器处理及内置函数的高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

反转

惰性求值、生成器对象是啥?

惰性求值

map、reduce、filter、zip对象都具有惰性求值的特性

惰性求值也叫延迟求值,顾名思义就是表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。延迟求值的一个好处是能够建立可计算的无限列表而没有妨碍计算的无限循环或大小问题,

另外,他们还有一个特性:访问过的元素不能再次访问
如:

s1 = [1, 2 , 3]
s2 = "abcd"
r = zip(s1, s2)
for i in r:
    print(i)
# 没有任何输出
for i in r:
    print(i) 

在这里插入图片描述

dir()获得对象的方法

dir()函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

可以用来获得某个对象所拥有的的方法

class A:
    a = 10


def test():
    pass


b = 20
print(b)

print(dir()) # 获得当前范围内的变量、方法、定义的类,等信息
print(dir(str)) # 获得str的变量、方法等信息

在这里插入图片描述

无法分类的函数

函数结果
abs(x)返回数字x的绝对值或复数x的模
all(iterable)如果iterator中所有元素x都有bool(x)等于True,则返回True。对于空的可迭代对象也返回True
any(iterable)只要iterator中存在元素x使得bool(x)为True,则返回True。对于空的可迭代对象,返回False
ord(x)返回 x 的Unicode码,x为单个字符
chr(x)返回ASCII码中第 x 个位置的字符,x 为数字
str(x)直接将 x 转换为字符串,x 任意类型参数

进制转换

函数结果
bin(x)将 x 转换为二进制,x 为整数
oct()将 x 转换为八进制,x 为整数 (octonary)
hex()将 x 转换为十六进制,x 为整数 (hexadecimal)

针对iterator对象函数

数字运算

函数结果
max(iterator )iterator 中所有元素的最大值
min(iterator )iterator 中所有元素的最小值
sum(iterator )iterator 的所有元素的和,其中 iterator 中的元素必须支持加法运算

max()和min()的key参数可以用来指定比较规则。

s = ["12", "12311", "2"]
print(min(s, key=len)) # 2

但是这个key可以指定成什么?

判断数据类型

函数结果
type(obj)得到obj是什么类型的
isinstance(obj, type)判断 obj 是不是 type 类型。
s = []
print(isinstance(s, list)) # True

排序 sorted

函数结果
sorted(obj)对obj进行排序并得到新列表,obj为列表、元组、字典、集合或其他可迭代对象

以字符串的长度为排序标准

s = ['12', '1111', '1', '1110']
print(sorted(s, key=lambda item: len(item)))
# ['1', '12', '1111', '1110']

以字符串的长度为排序标准;若两个字符串长度相等,则以字符串本身数字大小为第二排序标准

s = ['12', '1111', '1', '1110']
print(sorted(s, key=lambda item: (len(item), item)))
# ['1', '12', '1110', '1111']

注意这个lambda表达式是怎么写的

x = [[1, 7, 5, 3, 5],
     [8, 2, 7, 1, 6],
     [9, 6, 10, 7, 6],
     [1, 5, 3, 9, 4],
     [5, 6, 8, 7, 4]]
r = sorted(x, key= lambda item: (item[1], item[4]))
for i in r:
     print(i)

按照第二列升序排列。第二列的数相等时,则用第四列排列
在这里插入图片描述

反转

函数结果
reversed(iterator)对iterator进行翻转(首尾交换)并返回可迭代的reversed对象。iterator 为可迭代对象(生成器对象和具有惰性求值特性的zip、map、filter、enumerate等类似对象除外)
s = range(0,10)
l = reversed(s)
print(type(l)) # <class 'range_iterator'>
for i in l:
    print(i)

range(start, end, step)

函数结果
range(start, end, step)返回具有惰性求值特点的range对象,其中包含左闭右开区间。参数start默认为0,step默认为1。
for i in range(0, 10, 3):
    print(i)

在这里插入图片描述

enumerate(iterator)

函数结果
enumerate(iterator)用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组。
s = ['hello', 'world']
e = enumerate(s)
print(type(e)) # <class 'enumerate'>
for i in e:
    print(i)

在这里插入图片描述

map(func, iterator)

函数结果
map(func, *iterators)把 iterators中的每个iterator的每个元素放在 func 上过一遍,最后得到一个 map 对象。
s = 'hello'
s2 = 'world'
l = map(lambda char, c2: "this is {} and {}".format(char, c2), s, s2)
print(type(l))  # <class 'map'>
for ll in l:
    print(ll)

因为str也是一种序列,所以map将其每个元素都拆开
在这里插入图片描述
还有这种操作?

a = "123"
l = list(map(int, a))
print(l)  # [1, 2, 3]

reduce(func, iterator)

reduce(func, iterator) 是标准库 functools 中的函数

函数结果
reduce(func, iterator)func 具有两个参数,iterator 中的所有变量依次按照从左向右的顺序传入 func,最终返回一个结果(这个结果不是iterator类型)
from functools import reduce

s = range(0, 10)
r = reduce(lambda x, y: x + y, s)
r1 = reduce(lambda x, y: "{} + {}".format(x, y), s)
print(type(r))  # <class 'int'>
print(r)  # 45
print(r1)  # 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9

在这里插入图片描述

filter(func, iterator)

函数结果
filter(func, iterator)将 iterator 中满足某种条件的所有元素返回成一个 filter 对象,func 具有一个参数
import random

s= [random.randint(0, 1000) for i in range(0,20)]
s2 = filter(lambda x: x if x> 500 else False, s)
print(type(s2)) # <class 'filter'>
for i in s2:
    print(i)

zip(*iterators)

函数结果
zip(*iterators)把多个可迭代对象中的元素压缩到一起,返回一个可迭代的zip对象Z。其中Z的第 i 个元素是一个长度为 len(iterators) 的元组,该元组的元素是每个 iterator 的第 i 个元素

有点绕口,直接看例子:

s1 = [1, 2 , 3]
s2 = "abcd"
r = zip(s1, s2)
for i in r:
    print(i)

注意得到的zip对象的长度
在这里插入图片描述

id()

a = [1, 2, 3]
print(id(a)) # 2637522428424 这个号每运行一次都会改变
def id(*args, **kwargs): # real signature unknown
    """
    Return the identity of an object.
    
    This is guaranteed to be unique among simultaneously existing objects.
    (CPython uses the object's memory address.)
    """
    pass

问题

这个builtins.py中的原码

def ord(==*args, **kwargs==): # real signature unknown
    """ Return the Unicode code point for a one-character string. """
    pass

python中变量名存的是什么?

s = ['12', '1111', '1','0','-1']
s2 = s
print(s2)
s[0] = '1001'
print(s2)

存储的是[‘12’, ‘1111’, ‘1’,‘0’,’-1’]在内存中的位置

print(id(s)) # 2759183524360
print(id(s2)) # 2759183524360

builtins.py中的函数分析

def sorted(*args, **kwargs): # real signature unknown
    """
    Return a new list containing all items from the iterable in ascending order.
    
    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.
    """
    pass
<think>我们遇到了一个错误,这个错误来自于PIL(Python Imaging Library,即Pillow库)的Image模块。错误发生在尝试打开一个文件时,具体是在Image.open函数中。 错误信息:FileNotFoundError: [Errno 2] No such file or directory: '1.jpg' 这个错误很明确:我们试图打开一个名为'1.jpg'的文件,但是该文件不存在于指定的路径中。 解决方案: 1. 确认文件是否存在:检查文件路径是否正确,以及文件是否确实存在于该路径。 2. 使用绝对路径:如果文件不在当前工作目录,那么应该提供文件的绝对路径。 3. 检查文件权限:确保程序有权限读取该文件。 4. 异常处理:在代码中添加异常处理,以便在文件不存在时给出友好的提示。 下面是一个示例代码,展示如何安全地打开一个图像文件,并处理可能出现的文件不存在错误: ```python from PIL import Image def open_image(image_path): try: img = Image.open(image_path) print(f"成功打开图像: {image_path}") return img except FileNotFoundError: print(f"错误:文件 '{image_path}' 未找到。请检查文件路径。") except Exception as e: print(f"打开图像时发生未知错误: {e}") return None # 使用示例 image = open_image('1.jpg') if image: # 进行后续操作,比如显示图像或处理图像 image.show() ``` 解释: 1. 我们定义了一个函数`open_image`,它接受一个图像路径作为参数。 2. 在`try`块中,我们尝试用`Image.open`打开图像。 3. 如果文件不存在,会捕获`FileNotFoundError`异常,并打印友好的错误信息。 4. 我们还捕获了其他可能的异常,以便程序不会因为未处理的异常而崩溃。 5. 如果成功打开图像,则返回图像对象;否则返回None。 6. 在使用示例中,我们尝试打开'1.jpg',如果返回的图像对象不为None,则进行后续操作(例如显示图像)。 注意:在实际应用中,你需要确保传递给`open_image`函数的路径是正确的。如果文件不在当前工作目录,请使用绝对路径。 此外,如果你不确定当前工作目录是什么,可以使用以下代码查看当前工作目录: ```python import os print(os.getcwd()) ``` 这样你可以将文件放在当前工作目录下,或者根据打印出的路径调整文件路径。 如果问题仍然存在,请检查: - 文件名是否正确(注意大小写,尤其是在Linux系统下) - 文件扩展名是否正确(例如,有时候文件可能是'.jpeg'而不是'.jpg') - 文件是否被移动或删除 现在,针对这个错误,我们给出了解决方案和示例代码。 §§相关问题§§: 1.Python中,如何获取当前工作目录并修改它? 2. 如何使用Pillow库读取并显示一张图片? 3. 在Pillow库中,除了打开图片,还有哪些常用的图片操作? 4. 如何用Pillow库将图片转换为灰度图?</think>### 错误分析与解决方案 这个错误表明 Python 的 Pillow 库在尝试打开文件 `1.jpg` 时找不到该文件。错误发生在 `Image.open()` 方法内部,具体是当库尝试用二进制模式 (`"rb"`) 打开文件时失败。 **常见原因:** 1. 文件路径错误 2. 文件名大小写不匹配(Linux 系统区分大小写) 3. 文件扩展名实际是 `.jpeg` 而非 `.jpg` 4. 文件被移动或删除 5. 工作目录设置错误 --- ### 解决方案代码 ```python from PIL import Image import os def load_image_safely(file_path): """安全加载图像文件并处理异常""" try: # 检查文件是否存在 if not os.path.exists(file_path): raise FileNotFoundError(f"文件不存在: {file_path}") # 检查扩展名兼容性 base, ext = os.path.splitext(file_path) if ext.lower() not in ['.jpg', '.jpeg', '.png']: print(f"警告: 非常见图片格式 {ext}") # 尝试打开图像 img = Image.open(file_path) print(f"成功打开图像: {os.path.basename(file_path)}") return img except FileNotFoundError as e: print(f"错误: {str(e)}") print("当前工作目录:", os.getcwd()) print("请检查: ") print(f"1. 文件路径是否正确") print(f"2. 使用绝对路径: '/完整/路径/到/1.jpg'") print(f"3. 检查文件扩展名 (实际可能是 .jpeg)") except Exception as e: print(f"打开图像时出错: {type(e).__name__} - {str(e)}") return None # 使用示例 ===================================== if __name__ == "__main__": # 方法1: 使用绝对路径 (最可靠) # img = load_image_safely("/home/user/images/1.jpg") # 方法2: 检查当前目录下的文件 print("当前目录内容:", os.listdir()) img = load_image_safely("1.jpg") # 或尝试 "1.jpeg" if img: img.show() # 显示图像 ``` --- ### 关键代码解释: 1. **路径检查** `os.path.exists()` 验证文件是否存在,避免尝试打开不存在的文件 2. **扩展名兼容处理** 检查 `.jpg`/`.jpeg` 变体,提示非常用扩展名 3. **异常处理** - 专门捕获 `FileNotFoundError` - 通用异常捕获处理其他错误 - 返回 None 避免后续操作崩溃 4. **诊断信息** - 打印当前工作目录 (`os.getcwd()`) - 列出目录内容 (`os.listdir()`) - 提示使用绝对路径 5. **安全打开** `Image.open()` 包裹在 try-except 中,防止程序崩溃 --- ### 预防措施: 1. **使用绝对路径** ```python image_path = "/home/user/project/images/1.jpg" ``` 2. **路径拼接最佳实践** ```python import os image_dir = "project/images" filename = "1.jpg" full_path = os.path.join(image_dir, filename) ``` 3. **检查文件是否存在** ```python if not os.path.exists(full_path): print(f"找不到文件: {full_path}") ``` 4. **处理大小写问题** ```python # 在Linux系统中搜索可能的大小写变体 if not os.path.exists("1.jpg"): possible_files = [f for f in os.listdir() if f.lower() == "1.jpg"] if possible_files: print(f"尝试: {possible_files[0]}") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值