Python类型注解(十)

为什么需要类型注解

类型注解(Type Hinting)用于 显式标注变量、函数参数、返回值的类型
虽然 Python 是动态语言,但添加类型注解能带来大量收益,尤其是在多人协作与大型项目中。


让 IDE(例如 PyCharm)获得类型推断能力,提供更智能的代码提示

内置模块已经使用类型注解,因此在你输入函数名时,IDE 能提示参数类型和返回值类型。

例如(图示文字化):

import random

random.randint(
   a: int,
   b: int
)

提示:

  • 需要传两个参数
  • 两个参数类型都是 int

而对于没有类型注解的自定义函数:

def func(data):
    return data * 10

IDE 只能提示:

func(data)

data 的类型未知,无法提供进一步提示


帮助 IDE 推断变量类型,提供智能补全

图示对比说明:

✔ 当变量有明确类型时

示例:

my_list: list = []

IDE 能自动提示 append、sort、index 等列表方法。

(图示文字化:显示 append、sort、index、reverse 等方法自动补全)

✘ 无类型注解时

my_list = None

IDE 无法知道它将来是 list、dict 还是其他类型 → 不会给任何方法提示


帮助开发者自身

类型注解也是一种“备注式文档”,让你再看到代码时能快速理解变量/参数含义,降低后期出错概率。

示例:

var_1: int = 10
var_2: list = [1, 2, 3]
var_3: dict = {"itheima": 666}
var_4: Student = Student()

即使不写注解也能看出类型,但若类型复杂、不直观时,注解能大幅提升可读性。


当无法直接从赋值中判断变量类型时,类型注解是必要的

如图示示例:

class Student:
    pass

var_1: int = random.randint(1, 10)
var_2: dict = json.loads(data)
var_3: Student = func()

这些值若不加注解,很难从字面看出类型。


总结:为什么要使用类型注解?

价值描述
智能提示IDE 能基于类型提供补全提示
类型推断对自定义函数、复杂结构更友好
可读性让代码更像“自带文档”
降低错误显式注解帮助避免错误类型使用

一句话总结:

类型注解不是为了限制你,而是为了让工具和团队更好地理解你的代码。


变量的类型注解

类型注解最基础的使用方式,就是给变量显式标注类型。
Python 本身不会因为注解而拒绝运行错误类型的代码,但 IDE 和类型检查工具会给出提示。

示例:

var_1: int = 666
var_2: str = "itheima"
var_3: bool = True
var_4: Student = Student()

基础类型注解

常见基础类型写法:

num: int = 10
price: float = 9.99
name: str = "guanzhi"
flag: bool = False

这些类型都不需要额外导包。


类对象类型注解

变量类型也可以是自定义类:

class Student:
    pass

stu: Student = Student()

这样 IDE 就能自动提示 Student 对象的方法与属性。


数据容器类型注解(list / tuple / set / dict)

数据容器若只标注类型本身,推荐以下写法(无需导入 typing):

my_list: list = []
my_tuple: tuple = ()
my_set: set = {1, 2, 3}
my_dict: dict = {"name": "itheima"}

这种写法不限定内部元素的类型,因此简单灵活。


指定容器内部元素类型(需要 typing 模块)

为了更严格的类型提示,可以这样写:

from typing import List, Tuple, Set, Dict

scores: List[int] = [98, 88, 76]
names: Tuple[str, int] = ("观止", 20)
tags: Set[str] = {"python", "study"}
info: Dict[str, int] = {"math": 95, "eng": 88}

作用:

  • IDE 能更智能提示 append/insert 等操作
  • 限定内部元素类型,避免类型误用

多类型注解(Union 或 |)

如果变量可能有多种类型,可使用 Union:

from typing import Union

data: Union[int, str] = 10
data = "abc"

Python 3.10 及以上版本还支持更简洁的写法:

data: int | str = 10

变量注解不要求必须赋值

Python 允许先声明类型,再赋值:

count: int
count = 10

适用于:

  • 变量提前声明
  • 需要在后续逻辑中根据情况赋值

使用注释进行类型注解(兼容旧代码)

适用于 Python 3.5 以下或需要兼容老代码时:

count = 10  # type: int
name = "guanzhi"  # type: str

