尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

learnxinyminutes-docs 中的 Python 2(Legacy)速成指南:从可执行伪代码到生成器与装饰器

learnxinyminutes-docs 中的 Python 2(Legacy)速成指南:从可执行伪代码到生成器与装饰器 文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载导读本篇文章以 es/pythonlegacy.md 为骨架系统讲解 Python 2.7及 2.x 系列的核心语法与编程范式。该文档是 learnxinyminutes-docs 仓库中面向 Python 2 的经典“Whirlwind Tour”教程遵循仓库“以可运行的带注释代码讲语言”的宗旨见 README.md全篇由可直接执行的 Python 代码块构成覆盖数据类型、集合、控制流、函数、类、模块与高级特性。读完本文你将掌握 Python 2 的完整语法脉络、与 Python 3 的关键差异以及生成器、装饰器等进阶技巧的底层原理。适用前提说明本指南针对 Python 2.7大体适用于 2.x 全系列。Python 2.7 已于 2020 年停止维护官方建议新项目直接学习 Python 3仓库内另有 python.md英文与 es/python.md西班牙文的 Python 3 教程可对照阅读。一、教程在仓库中的位置与文档结构es/pythonlegacy.md是英文原版pythonlegacy.md的西班牙语翻译归属es/西班牙语语言目录。其 YAML frontmatter 记录了原始作者、译者以及建议的文件名learnpythonlegacy.py——这意味着整份文档的正文就是一个可以直接保存为.py文件运行的完整脚本。仓库通过 lint/frontmatter.py 对每个 Markdown 文档的 frontmatter 做格式校验它提取---包裹的 YAML 头用 yamllint 检查语法并验证允许的键name、filename、contributors、translators等及其类型确保contributors/translators列表项为[姓名, 链接]或单元素格式。这保证了本仓库所有语言版本教程的元数据一致性。在 CONTRIBUTING.md 的样式指南中仓库还明确了教程写作的约定代码行尽量不超过 80 字符、“以示例代替说教”能用代码示例就不写长段文字、面向有经验的程序员。这正是本 Python 2 教程通篇以“代码 行内注释 # 输出标注”呈现的原因。正文按以下 7 大模块组织下文将逐一展开原始数据类型与运算符变量与集合控制流函数类模块进阶生成器与装饰器二、原始数据类型与运算符2.1 数字与四则运算Python 2 中数字运算符合直觉3 # 3 1 1 # 2 8 - 1 # 7 10 * 2 # 20 35 / 5 # 72.2 除法陷阱整数除法与浮点数Python 2 与 Python 3 最著名的差异之一就是/的行为5 / 2 # 2 整数除法自动向下取整 2.0 # 这是 float 11.0 / 4.0 # 2.75 只要有一方是浮点数就得到精确结果5 / 2在 Python 2 中返回2截断在 Python 3 中返回2.5解决方案之一是让操作数带上小数点.0以得到浮点结果。//运算符则明确表示“向下取整的除法”对正负数都成立5 // 3 # 1 5.0 // 3.0 # 1.0 也支持浮点数 -5 // 3 # -2 注意向负无穷取整 -5.0 // 3.0 # -2.0另外借助__future__导入可以在 Python 2 中直接获得 Python 3 的除法语义from __future__ import division 11 / 4 # 2.75 正常除法 11 // 4 # 2 向下取整除法__future__机制是 Python 2 特有的“时间旅行”导入它允许你写出兼容 Python 3 的代码这正是仓库建议同时对照 Python 3 教程学习的原因见 python.md。2.3 取模、幂与优先级7 % 3 # 1 取余 2 ** 4 # 16 幂运算 (1 3) * 2 # 8 用括号强制优先级2.4 布尔运算True and False # False False or True # True not True # False注意and与or区分大小写。布尔运算符与整数混用时会返回参与运算的操作数本身而非强制转成布尔0 and 2 # 0 -5 or 0 # -5 0 False # True 0 在布尔上下文为 False 2 True # False 1 True # True2.5 比较运算1 1 # True 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 # False2.6 字符串字符串可用或创建支持拼接、重复与索引Esto es un string. Esto también es un string Hello world! # Hello world! Hello world! # Hello world! 相邻字符串字面量自动拼接 Hello * 3 # HelloHelloHello Esto es un string[0] # E 按字符列表索引 len(Esto es un string) # 16 取长度字符串格式化有两种方式%运算符旧式Python 3.1 起已弃用但值得了解x apple y lemon z The items in the basket are %s and %s % (x, y)str.format()方法推荐的新式写法支持位置参数与关键字参数{} is a {}.format(This, placeholder) {0} can be {1}.format(strings, formatted) {name} wants to eat {food}.format(nameBob, foodlasagna)2.7 None 与is运算符None是一个对象。比较对象是否为None时不要用而要用is测试对象身份etc is None # False None is None # Trueis对原始值意义不大但对对象比较非常关键。2.8 真值Truthiness任何对象都能用于布尔上下文。以下值被视为falsyNone任何数值类型的零0、0L、0.0、0j空序列、()、[]空容器{}、set()满足特定条件的用户自定义类实例与__nonzero__相关其余值均为truthybool(0) # False bool() # False三、变量与集合3.1 print 语句与输入Python 2 中print是语句无需括号这与 Python 3 的函数形式不同print Soy Python. ¡Encantado de conocerte!控制台输入同样存在版本差异input_string_var raw_input(Enter some data: ) # 返回字符串 input_var input(Enter some data: ) # 把输入当 Python 代码求值警告input()会求值输入内容存在安全隐患需谨慎使用。在 Python 3 中input()已废弃、raw_input()改名为input()。3.2 变量赋值与三元表达式变量无需预先声明una_variable 5 # 命名约定小写加下划线 una_variable # 5访问未赋值的变量会抛出 NameError 异常。if还可以用作表达式等价于 C 的三目运算符?:yahoo! if 3 2 else 2 # yahoo!3.3 列表List列表是可变序列支持丰富的操作li [] other_li [4, 5, 6] li.append(1) # li 变为 [1] li.append(2) # [1, 2] li.append(4) # [1, 2, 4] li.append(3) # [1, 2, 4, 3] li.pop() # 3li 变为 [1, 2, 4] li.append(3) # 又变回 [1, 2, 4, 3] li[0] # 1 li[0] 42 # 按索引赋值 li[-1] # 3 负数索引访问末尾 li[4] # 越界抛出 IndexError切片语法是左闭右开区间支持起始、终止与步长li[1:3] # [2, 4] li[2:] # [4, 3] li[:3] # [1, 2, 4] li[::2] # [1, 4] 隔一个取一个 li[::-1] # [3, 4, 2, 1]生成反转副本 # 通用形式li[start:end:step]更多修改操作del li[2] # 删除任意位置元素li 变为 [1, 2, 3] li other_li # [1, 2, 3, 4, 5, 6]不修改原列表 li.extend(other_li) # 就地拼接li 变为 [1, 2, 3, 4, 5, 6] li.remove(2) # 删除首次出现的值不存在则抛 ValueError li.insert(1, 2) # 在指定索引插入 li.index(2) # 1返回首次出现索引不存在抛 ValueError 1 in li # True成员检查 len(li) # 6长度3.4 元组Tuple元组与列表类似但不可变tupla (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元组解包是 Python 的标志性语法还顺带实现了优雅的变量交换a, b, c (1, 2, 3) # a1, b2, c3 d, e, f 4, 5, 6 # 括号可省略 g 4, 5, 6 # (4, 5, 6)省略括号时默认创建元组 e, d d, e # 交换两个值无需临时变量3.5 字典Dict字典存储键值映射dicc_vacio {} dicc_lleno {uno: 1, dos: 2, tres: 3} dicc_lleno[uno] # 1 dicc_lleno.keys() # [tres, dos, uno]顺序不保证 dicc_lleno.values() # [3, 2, 1] dicc_lleno.items() # [(uno, 1), (dos, 2), (tres, 3)] uno in dicc_lleno # True检查键是否存在 1 in dicc_lleno # False检查的是键而非值 dicc_lleno[cuatro] # 键不存在抛 KeyError安全访问与安全写入的惯用法dicc_lleno.get(uno) # 1 dicc_lleno.get(cuatro) # None不抛异常 dicc_lleno.get(cuatro, 4) # 4带默认值 # 注意get 不会把值写入字典 dicc_lleno[cuatro] 4 # 赋值后 dicc_lleno[cuatro] 4 dicc_lleno.setdefault(cinco, 5) # 键不存在才插入此时设为 5 dicc_lleno.setdefault(cinco, 6) # 键已存在仍为 53.6 集合Set集合是无序、去重的容器conjunto_vacio set() un_conjunto set([1, 2, 2, 3, 4]) # set([1, 2, 3, 4])自动去重 # Python 2.7 起可用 {} 直接声明集合 conjunto_lleno {1, 2, 2, 3, 4} # {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} 差集 {1, 2, 3, 4} ^ {2, 3, 5} # {1, 4, 5} 对称差 {1, 2} {1, 2, 3} # False 超集判断 {1, 2} {1, 2, 3} # True 子集判断 2 in conjunto_lleno # True 10 not in conjunto_lleno # True集合顺序同样不保证即使有时看起来是有序的。3.7 类型检查type(li) # list type(dicc_lleno) # dict type(5) # int四、控制流Python 的缩进具有语法意义务必保持一致。4.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.4.2 for 循环与 rangefor直接遍历序列for animal in [perro, gato, raton]: print %s es un mamifero % animal # 输出 # perro es un mamifero # gato es un mamifero # raton es un mamiferorange(number)返回从 0 到给定数字的列表range(lower, upper)支持指定区间for i in range(4): # 打印 0 1 2 3 print i for i in range(4, 8): # 打印 4 5 6 7 print i4.3 while 循环x 0 while x 4: print x # 打印 0 1 2 3 x 1 # x x 1 的简写4.4 异常处理try / except / else / finallyPython 2.6 起支持as语法捕获异常实例try: raise IndexError(Este es un error de indice) # raise 主动抛错 except IndexError as e: pass # pass 是空操作通常在此做恢复处理 except (TypeError, NameError): pass # 可同时捕获多个异常类型 else: # 可选子句try 无异常时才执行 print All good! finally: # 无论是否异常都会执行 print We can clean up resources here4.5 with 语句资源清理的更优解代替 try/finally 清理资源可以使用with上下文管理器with open(myfile.txt) as f: for line in f: print linewith会自动关闭文件是 Python 2.6 的推荐写法。五、函数5.1 定义与调用def add(x, y): print x is {0} and y is {1}.format(x, y) return x y # 用 return 返回值 add(5, 6) # 打印 x is 5 and y is 6 并返回 11 add(y6, x5) # 关键字参数可任意顺序5.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) # 等价于 todos_los_argumentos(1, 2, 3, 4, a3, b4)*和**同样可以透传给其他函数def pass_all_the_args(*args, **kwargs): all_the_args(*args, **kwargs) print varargs(*args) print keyword_args(**kwargs)5.3 作用域与 globalx 5 def set_x(num): x num # 局部变量 x与全局 x 无关 print x # 43 def set_global_x(num): global x # 声明使用全局 x print x # 5 x num # 全局 x 被改为 6 print x # 6 set_x(43) set_global_x(6)5.4 函数是一等公民函数可以嵌套并作为返回值闭包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 (lambda x, y: x ** 2 y ** 2)(2, 1) # 5内置高阶函数map与filtermap(sumar_10, [1, 2, 3]) # [11, 12, 13] map(max, [1, 2, 3], [4, 2, 1]) # [4, 2, 3]多序列并行 filter(lambda x: x 5, [3, 4, 5, 6, 7]) # [6, 7]5.5 推导式列表 / 集合 / 字典列表推导式是 mapfilter 的优雅替代[add_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]集合与字典同样支持推导式{x for x in abcddeef if x in abc} # {a, b, c} {x: x ** 2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}六、类6.1 类定义基础从object继承以得到新式类class Humano(object): # 类属性被该类的所有实例共享 especie H. sapiens # 构造函数实例化时自动调用 def __init__(self, nombre): self.nombre nombre # 赋值给实例属性 self.age 0 # 初始化属性 # 实例方法所有方法都以 self 作为第一个参数 def decir(self, msg): return {0}: {1}.format(self.nombre, msg)双下划线开头和结尾的名字如__init__是 Python 内部的特殊命名空间不应自行发明这类名字。6.2 类方法classmethod与静态方法staticmethod# 类方法以调用它的类作为第一个参数所有实例共享 classmethod def get_especie(cls): return cls.especie # 静态方法调用时不需要类或实例引用 staticmethod def roncar(): return *roncar*6.3 属性propertyproperty把方法变成同名只读属性并配套 setter / deleterproperty def age(self): return self._age age.setter def age(self, age): self._age age age.deleter def age(self): del self._age6.4 实例化与共享属性修改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* # 属性的读写与删除 i.age 42 # 触发 setter i.age # 42 del i.age # 触发 deleter i.age # 抛 AttributeError七、模块7.1 导入的多种形态import math print math.sqrt(16) # 4.0 from math import ceil, floor # 导入指定函数 print ceil(3.7) # 4.0 print floor(3.7) # 3.0 from math import * # 导入全部不推荐可能污染命名空间 import math as m # 起别名 math.sqrt(16) m.sqrt(16) # True from math import sqrt math.sqrt m.sqrt sqrt # True三者是同一函数对象7.2 模块即文件 搜索优先级Python 模块就是普通的.py文件模块名即文件名。用dir(module)可以查看模块定义了哪些函数和属性import math dir(math)一个容易踩坑的细节本地文件夹的搜索优先级高于 Python 内置库。如果你的当前目录下恰好有一个math.pyimport math会加载它而不是内置模块。八、进阶生成器与装饰器8.1 生成器惰性求值普通函数会一次性把结果全部算完并存储当输入规模很大时如百万级内存开销惊人def duplicar_numeros(iterable): double_arr [] for i in iterable: double_arr.append(i i) return double_arr # 下面的循环会先加倍全部 100 万个值再逐个检查非常低效 for value in duplicar_numeros(range(1000000)): print value if value 5: break改用yield的生成器则按需逐项产出遇到break立即停止绝大多数值根本不会被计算def duplicar_numeros_generator(iterable): for i in iterable: yield i i for value in duplicar_numeros_generator(xrange(1000000)): print value if value 5: breakxrange与range的关系正如上面的生成器与普通函数range一次性返回包含 100 万个值的列表而xrange按迭代请求逐个生成值——xrange是range的生成器版本是 Python 2 中处理大范围迭代的标准选择。生成器推导式与列表推导式语法类似只是用圆括号values (-x for x in [1, 2, 3, 4, 5]) for x in values: print(x) # 打印 -1 -2 -3 -4 -5 values (-x for x in [1, 2, 3, 4, 5]) gen_to_list list(values) # 可强制转为列表 print(gen_to_list) # [-1, -2, -3, -4, -5]8.2 装饰器接收并返回函数的高阶函数装饰器最基本的形态——包装目标函数并增强其行为def add_apples(func): def get_fruits(): fruits func() fruits.append(Apple) return fruits return get_fruits add_apples def get_fruits(): return [Banana, Mango, Orange] print , .join(get_fruits()) # 打印 Banana, Mango, Orange, Apple带参数的经典示例——用functools.wraps保留被包装函数的元数据from functools import wraps def pedir(target_function): wraps(target_function) def wrapper(*args, **kwargs): msg, por_favor target_function(*args, **kwargs) if por_favor: return {} {}.format(msg, ¡Por favor! Soy pobre :() return msg return wrapper pedir def hablar(por_favorFalse): msg ¿Me puedes comprar una cerveza? return msg, por_favor print hablar() # ¿Me puedes comprar una cerveza? print hablar(por_favorTrue) # ¿Me puedes comprar una cerveza? ¡Por favor! Soy pobre :(装饰器的本质是“接受一个函数、返回一个新函数”的高阶函数pedir等价于hablar pedir(hablar)运行时先经过wrapper再调用原函数*args/**kwargs保证了任意签名的透传。九、从 Python 2 迁移到 Python 3 的要点对照主题Python 2本文档Python 3print语句print hola函数print(hola)/除法整数除法截断始终返回浮点数inputraw_input()返回字符串、input()求值代码input()返回字符串大范围迭代xrange()生成器range()即惰性字符串类型str为字节串另有unicode统一为 Unicodestr新式类需显式继承object所有类均为新式类仓库中与本文档同目录的 es/python.md以及根目录 python.md提供了 Python 3 的完整教程可与本指南对照学习利用from __future__ import ...还可以写出同时兼容两个大版本的代码。十、如何运行本文档es/pythonlegacy.md的 frontmatter 建议的文件名为learnpythonlegacy.py——将正文代码块整体保存为.py文件后即可用 Python 2.7 解释器直接运行python learnpythonlegacy.py也可以在交互式解释器中逐段粘贴体验。需要提醒的是本教程部分代码如print语句、xrange依赖 Python 2 语义请确保使用 Python 2.x 环境运行若系统默认python已指向 Python 3可通过python2命令指定解释器。结语从数值运算的除法陷阱到*args/**kwargs的灵活传参再到yield驱动的惰性求值与装饰器的高阶函数思维这份es/pythonlegacy.md完整呈现了 Python 2 时代的语言全貌。它既是学习 Python 2 语法的高密度速查手册也是理解 Python 3 演进背景的绝佳对照材料——当你在阅读 python.md 时遇到“为什么 Python 3 要这样设计”回头看看本文档中的旧式写法往往能找到答案。赞分享文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载相关推荐LowCodeEngine代码生成器从Schema到可执行代码LowCodeEngine代码生成器从Schema到可执行代码 本文深入解析了LowCodeEngine代码生成器的核心原理与实现机制。系统通过Schema解前端低代码Python 2 语法速成教程精读learnxinyminutes-docs 法语版《Python (legacy)》全解析Python 2 语法速成教程精读learnxinyminutes docs 法语版《Python legacy 》全解析 本篇技术指南以 learnxiny文档教程如何快速上手Ne10从安装到第一个NEON加速程序的简明教程如何快速上手Ne10从安装到第一个NEON加速程序的简明教程 Ne10是ARM架构下的开源优化软件库专为嵌入式系统和移动设备提供高效的信号处理、数学运算等功高性能计算嵌入式图像处理音频处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表