# Py 语法

# 数据类型

# PythonNode.js 数据类型的区别

特性 Python Node.js (JavaScript)
数字类型 分为 int、float、complex 统一为 number
布尔类型 True 和 False true 和 false
空值类型 None null 和 undefined
字符串类型 str string
列表/数组 list(可变) array(可变)
元组 tuple(不可变) 无直接对应,可用数组模拟
集合 set 和 frozenset Set
字典/对象 dict object
函数类型 函数是一等对象 函数是一等对象
符号类型 symbol
大整数类型 bigint
字节类型 bytes 和 bytearray Buffer 和 TypedArray
日期类型 datetime 模块 Date 对象
正则表达式 re 模块 RegExp 对象

# 基本类型

  • 数字类型:
    • int:整数,如 10
    • float:浮点数,如 3.14
    • complex:复数,如 1+2j
  • 布尔类型:TrueFalse
  • 空值类型:None
  • 字符串类型:str:字符串,如 'hello'

# 复合类型

  • 列表/数组list:列表,如 [1, 2, 3]
  • 元组tuple:元组,如 (1, 2, 3)
  • 字典/对象dict:字典,如 {'a': 1, 'b': 2}
  • 集合set:集合,如 {1, 2, 3}

# 字节类型

  • bytes:字节,如 b'hello'
  • bytearray:字节数组,如 bytearray(b'hello')

# 语句

# PythonNode.js 的语法区别

特性 Python Node.js (JavaScript)
for 循环 使用 for i in range(n) 使用 for (let i = 0; i < n; i++)
遍历数组/列表 直接遍历 for item in list 使用 forEach 或 for...of
if 条件 使用 if、elif、else 使用 if、else if、else
三元运算符 x if condition else y condition ? x : y
单行注释 使用 # 使用 //
多行注释 使用 """ 或 ''' 使用 /* */
代码块 使用缩进(通常是 4 个空格) 使用 {} 包裹代码块
变量声明 无需声明类型,直接赋值 使用 let、const 或 var

# 迭代

  • for:迭代,如 for i in range(10)
  • while:循环,如 while i < 10

# 条件

  • if:条件,如 if i < 10
  • elif:条件,如 elif i < 20
  • 三元表达式:result = "大于 5" if x > 5 else "小于等于 5"

# 函数

# PythonNode.js 函数的对比

特性 Python Node.js (JavaScript)
函数定义 使用 def 关键字 使用 function 或箭头函数
默认参数 支持 支持
可变参数 使用 *args 使用 ...args
返回值 可返回多个值(元组) 只能返回一个值(可返回对象)
匿名函数 使用 lambda 使用箭头函数
作用域 局部作用域和全局作用域 块级作用域和函数作用域
装饰器 支持 不支持(可通过高阶函数模拟)
回调函数 不常用(通常用 async/await) 广泛使用
异步处理 使用 async/await 使用 async/await 或回调

# 函数使用

  • 函数定义:def function_name(parameters):
  • 默认参数:
def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"
  • 可变参数:
  def sum_all(*args):
    return sum(args)
  • 多返回值:
# 实际上是返回一个元组
def get_name_and_age():
    return "Alice", 25
  • 匿名函数:
# 使用 lambda 关键字定义匿名函数
square = lambda x: x * x
  • 装饰器:
def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

#

# Python 与 Node.js 类的对比

特性 Python Node.js (JavaScript)
类定义 使用 class 关键字 使用 class 关键字(ES6)
构造函数 使用 init 方法 使用 constructor 方法
实例方法 使用 self 参数 使用 this 关键字
类变量 直接定义在类中 使用 static 关键字
继承 支持单继承和多继承 仅支持单继承
特殊方法 支持(如 stradd 不支持(可通过方法模拟)
访问控制 通过命名约定(_name、__name) 通过 # 定义私有成员(ES2022)
多态 支持 支持
动态性 支持动态添加属性和方法 支持动态添加属性和方法

# 定义

class Person:
  species = "Human"  # 类变量 所有实例共享的变量。
  # Python 使用 __init__ 方法作为构造函数。
  def __init__(self, name, age):
      # 使用 self 参数来访问实例的属性和方法。
      self.name = name # 实例变量 每个实例独有的变量。
      self.age = age
  
  # 重写 __str__ 方法在 Python 中,__str__ 和 __add__ 
  # 是类的特殊方法(也称为魔术方法或双下方法),
  # 用于定义对象的行为。它们分别用于控制对象的字符串表示和加法操作。

  # 当你使用 print() 函数或 str() 函数时,Python 会调用该方法。
  def __str__(self):
    return f"Person(name={self.name}, age={self.age})"

  # 当你使用 + 运算符时,Python 会调用该方法。
  def __add__(self, other):
    return self.age + other.age

# 继承
class Employee(Person):
    def __init__(self, name, age, salary):
        super().__init__(name, age) # 调用父类构造函数
        self.salary = salary

    def print_name(self):
        print(self.name)  # 通过 super() 初始化后访问父类属性

employee = Employee("Alice", 25, 50000)
employee.print_name() # 输出:Alice

Python 没有严格的访问控制,但通过命名约定实现:

  • _name:表示受保护的成员(约定)。
  • __name:表示私有成员(名称修饰)。

# 模块

# PythonNode.js 模块的对比

特性 Python Node.js (JavaScript)
模块定义 .py 文件 .js 文件
模块导出 默认导出整个模块 使用 module.exports 或 exports
模块导入 import 或 from ... import ... require
模块路径解析 sys.path node_modules 和全局路径
模块缓存 sys.modules require.cache
循环依赖 支持,但需谨慎 支持,但需谨慎
核心模块 标准库(如 os、sys) 核心模块(如 fs、path)
第三方模块 使用 pip 安装 使用 npm 或 yarn 安装

# 模块路径解析

Python 使用 sys.path 解析模块路径。模块搜索路径包括顺序:

  1. 当前目录
  2. PYTHONPATH 环境变量
  3. 标准库路径
  4. 安装路径

# 模块缓存

模块在第一次导入时会被缓存,后续导入直接使用缓存。缓存存储在 sys.modules 中。

import sys
import my_module
print('my_module' in sys.modules)  # 输出: True