这种写法 IDE 同样能识别。


使用注解让字典结构更清晰

config: dict[str, int] = {"max": 10, "min": 1}

更复杂时:

from typing import Dict, List

students: Dict[str, List[int]] = {
    "itheima": [95, 88, 90]
}

结构一目了然。


总结:变量类型注解的价值

场景注解带来的提升
使用基础类型更清晰的变量含义
自定义类对象可以获得方法提示
容器类型IDE 可根据容器内部类型提供补全
多类型更灵活的运行逻辑
注释注解兼容旧代码与第三方工具

一句话总结:

变量注解 = 写给人和工具看的“类型说明书”,让代码更清晰、更智能、更安全。


函数的类型注解

函数注解用于明确:

  • 函数参数的类型
  • 函数返回值的类型

注解本身不影响 Python 的运行,但能极大增强 IDE 提示,提升可读性与团队协作效率。

函数注解一般包含两部分:

1. 参数类型注解
2. 返回值类型注解

参数类型注解

基本格式:

def func(x: int, y: float, name: str):
    ...

示例:

def add(x: int, y: int):
    return x + y

result = add(5, 3)

好处:

  • IDE 能准确提示 add 需要传两个 int
  • 避免错误类型传入(如字符串)

返回值类型注解

使用 -> 指定返回类型:

def add(x: int, y: int) -> int:
    return x + y

如果返回字符串:

def get_name() -> str:
    return "guanzhi"

支持任意类型,包括自定义类:

def create_student() -> Student:
    return Student()

既注解参数,又注解返回值

def func(name: str, age: int) -> str:
    return f"{name} 今年 {age} 岁"

可选类型(Union 或 |)

如果参数或返回值可能是多个类型:

from typing import Union

def func(data: Union[int, str]) -> Union[str, bool]:
    ...

或更简洁写法(Python 3.10+):

def func(data: int | str) -> str | bool:
    ...

**可变参数的类型注解(*args / kwargs)

*args(不定长位置参数)

def func(*args: int):
    ...

表示 *args 中的所有元素都是 int。

**kwargs(不定长关键字参数)

def func(**kwargs: str):
    ...

表示所有 value 都是 str。

更精确的写法(typing.Argument types):

from typing import Any

def func(*args: int, **kwargs: Any):
    ...

函数返回容器时的注解方式

示例:返回一个列表(指定内部类型)

from typing import List

def get_scores() -> List[int]:
    return [90, 88, 76]

返回字典:

from typing import Dict

def get_info() -> Dict[str, int]:
    return {"math": 95, "eng": 88}

lambda 的类型注解

lambda 也可以注解:

from typing import Callable

func: Callable[[int, int], int] = lambda x, y: x + y

解释:

  • Callable[[参数类型列表], 返回类型]

回调函数(函数作为参数)的注解

from typing import Callable

def compute(x: int, y: int, fn: Callable[[int, int], int]) -> int:
    return fn(x, y)

print(compute(5, 3, lambda a, b: a + b))

好处:

  • IDE 可自动提示 fn 的参数与返回值类型
  • 让回调逻辑清晰明了

None 返回类型

如果函数不返回值,可指定:

def log(message: str) -> None:
    print(message)

函数注解的总结

