ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

learnxinyminutes-docs 仓库西班牙语版 Python 速成教程:从基础语法到高级特性的完整实战指南

learnxinyminutes-docs 仓库西班牙语版 Python 速成教程:从基础语法到高级特性的完整实战指南 文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载Python 由 Guido van Rossum 于 90 年代初创造如今已成为世界上最流行的编程语言之一其魅力正在于语法的清晰性——它本质上就是可执行的伪代码。本文以 learnxinyminutes-docs 仓库中的 es/python.md西班牙语版 Python 教程为骨架结合英文原版 python.md 及仓库的校验脚本 lint/frontmatter.py逐节讲解 Python 的基础数据类型、集合、控制流、函数、类、模块与高级特性并在每节补充底层原理与实战要点帮助你快速掌握一门语言的完整脉络。该仓库的定位是以代码形式编写的文档每篇教程本身就是一段可运行的、带大量注释的合法代码边运行边讲解。因此本文所有代码块均可直接复制为.py文件运行验证。西班牙语版es/目录由 Louie Dinh 原作、Camilo Garrido 翻译属于仓库中 30 余种语言译本之一仓库 lint/frontmatter.py 会对每篇文档的 YAML 元数据contributors、translators、filename等字段做格式与类型校验确保翻译稿与英文原版结构一致。1. 基础数据类型与运算符1.1 注释与多行字符串# 单行注释以井号almohadilla开头 多行字符串可以用三个引号书写 通常用作文档说明docstring。 Python 的单行注释以#开始三个双引号或单引号包裹的多行字符串常被用作模块、类、函数的文档字符串。这一点在后续装饰器一节会再次体现__doc__属性保存的正是这类 docstring。1.2 数字与算术运算3 # 3 1 1 # 2 8 - 1 # 7 10 * 2 # 20除法默认返回浮点数35 / 5 # 7.0——即使两个操作数都是整数/的结果也总是float这是 Python 3 与 Python 2 最大的差异之一Python 2 中/对整数做整除。整除运算符//34 // 5 # 6向下取整向负无穷方向取整英文原版中特别指出-5 // 3得-2而不是-1。取模运算符%34 % 5 # 4即余数34 - (5 * 6) 4。浮点数参与运算时结果自动提升为浮点3 * 2.0 # 6.0。幂运算**4 ** 3 # 64。用括号强制优先级(1 3) * 2 # 8。从源码层面看Python 内置的数值运算由解释器直接映射到 C 层的算术指令运算符的优先级与数学惯例一致//与%的组合满足恒等式a (a // b) * b (a % b)可用它来推导任意运算结果。1.3 布尔值与比较运算True False not True # False not False # True 1 1 # True 2 1 # False 1 ! 1 # False 2 ! 1 # True 1 10 # True 1 10 # False 2 2 # True 2 2 # True 1 2 3 # True # 比较可以链式拼接 2 3 2 # False要点布尔值只有True和False两个字面量注意首字母大写。not取反、判断相等、!判断不等。Python 支持链式比较1 2 3等价于1 2 and 2 3且中间表达式只求值一次。英文原版还补充了一个易错点True和False本质上是1和0的不同写法因此True True # 2比较运算符会按数值看待它们如0 False # True、2 True # True。若对整数使用and/or这类逻辑运算符返回的是参与运算的原始值而非布尔值如0 and 2 # 0、-5 or 0 # -5这与位运算/|截然不同切勿混淆。1.4 字符串Esto es un string. Esto también es un string Hello world! # Hello world! # 字符串可以相加拼接 Esto es un string[0] # E # 字符串可按字符下标访问 {} pueden ser {}.format(strings, interpolados) # .format 格式化 {0} sé ligero, {0} sé rápido, {0} brinca sobre la {1}.format(Jack, vela) # Jack sé ligero, Jack sé rápido, Jack brinca sobre la vela # 参数可复用 {nombre} quiere comer {comida}.format(nombreBob, comidalasaña) # Bob quiere comer lasaña # 关键词参数 nombre Bob comida Lasaña f{nombre} quiere comer {comida} # Bob quiere comer lasaña # f-string 插值Python 3.6字符串要点可用单引号或双引号创建二者等价。拼接字符串字符串是不可变序列可用下标取单个字符。.format()支持位置参数{}、可复用序号参数{0}、关键词参数{nombre}。f-string格式化字符串字面量自 Python 3.6 引入花括号内可直接写任意合法表达式如f{nombre} es {len(nombre)} caracteres.。英文原版特别给出了f{name} is {len(name)} characters long.的示例说明大括号内可以嵌套函数调用。英文原版还提到字符串字面量非变量之间可以省略直接相邻拼接如Hello world!。1.5 None 与真值判断None # None # None 是一个对象 etc is None # False None is None # True bool(0) # False bool() # False bool([]) # False bool({}) # False bool(set()) # FalseNone是 Python 中表示空/无的唯一对象。不要用与 None 比较应使用isis比较的是对象身份同一性比较的是值。英文原版用列表演示了这一区别b a时b is a为True而重新赋值b [1, 2, 3, 4]后b is a变为False、b a仍为True。真值规则None、0、空字符串、空列表、空字典、空集合以及英文版补充的空元组()都求值为False其余一切值都是True。2. 变量与集合Variables y Colecciones2.1 变量与 printprint(Soy Python. Encantado de conocerte) una_variable 5 # 无需先声明赋值即创建命名惯例是 snake_case小写加下划线 una_variable # 5 otra_variable # 访问未赋值的变量会抛 NameErrorPython 没有变量声明只有赋值绑定访问未绑定名称会抛出NameError。print()默认在末尾输出换行英文原版补充了end参数可自定义结尾如print(Hello, World, end!)以及input(...)从控制台读取输入并返回字符串。英文原版还演示了 Python 的三元表达式yay! if 0 1 else nay! # nay!等价于 C 语言的?:。2.2 列表Listaslista [] # 空列表 otra_lista [4, 5, 6] # 预填充列表 lista.append(1) # 末尾追加 [1] lista.append(2) # [1, 2] lista.append(4) # [1, 2, 4] lista.append(3) # [1, 2, 4, 3] lista.pop() # 3 # 弹出末尾元素列表回到 [1, 2, 4] lista.append(3) # 放回去 lista[0] # 1 # 按下标访问 lista[-1] # 3 # 负索引取末尾元素 lista[4] # 越界抛 IndexError lista[1:3] # [2, 4] # 切片左闭右开起始含、结束不含 lista[2:] # [4, 3] # 省略起始 lista[:3] # [1, 2, 4] # 省略结束 lista[::2] # [1, 4] # 步长为 2 lista[::-1] # [3, 4, 2, 1] # 反转 # 通用语法lista[inicio:final:paso]起始:结束:步长 del lista[2] # 删除任意下标元素列表变为 [1, 2, 3] lista otra_lista # [1, 2, 3, 4, 5, 6] # 相加生成新列表原列表不变 lista.extend(otra_lista) # 就地拼接lista 变为 [1, 2, 3, 4, 5, 6] 1 in lista # True # 成员检查 len(lista) # 6 # 长度切片是 Python 序列操作的核心lista[start:end:step]采用左闭右开区间数学上的 closed/open range支持省略起始、结束、步长且负步长可反转。英文原版额外补充li2 li[:]可创建浅拷贝此时li2 is li为Falseli.remove(2)删除第一个匹配值不存在时抛ValueErrorli.insert(1, 2)在指定下标插入li.index(2)返回第一个匹配项下标不存在抛ValueError。2.3 元组Tuplastupla (1, 2, 3) tupla[0] # 1 tupla[0] 3 # 元组不可变赋值抛 TypeError len(tupla) # 3 tupla (4, 5, 6) # (1, 2, 3, 4, 5, 6) tupla[:2] # (1, 2) 2 in tupla # True a, b, c (1, 2, 3) # 解包a1, b2, c3 d, e, f 4, 5, 6 # 省略括号也能创建元组并解包 e, d d, e # 一行代码交换两个变量的值元组像列表但不可变可执行大多数列表操作len、拼接、切片、in。解包unpacking是元组最实用的特性e, d d, e优雅地完成变量交换。英文原版补充了单元素元组的陷阱type((1)) # class int必须写成(1,)才是元组还演示了扩展解包a, *b, c (1, 2, 3, 4)其中b收集中间所有元素为列表[2, 3]。2.4 字典Diccionariosdicc_vacio {} # 空字典 dicc_lleno {uno: 1, dos: 2, tres: 3} dicc_lleno[uno] # 1 # 按键取值 list(dicc_lleno.keys()) # [tres, dos, uno] # 所有键 list(dicc_lleno.values()) # [3, 2, 1] # 所有值 # 注意Python 3.7 不保证键的顺序3.7 起保持插入顺序 uno in dicc_lleno # True # 键存在检查 1 in dicc_lleno # False # 注意 in 检查的是键而非值 dicc_lleno[cuatro] # 键不存在抛 KeyError dicc_lleno.get(uno) # 1 # get 避免 KeyError dicc_lleno.get(cuatro) # None dicc_lleno.get(uno, 4) # 1 # get 支持默认值 dicc_lleno.get(cuatro, 4) # 4 dicc_lleno.setdefault(cinco, 5) # 仅当键不存在时插入现在 dicc_lleno[cinco]5 dicc_lleno.setdefault(cinco, 6) # 键已存在仍为 5 del dicc_lleno[uno] # 删除键字典是键值映射结构keys()/values()返回的是可迭代视图需要用list()包一层才能得到列表。键的存在检查用in只查键不查值查询不存在的键会抛KeyError。get(key, default)是安全的取值方式键缺失时返回默认值默认None。setdefault(key, value)只在键不存在时写入常用于初始化缓存。英文原版补充了键必须是不可变类型int、float、str、tuple这一底层原因键需能计算稳定的哈希值用于快速查找{[1,2,3]: 123}会抛TypeError: unhashable type: list而{(1,2,3): [1,2,3]}合法还演示了update()批量添加与{a: 1, **{b: 2}}的字典解包合并语法Python 3.5。2.5 集合Setsconjunto_vacio set() # 空集合必须用 set()不能用 {} un_conjunto {1, 2, 2, 3, 4} # un_conjunto 现在是 {1, 2, 3, 4}自动去重 conjunto_lleno.add(5) # 添加元素 otro_conjunto {3, 4, 5, 6} conjunto_lleno otro_conjunto # {3, 4, 5} # 交集 conjunto_lleno | otro_conjunto # {1, 2, 3, 4, 5, 6} # 并集 {1, 2, 3, 4} - {2, 3, 5} # {1, 4} # 差集 2 in conjunto_lleno # True 10 in conjunto_lleno # False集合存储无序、唯一、可哈希的元素字面量{...}与字典共用花括号但空集合只能写set()。交集、|并集、-差集是集合的三大运算。英文原版补充^对称差集{1,2,3,4} ^ {2,3,5} # {1, 4, 5}、子集/超集比较{1,2} {1,2,3} # True、元素同样必须不可变{[1], 1}抛 TypeError、以及some_set.copy()浅拷贝。3. 控制流与可迭代对象Control de Flujo3.1 if / elif / elseuna_variable 5 if una_variable 10: print(una_variable es completamente mas grande que 10.) elif una_variable 10: # elif 分支可选 print(una_variable es mas chica que 10.) else: # else 也可选 print(una_variable es de hecho 10.)缩进在 Python 中具有语法意义这是与大多数语言的根本区别。规范建议使用 4 个空格而非制表符英文原版明确说明。英文原版还介绍了 Python 3.10 新增的match/case模式匹配command run match command: case run: print(The robot started to run) case speak | say_hi: # OR 模式多个选项 print(The robot said hi) case code if command.isdigit(): # 带条件守卫 print(fThe robot execute code: {code}) case _: # 通配符等价 default print(Invalid command)3.2 for 循环与 range# for 遍历可迭代对象列表、字符串、字典、元组、生成器…… for animal in [perro, gato, raton]: print({} es un mamifero.format(animal)) # 输出 # perro es un mamifero # gato es un mamifero # raton es un mamifero # range(número) 返回从 0 到给定数字不含的数值序列 for i in range(4): print(i) # 输出0 1 2 3 # 英文原版补充 range 的三种形态 for i in range(4, 8): # range(起始, 结束)4 5 6 7 for i in range(4, 8, 2): # range(起始, 结束, 步长)4 6步长默认 1 for i, value in enumerate(animals): # enumerate 同时取下标和值3.3 while 循环x 0 while x 4: print(x) x 1 # 即 x x 1 的简写 # 输出0 1 2 33.4 异常处理try / excepttry: raise IndexError(Este es un error de indice) # raise 主动抛错 except IndexError as e: pass # pass 什么都不做实际开发中应在这里做恢复处理英文原版把这一节扩展得更完整try: raise IndexError(This is an index error) except IndexError as e: pass # 避免空实现见下例 except (TypeError, NameError): pass # 可以同时捕获多个异常 else: print(All good!) # 仅当 try 无异常时执行 finally: print(We can clean up resources here) # 无论是否异常都执行else分支必须放在所有except之后仅当 try 块未抛异常时运行finally无论如何都执行适合做资源清理更地道的资源管理是with语句上下文管理器英文原版演示了文件的读写with open(myfile.txt) as f: for line in f: print(line) import json with open(myfile1.txt, w) as file: file.write(str(contents)) # 写入字符串 with open(myfile2.txt, w) as file: file.write(json.dumps(contents)) # 写入 JSON 对象 with open(myfile2.txt, r) as file: contents json.load(file) # 读回 JSON 对象3.5 Iterable 与 IteratorPython 的核心抽象dicc_lleno {uno: 1, dos: 2, tres: 3} nuestro_iterable dicc_lleno.keys() print(nuestro_iterable) # dict_keys([uno, dos, tres]) for i in nuestro_iterable: # 可迭代对象可以 for 遍历 print(i) # 打印 uno、dos、tres nuestro_iterable[1] # 但不能按下标访问抛 TypeError nuestro_iterator iter(nuestro_iterable) # iter() 从可迭代对象创建迭代器 nuestro_iterator.__next__() # uno # 迭代器记住遍历状态 nuestro_iterator.__next__() # dos nuestro_iterator.__next__() # tres nuestro_iterator.__next__() # 数据耗尽后抛 StopIteration list(dicc_lleno.keys()) # [uno, dos, tres] # list() 一次性取出全部Iterable可迭代对象可以被当作序列处理的对象range的返回值、dict_keys视图等知道如何创建自己的迭代器。Iterator迭代器在遍历过程中记住状态的对象通过__next__()逐个取值耗尽后抛StopIteration。for循环本质上就是反复调用next()直到StopIteration的语法糖英文原版指出若对已耗尽状态的迭代器再调用list()会得到空列表[]因为状态已被保存。英文原版还给出next(our_iterator)的内置函数写法等价于.__next__()。4. 函数Funciones4.1 定义与调用def add(x, y): print(x es {} y y es {}.format(x, y)) return x y # return 返回值 add(5, 6) # 打印 x es 5 y y es 6返回 11 add(y6, x5) # 关键字参数可以不按顺序传用def定义函数return返回值除位置参数外Python 支持关键字参数keyword arguments调用时可任意调整顺序。4.2 可变参数*args 与 **kwargsdef varargs(*args): # 任意数量的位置参数 return args varargs(1, 2, 3) # (1, 2, 3) def keyword_args(**kwargs): # 任意数量的关键字参数 return kwargs keyword_args(piegrande, lagoness) # {pie: grande, lago: ness} def todos_los_argumentos(*args, **kwargs): # 两者可同时使用 print(args) print(kwargs) # todos_los_argumentos(1, 2, a3, b4) 打印 (1, 2) 和 {a: 3, b: 4} # 调用时反向展开 args (1, 2, 3, 4) kwargs {a: 3, b: 4} todos_los_argumentos(*args) # 等价 todos_los_argumentos(1, 2, 3, 4) todos_los_argumentos(**kwargs) # 等价 todos_los_argumentos(a3, b4) todos_los_argumentos(*args, **kwargs) # 两者混合英文原版补充了返回多个值的惯用法def swap(x, y): return y, x配合元组解包即可交换变量还讲解了global与局部作用域函数内赋值默认创建局部变量需用global声明才能修改全局变量并用nonlocal在嵌套函数中修改外层函数的局部变量闭包场景见下。4.3 一等函数、闭包与匿名函数# 函数是一等公民可以返回函数 def crear_suma(x): def suma(y): return x y return suma sumar_10 crear_suma(10) sumar_10(3) # 13 # 匿名函数 lambda (lambda x: x 2)(3) # True闭包closure内层函数捕获外层函数的变量。英文原版用create_avg()演示了nonlocal——在内层函数中累计total与count调用avg(3)得3.0、avg(5)得4.0、avg(7)得5.0。lambda定义单表达式匿名函数可带多个参数如(lambda x, y: x ** 2 y ** 2)(2, 1) # 5。4.4 高阶函数与推导式map(sumar_10, [1, 2, 3]) # [11, 12, 13]Python 3 中需 list() 包裹 filter(lambda x: x 5, [3, 4, 5, 6, 7]) # [6, 7] # 更优雅的写法推导式comprensión [sumar_10(i) for i in [1, 2, 3]] # [11, 12, 13] [x for x in [3, 4, 5, 6, 7] if x 5] # [6, 7] # 字典推导式 {k: k**2 for k in range(3)} # {0: 0, 1: 1, 2: 4} # 集合推导式 {c for c in la cadena} # {d, l, a, n, , c, e}map、filter是内置高阶函数在 Python 3 中它们返回惰性迭代器需list()转成列表英文原版代码中已如此处理如list(map(max, [1,2,3], [4,2,1])) # [4, 2, 3]演示了多序列映射。列表推导式[表达式 for 变量 in 可迭代对象 if 条件]是 Python 最地道的映射过滤写法且支持字典、集合推导式。5. 类Classes5.1 类的骨架属性、构造器、方法# 继承自 object 获得类 class Humano(object): # 类属性被该类的所有实例共享 especie H. sapiens # 基本构造器 def __init__(self, nombre): self.nombre nombre # 把参数赋给实例属性 # 实例方法所有方法都把 self 作为第一个参数 def decir(self, msg): return %s: %s % (self.nombre, msg) # 类方法以类本身作为第一个参数cls被所有实例共享 classmethod def get_especie(cls): return cls.especie # 静态方法不接收类或实例引用 staticmethod def roncar(): return *roncar* # 实例化 i Humano(nombreIan) print(i.decir(hi)) # 打印 Ian: hi j Humano(Joel) print(j.decir(hello)) # 打印 Joel: hello # 调用类方法 i.get_especie() # H. sapiens # 修改共享的类属性所有实例立即感知 Humano.especie H. neanderthalensis i.get_especie() # H. neanderthalensis j.get_especie() # H. neanderthalensis # 调用静态方法 Humano.roncar() # *roncar*__init__是实例初始化钩子self指向实例本身类属性由所有实例共享修改Humano.especie后每个实例读取到的值都同步变化classmethod第一个参数是cls类staticmethod不接收类/实例——三者的调用约定差异是 Python 面试与工程中常见考点英文原版将该类扩展为现代写法class Human:Python 3 中无需显式继承object并补充了property属性装饰器把age()方法变成只读属性self.age配合age.setter与age.deleter实现读、写、删三态控制替代 Java 风格的 getter/setter还指出_age前导下划线是内部使用的约定提示而非强制以及双下划线__init__这类dunder 方法特殊方法不应自行发明命名。if __name__ __main__:守卫则保证演示代码仅在作为主程序运行时执行、被导入时不执行。5.2 继承Herencia# 从 human.py 导入父类模块化把类放进独立文件 from human import Human class Superhero(Human): # 子类可以覆盖父类属性 species Superhuman def __init__(self, name, movieFalse, superpowers[super strength, bulletproofing]): self.fictional True self.movie movie # 注意默认参数在程序生命周期内只实例化一次小心不要修改它 self.superpowers superpowers # super() 调用父类被覆盖的方法此处是父类构造器 super().__init__(name) # 覆盖 sing 方法 def sing(self): return Dun, dun, DUN! def boast(self): for power in self.superpowers: print(I wield the power of {pow}!.format(powpower)) sup Superhero(nameTick) isinstance(sup, Human) # True # 类型检查 print(sup.get_species()) # Superhuman # 调用父类方法但使用自己的类属性 print(sup.sing()) # Dun, dun, DUN! # 调用被覆盖的方法 sup.say(Spoon) # Tick: Spoon # 继承自 Human 的方法 sup.boast() # 打印两项超能力子类可覆盖父类的类属性、实例方法也可调用父类构造器super().__init__(name)是调用父类初始化方法的标准姿势isinstance/type用于运行时类型判断Superhero.__mro__展示方法解析顺序MRO。5.3 多继承Herencia Múltipleclass Bat: species Baty def __init__(self, can_flyTrue): self.fly can_fly def say(self, msg): return ... ... ... def sonar(self): return ))) ... ((( from superhero import Superhero from bat import Bat class Batman(Superhero, Bat): def __init__(self, *args, **kwargs): # 多继承下 super() 只作用于 MRO 中的下一个基类 # 因此显式调用所有祖先的 __init__*args/**kwargs 逐层传递参数 Superhero.__init__(self, anonymous, movieTrue, superpowers[Wealthy], *args, **kwargs) Bat.__init__(self, *args, can_flyFalse, **kwargs) self.name Sad Affleck def sing(self): return nan nan nan nan nan batman! sup Batman() print(Batman.__mro__) # (Batman, Superhero, Human, Bat, object) # 方法解析顺序决定查找优先级 print(sup.get_species()) # Superhuman # 调用父类方法、使用自身类属性 print(sup.sing()) # nan nan nan nan nan batman! sup.say(I agree) # Sad Affleck: I agree # 继承顺序决定 say 来自 Human print(sup.sonar()) # ))) ... ((( # 来自第二个祖先 Bat print(sup.fly) # False # 覆盖了 Bat 的默认值多继承的关键是MRO方法解析顺序__mro__元组列出了属性/方法查找的顺序super()只跳到 MRO 中的下一个类因此多继承场景通常显式调用各祖先的__init__并借助*args/**kwargs逐层传递参数剥洋葱式。6. 模块Módulosimport math print(math.sqrt(16)) # 4.0 from math import ceil, floor # 从模块导入特定函数 print(ceil(3.7)) # 4 print(floor(3.7)) # 3 from math import * # 导入全部不推荐污染命名空间 import math as m # 模块别名 math.sqrt(16) m.sqrt(16) # True dir(math) # 列出模块定义的函数与属性Python 模块就是普通的.py文件文件名即模块名可直接编写并导入from math import *会污染当前命名空间官方与社区均不推荐dir()用于探查模块暴露的成员英文原版补充了一个重要的模块解析细节若当前目录存在同名math.py导入时会优先加载本地文件而非内置模块因为本地目录在sys.path中优先级更高。7. 进阶特性Avanzado7.1 生成器惰性求值def duplicar_numeros(iterable): for i in iterable: yield i i # yield 使函数成为生成器 # 生成器按需逐次产出值而不是一次性生成并返回全部 # 因此大于 15 的值不会被提前处理。 # 注意 range 本身就是一个惰性序列range(1, 900000000) 几乎不占内存。 _rango range(1, 900000000) for i in duplicar_numeros(_rango): print(i) if i 30: breakyield关键字把普通函数变成生成器每次迭代只计算并产出下一个值内存占用极小可处理数亿规模的范围range在 Python 3 中取代了 Python 2 的xrange本身就是惰性对象英文原版补充了生成器推导式values (-x for x in [1,2,3,4,5])用圆括号而非方括号逐个产出-1 -2 -3 -4 -5也可list(values)一次性转列表。7.2 装饰器语法糖from functools import wraps def pedir(_decir): wraps(_decir) # 保留原函数的元信息__name__、__doc__ def wrapper(*args, **kwargs): mensaje, decir_por_favor _decir(*args, **kwargs) if decir_por_favor: return {} {}.format(mensaje, ¡Por favor! Soy pobre :() return mensaje return wrapper pedir def decir(decir_por_favorFalse): mensaje ¿Puedes comprarme una cerveza? return mensaje, decir_por_favor print(decir()) # ¿Puedes comprarme una cerveza? print(decir(decir_por_favorTrue)) # ¿Puedes comprarme una cerveza? ¡Por favor! Soy pobre :(装饰器是包装函数的语法糖pedir等价于decir pedir(decir)。英文原版用log_function更系统地展示了两个关键点def log_function(func): def wrapper(*args, **kwargs): print(Entering function, func.__name__) result func(*args, **kwargs) print(Exiting function, func.__name__) return result return wrapper log_function def my_function(x, y): Adds two numbers together. return x y my_function(1, 2) print(my_function.__name__) # wrapper # 问题元信息被覆盖 print(my_function.__doc__) # None直接包装会丢失原函数的__name__、__doc__等元信息解决方法是functools.wraps(func)——它把原函数的文档、名称、参数列表等复制到包装函数上这正是 es/python.md 中wraps(_decir)与英文原版wraps(func)一致使用的原因。装饰器的典型应用是日志、鉴权、缓存、性能计时等横切关注点。8. 后续学习资源es/python.md 文末为读者推荐了若干经典学习路径此处按类型整理资源名称来自原文具体链接以原文为准免费在线资源《Learn Python The Hard Way》硬核实战路线、Dive Into Python、Python 官方文档、Hitchhikers Guide to Python、Python Module of the Week 等英文原版还额外推荐了 Automate the Boring Stuff with Python、Python Course、RealPython 入门系列、awesome-python 精选清单、PEP 8 官方风格指南、Python 3 Computer Science Circles 以及 Python 项目灵感合集。纸质书籍Programming Python、Dive Into Python、Python Essential Reference 等经典参考书。9. 仓库视角这篇教程如何维护与校验理解 es/python.md 的定位有助于你更好地使用它它是一篇翻译稿仓库根目录的 python.md 是英文原版约 1100 行覆盖 match/case、property、多继承、functools.wraps 等更多内容es/版本保留了原版的核心骨架7 大章节基础类型、变量与集合、控制流、函数、类、模块、进阶示例变量名与注释均本地化为西班牙语便于西语学习者对照阅读仓库还提供 zh-cn/python.md中文版与 pythonlegacy.mdPython 2 专版供旧版学习者使用等其他译本。元数据受 lint 校验每篇文档顶部的 YAML front mattercontributors、translators、filename等由 lint/frontmatter.py 自动检查它用正则提取 front matter再用 yamllint 校验 YAML 语法并逐项验证键名是否属于允许集合name、filename、contributors、translators等、类型是否为字符串或形如[作者名, 链接]的二元列表。这意味着每篇教程的署名与语言信息都是结构化、可机器校验的。风格约定README 与 CONTRIBUTING.md 强调仓库中的教程以合法、带注释的代码形式呈现翻译贡献者只需复制现有文件的排版格式即可参与这正是你在本文中看到的每一节先给代码、再逐行讲解的根源。结语从数值运算到生成器与装饰器es/python.md 用一份可运行的代码勾勒出 Python 的完整语法地图。本文在保留原教程全部示例的基础上结合英文原版 python.md 补齐了match/case、property、nonlocal、多继承 MRO、文件读写与with语句、functools.wraps等细节并串联了仓库的维护机制。建议你按章节顺序将代码逐段保存运行、亲手修改参数观察输出变化——Python 最好的老师就是它自己清晰的报错信息与可交互的 REPL。赞分享文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载相关推荐learnxinyminutes-docs 西班牙语版 JavaScript 入门指南从基础语法到原型链的完整实战解析learnxinyminutes docs 西班牙语版 JavaScript 入门指南从基础语法到原型链的完整实战解析 本指南以 learnxinyminut文档教程LaTeX 从零到一基于 learnxinyminutes-docs 西班牙语教程的完整排版指南LaTeX 从零到一基于 learnxinyminutes docs 西班牙语教程的完整排版指南 本指南以 learnxinyminutes docs 仓库中文档教程Scala 快速入门实战指南基于 learnxinyminutes-docs 西班牙语教程的完整语法精讲Scala 快速入门实战指南基于 learnxinyminutes docs 西班牙语教程的完整语法精讲 本指南以仓库中的 es/scala.md https文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表