python:基础

阅读量 ,评论量

学习参考:

https://docs.python.org/3/reference/

https://python3-cookbook.readthedocs.io/zh_CN/latest

引入

python 是一种 dynamically-typed language,以牺牲类型安全性(在 compile time 无法做类型检查,只有在 run time 才能去确定对象的类型)为代价,换来了编码上的灵活性(可以不用声明直接用——duck typing

名字空间

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

  1. 局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
  2. 全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。
  3. 内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

Python使用名字空间来记录变量的轨迹。名字空间是一个 字典,它的键就是变量名,字典的值就是那些变量的值。局部名字空间可以通过内置的 locals() 函数来访问。全局(模块级别,包括内置名字空间)名字空间可以通过 globals() 函数来访问。

模块

  1. python中模块的__all____all__为一元组,每一个元素为一字符串,为该模块中的变量、方法、类,当模块为一单一py文件时可定义于模块内部,当模块为一文件夹时,可定义于*__init__.py*文件中。

类型注解

在python中,类型注解的有意义的价值是:静态分析、类型检查和人类阅读。虽然在技术上可以通过类型注解来实现函数重载,但这不符合python的使用原则。所以在自己对安全性、清晰性和灵活性的权衡下做类型注解即可。

类型别名比较实用:

from typing import TypeAlias

_LossAndGradient: TypeAlias = tuple[tf.Tensor, tf.Tensor]
ComplexTFMap: TypeAlias = Mapping[str, _LossAndGradient]

可以认真学习下这一段,涉及到元类、描述器和函数注解的编程技术的思想:https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p20_implement_multiple_dispatch_with_function_annotations.html

编程:

https://google.github.io/styleguide/

协程

生成器

因为yield实现的生成器是一个暂停&重启的执行模型,所以在python中它可以成为一种协程的实现,逻辑细节如下:

生成器G中temp = yield expression1这行代码的逻辑是:

  1. 将expression1的返回值返回给调用方(若没有expression1则为none),然后所在的线程保存当前协程的上下文,并阻塞当前协程;(一般,在执行nextsendthrowclose的线程称之为这里的调用方)
  2. 当调用方执行next(G)或者G.send(expression2)或者G.throw(Exception1)或者G.close()时,所在的线程便会阻塞调用方,然后执行生成器G所在的协程;
  3. 协程拿到调用方传进来的expression2赋值给temp(若没有则为None)(或者抛出调用方传进来的Exception1异常),然后继续执行当前协程,直到遇到下一个yield或者没有在协程内catch住的异常抛出;

NOTE:

https://python3-cookbook.readthedocs.io/zh_CN/latest/c12/p12_using_generators_as_alternative_to_threads.html

asyncio

有待阅读:https://docs.python.org/zh-cn/3/library/asyncio-task.html

粘合剂

linux bash cmd

cmdline = "echo test, test, test, OK!"
print(os.popen(cmdline).read())

c++