注解内容写法
参数类型x: int
返回类型-> int
多类型`x: int
可变参数*args: int, **kwargs: str
容器类型List[int], Dict[str, int]
回调函数Callable[[int, int], int]

一句话总结:

函数注解 = 更清晰的函数说明书,让 IDE 和团队都能正确理解函数的使用方式。


类型别名(Type Alias)

当某个类型非常复杂、冗长,或会被重复使用时,可以为其创建“类型别名”,让代码更简洁、更易读。

示例:

from typing import List, Dict

StudentScore = Dict[str, List[int]]

scores: StudentScore = {
    "观止": [95, 88, 76],
    "itheima": [90, 80, 70]
}

好处:

  • 结构复杂时更容易识别
  • 多处使用时不必重复写长类型
  • 与业务语义保持一致(StudentScore 更直观)

类型别名本质上只是变量绑定类型,没有性能开销。


Optional(可选类型)

当变量或函数的返回值 可能为某类型,也可能为 None 时,可以使用 Optional。

写法:

from typing import Optional

name: Optional[str] = None

等价于:

name: str | None = None

函数示例:

def find_user(id: int) -> Optional[str]:
    if id == 1:
        return "guanzhi"
    return None

用途:

  • 常用于“查找型函数”
  • 数据库查询结果可能为空时
  • 避免 NoneType 错误

Literal(字面量类型)

用来限制变量只能是某几个固定值之一。

示例:

from typing import Literal

mode: Literal["r", "w", "a"] = "r"

如果写成其他值,例如:

mode = "x"

IDE 将提示类型错误。

函数示例:

def open_file(path: str, mode: Literal["r", "w", "a"]):
    ...

用途:

  • API 设计
  • 枚举替代
  • 限制参数取值范围

Any(任意类型)

表示允许任何类型,不做限制:

from typing import Any

data: Any = "abc"
data = 123
data = [1, 2, 3]

适用业务:

  • 类型不确定
  • 动态结构
  • 与外部系统交互的 JSON 数据

但注意:

Any 会关闭类型检测,不宜滥用。


NoReturn(函数永不返回)

用于标注:函数不会正常返回(例如无限循环、直接抛异常)。

from typing import NoReturn

def stop() -> NoReturn:
    raise RuntimeError("程序终止")

用途:

  • 永不返回的错误处理函数
  • 死循环逻辑
  • 明确告诉 IDE:函数不会走到结尾

Union(多类型)与 | 简写

Union 表示变量可以是多个类型之一:

from typing import Union

data: Union[int, str] = 10
data = "hello"

在 Python 3.10+ 中可使用更简洁的 |

data: int | str = 10

Final(不可重新赋值)

用于标记变量或类不可再被修改:

from typing import Final

URL: Final = "https://www.itheima.com"

再次赋值会得到 IDE 报警:

Cannot reassign final name "URL"

用途:

  • 配置常量
  • 不希望被修改的重要数据

TypedDict(更严谨的字典类型)

让字典结构具有“类一样”的字段检查能力。

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int

u: User = {"name": "guanzhi", "age": 20}

若字段缺失或类型不符,IDE 会提示错误。

用途:

  • API/JSON 数据结构
  • 接口开发
  • 配置文件解析

类型注解扩展能力总结

技术作用
类型别名为复杂类型命名,提高可读性
Optional表示值可为某类型或 None
Literal限定变量必须是某几个值之一
Any表示任意类型,关闭检查
NoReturn函数永远不会返回
Union / |多类型支持
Final声明不可重新赋值的常量
TypedDict为字典提供严格类型结构

一句话总结:

扩展注解让 Python 的类型系统更灵活、更严谨、更贴近真实项目工程需求。


类的类型注解

在面向对象中,类型注解不仅能写在变量、函数上,也能用于:

  • 成员属性(实例属性)
  • 类属性
  • 方法参数(包含 self / cls)
  • 方法返回值(包含返回自身类型)
  • 类方法、静态方法

合理使用能让面向对象代码更加清晰、规范,并获得大幅度 IDE 提示增强。


实例属性的类型注解

实例属性(对象属性)一般在 __init__() 中定义,适合直接写注解:

class Student:
    def __init__(self, name: str, age: int):
        self.name: str = name
        self.age: int = age

好处:

  • IDE 能准确识别 self.nameself.age 的类型
  • 属性在其他方法里被调用时拥有智能提示

类属性的类型注解

类属性对所有对象共享:

class Student:
    count: int = 0   # 用于统计创建对象数量

好处:

  • 一眼能看出 count 是 int
  • 在大型业务中可避免误赋值

构造方法返回自身

构造方法 __init__ 的返回类型固定是 None,不需要注解返回值:

class Student:
    def __init__(self) -> None:
        ...

方法返回自身类型(Self 类型)

如果一个方法返回对象自身,例如链式调用:

class Student:
    def set_name(self, name: str) -> "Student":
        self.name = name
        return self

这里 "Student" 是字符串形式的前向引用(Forward Reference),用于解决类未定义前不能引用自己的问题。

在 Python 3.11+ 可使用更优雅的写法:

from typing import Self

def set_name(self, name: str) -> Self:
    ...

好处:

  • 让链式调用获得完整智能提示
  • 不再需要字符串前向声明

self 的类型注解

self 本质就是当前对象。
根据 Python 类型规范:

  • 不需要强制为 self 添加注解
  • 但可以在高级场景中用 Self 或类名进行约束

例如:

def rename(self: "Student", new_name: str) -> None:
    self.name = new_name

一般情况下无需注解 self,它会自动被推断为当前类。


类方法与 cls 的类型注解

类方法的第一个参数是 cls(表示类本身):

class Student:

    @classmethod
    def from_string(cls, text: str) -> "Student":
        name, age = text.split(",")
        return cls(name, int(age))

说明:

  • cls 的类型通常使用 "Student" 作为前向引用
  • 返回类型是 Student 对象

在 Python 3.11+ 也可使用 Self

@classmethod
def from_string(cls, text: str) -> Self:
    ...

静态方法类型注解

静态方法没有 self 或 cls 参数,和普通函数一样注解:

class Student:

    @staticmethod
    def add(x: int, y: int) -> int:
        return x + y

静态方法适合写与类相关但不依赖对象状态的工具函数。


对象集合(例如学生列表)的注解

from typing import List

class Student:
    ...

students: List[Student] = []

或更简洁:

students: list[Student] = []

好处:

  • 调用 students[0].name 时 IDE 会自动提示
  • 常用于 DAO、ORM、分页查询等场景

在类内部使用类型提示字典、映射

from typing import Dict

class Student:
    cache: Dict[str, "Student"] = {}

用于:

  • 全局缓存
  • 工厂模式
  • 对象映射表

类注解总结

类型注解位置示例作用
实例属性self.name: str清晰、智能提示
类属性count: int = 0约束共享属性
返回自身类型-> Self支持链式调用
类方法 cls-> "Student"-> Self工厂方法
静态方法与普通函数一致工具型方法
对象集合list[Student]数据结构更明确

一句话总结:

类的类型注解让面向对象代码更严格、更清晰,同时让 IDE 成为真正的智能助手。


类型注解如何提升代码质量

Python 是动态语言,本质上不会因为类型错误而在编译期报错,但类型注解可以让你的开发体验从“靠经验”变成“靠工具辅助”,显著提高代码质量、可维护性与团队协作效率。

下面总结类型注解在真实开发中的核心作用。


减少潜在错误(提前发现 Bug)

没有类型注解时:

def add(x, y):
    return x + y

如果你不小心传入一个字符串:

add(10, "abc")

程序运行到这一行才会报错,这叫 运行期错误,排查成本高。

加入类型注解后:

def add(x: int, y: int) -> int:
    return x + y

IDE(如 PyCharm)会即时提示参数类型不正确:

Expected: int
Received: str

完全避免运行期才发现问题


增强多人协作能力(代码自解释)

多人协作时,不用再推测别人写的函数是干什么的、参数应该传什么类型。

例如:

def save(user: User, retry: int | None = None) -> bool:

让人一眼就能理解:

  • user 必须是 User 类型
  • retry 参数可选
  • 返回一个 bool(保存成功与否)

注解就是最好的“自带文档”。


提高 IDE 智能补全(加快开发速度)

无类型时:

data = {}
data.

IDE 无法知道 data 是 dict 还是其他类型,补全效果很差。

加注解后:

data: dict[str, int] = {}

IDE 立即可以提示:

  • get
  • keys
  • values
  • items
  • update
  • pop
  • clear

大幅提高开发速度与准确率。


让大型项目结构更清晰

没有类型注解的复杂结构:

def func():
    return {"name": "guanzhi", "score": [88, 99]}

别人看到后根本不知道:

  • 返回 dict?
  • dict 里面 name 是 str?
  • score 是 list[int] 吗?

正确做法:

from typing import Dict, List

def func() -> Dict[str, List[int]]:
    return {"name": "guanzhi", "score": [88, 99]}

一眼看懂函数输出结构,加速团队理解。


降低维护成本(可读性强)

半年以后你再回头看自己的代码:

result = handle(data)

你忘了 handle 需要什么参数,会返回什么。

但若:

def handle(data: list[str]) -> dict[str, int]:

无需翻代码,你就知道:

  • data 是 list[str]
  • 返回 dict[str, int]

这就是可维护性。


结合静态分析工具实现“伪静态语言体验”

Python 配合 mypy / Pyright 之类的工具,可以像 Java、C# 一样进行严格的静态类型检查。

例如:

error: Argument 1 to "add" has incompatible type "str"; expected "int"

这让 Python 拥有了 静态检查 → 动态运行 的“混合优势”。


类型注解不改变运行行为

无论是否写注解,Python 在运行时的行为完全一致:

x: int = "hello"
print(x)

依旧能正常运行,因为类型注解只作用于:

  • IDE
  • 类型检查工具
  • 程序员阅读

不会影响 Python 解释器执行逻辑。


类型注解真正提升代码质量的原因总结

提升点说明
提前发现问题不用等到运行时报错
提高协作效率团队成员无需猜类型
增强代码可读性更像“自带说明书”的代码
IDE 智能提示更完善快速开发、快速定位错误
大型项目更易维护清晰的类型结构降低心智负担
能与 mypy 等工具配合获得接近静态语言的安全性

一句话总结:

类型注解让 Python 的动态性更安全,让工程化开发更高效。


高级技巧:让类型注解更强大、更灵活

基本类型注解能解决 80% 的需求,而实际工程开发中,要面对复杂数据结构、动态接口、多类型适配场景,就需要更高级的注解技巧。

以下是高级类型注解中最常用、最实用的内容。


泛型(Generics)

泛型允许你为“容器类、工具类、函数”等声明可变的类型参数,就像构建一个“可装任何类型但规则固定的模具”。

示例:

from typing import TypeVar, List

T = TypeVar("T")  # 声明一个泛型类型 T

def first_item(items: List[T]) -> T:
    return items[0]

使用:

first_item([1, 2, 3])      # 返回 int
first_item(["a", "b", "c"]) # 返回 str

作用:

  • 让函数更加通用
  • 同时保持类型检查能力
  • 在高级框架开发(ORM、工具库)中非常常见

Protocol(结构化类型 / 鸭子类型注解)

Protocol 用于表示“只要对象拥有某个结构,就算符合类型”,与 Python 的鸭子类型天然契合。

例如:一个对象只要能 speak(),就视为 Animal:

from typing import Protocol

class CanSpeak(Protocol):
    def speak(self) -> str:
        ...

class Dog:
    def speak(self) -> str:
        return "汪汪"

class Student:
    def speak(self) -> str:
        return "你好"

def greet(obj: CanSpeak):
    print(obj.speak())

三个特点:

  1. 不要求继承(不需要 class Dog(CanSpeak))
  2. 只要拥有对应方法即可
  3. 更灵活的多态体系

这类能力在大型工程中极其有用。


TypedDict(严格结构字典)

在接口开发与 JSON 数据处理中非常常用。

示例:

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int
    scores: list[int]

使用:

u: User = {
    "name": "guanzhi",
    "age": 20,
    "scores": [99, 88]
}

IDE 提示:

  • 字段必须齐全
  • 字段类型必须匹配
  • 可实现“类一样的约束语义”

Callable 深度用法(函数/回调的类型描述)

简单回调:

from typing import Callable

def compute(x: int, y: int, func: Callable[[int, int], int]) -> int:
    return func(x, y)

更复杂时,函数可以包含:

  • 任意参数
  • 可变参数
  • 返回泛型类型

例如:

from typing import Callable, TypeVar

T = TypeVar("T")

Process = Callable[..., T]

Literal(固定值类型)在 API 设计中的应用

例如 HTTP 方法:

from typing import Literal

Method = Literal["GET", "POST", "PUT", "DELETE"]

def request(method: Method):
    ...

IDE 会提示:

"GET" | "POST" | "PUT" | "DELETE"

避免拼写错误和非法输入。


Final(不可重写 / 不可修改)

用于标记常量或不希望被继承类覆盖的方法:

from typing import Final

HOST: Final = "https://api.server.dev"

或方法:

from typing import final

class A:
    @final
    def run(self):
        ...

Annotated(为类型附加额外信息)

可用于写配置、字段校验等元数据扩展:

from typing import Annotated

age: Annotated[int, "必须大于0"] = 18

特别适用于:

  • 参数校验框架
  • ORM 注解
  • API 文档生成

自定义类型守卫(Type Guard)

用于条件判断中“收窄类型”,提高类型检查精准度。

from typing import TypeGuard

def is_int_list(data: list[object]) -> TypeGuard[list[int]]:
    return all(isinstance(x, int) for x in data)

用法:

if is_int_list(items):
    # items 在这里一定是 list[int]

强类型语言常见能力,Python 也具备!


高级技巧总结

技术用途
泛型 TypeVar做通用函数、类的类型模板
Protocol结构化类型 → 更灵活的多态
TypedDict让字典拥有类一样的结构约束
Callable精确描述回调、函数参数
Literal限定参数只能是固定值
Final声明常量、不允许修改
Annotated为类型附带额外元信息
TypeGuard条件判断中收窄类型,提高检查准确度

一句话总结:

高级类型注解能显著提升大型工程的可维护性,是现代 Python 项目的必备能力。


Python 类型注解总结

类型注解(Type Hinting)让 Python 从“动态弱类型”升级为“动态强提示语言”。
它不改变 Python 的运行方式,却极大提升代码质量、可读性、可维护性、可协作性。

以下为整章内容的完整知识体系化总结。


为什么需要类型注解

类型注解带来三大核心价值:

  • 强 IDE 智能提示(参数提示、属性提示、返回值提示)
  • 提前发现问题(减少运行期错误)
  • 增强可读性与团队协作效率(让代码自带文档属性)

它让工具比程序员更了解代码逻辑。


变量的类型注解

基础写法:

name: str = "itheima"
age: int = 20
price: float = 9.9
flag: bool = True

支持:

  • 多类型:int | str
  • Optional:str | None
  • 容器类型:list[int], dict[str, int]
  • 类对象:stu: Student
  • 注释注解:# type: int

函数的类型注解

📌 参数注解

def add(x: int, y: int):

📌 返回值注解

def add(x: int, y: int) -> int:

📌 复杂返回结构

-> dict[str, list[int]]

📌 可变参数

def func(*args: int, **kwargs: str):

📌 回调/函数类型

Callable[[int, int], int]

📌 支持 lambda、Union、多类型、None 返回值等


类型别名与高级注解能力

📌 类型别名

UserDict = dict[str, list[int]]

📌 Optional

name: str | None

📌 Literal

mode: Literal["r", "w", "a"]

📌 Final

HOST: Final = "https://api.com"

📌 TypedDict

class User(TypedDict):
    name: str
    age: int

📌 Protocol(鸭子类型增强)

class CanSpeak(Protocol):
    def speak(self) -> str: ...

📌 TypeVar / 泛型

T = TypeVar("T")

📌 Annotated(附加元信息)

age: Annotated[int, "必须大于0"]

类的类型注解

📌 实例属性注解

self.name: str = name

📌 类属性注解

count: int = 0

📌 返回自身类型

def set_name(self, name: str) -> Self:

📌 类方法注解

@classmethod
def load(cls) -> Self:

📌 静态方法注解

@staticmethod
def add(x: int, y: int) -> int:

📌 对象集合注解

students: list[Student] = []

类型注解如何提升代码质量

类型注解显著提升工程化能力:

  • 避免潜在类型错误
  • 让大型项目结构更清晰
  • 强化 IDE 补全 → 提高开发效率
  • 对团队协作极其友好
  • 配合 mypy、Pyright → 获得“伪静态语言”体验

一句话:

类型注解让代码更安全、更易读、更可维护,是 Python 现代开发必备能力。


高级技巧(工程化必备)

  • 泛型 TypeVar → 写通用工具
  • Protocol → 行为多态(不用继承也能多态)
  • TypedDict → 严格字典结构
  • Literal → 强约束型 API 参数
  • Annotated → 元信息扩展,更适合框架开发
  • TypeGuard → 提高条件判断精度

它们大幅提升大型工程的类型安全性。


最终总结

类型注解的作用可以归纳为一句话:

它让 Python 依旧保持灵活,却拥有了大项目所需的严谨与安全。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