1.介绍

Python是一门动态语言,声明函数的参数时,并不需要声明类型

def add(a, b):
return a + b

上面的示例,对于使用这块代码的人来说,就会比较模糊。ab我应该传什么类型的数据呢?传错了会怎么样呢?如下

def add(a, b):
return a + b


if __name__ == "__main__": # 实例化-下单类
print("传两列表:", add([1, 2, 3, 4], [10, 10, 10, 10]))
print("传两整数:", add(1, 10))
print("传两字符串:", add("您", "好"))
print("传两字典:", add({'a': 1}, {'b': 2}))

# ---------------------- 输出 ----------------------
传两列表: [1, 2, 3, 4, 10, 10, 10, 10]
传两整数: 11
传两字符串: 您好
Traceback (most recent call last):
File "/Users/liuqh/ProjectItem/PythonItem/python-learn-demo/main.py", line 12, in <module>
print("传两字典:", add({'a': 1}, {'b': 2}))
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/liuqh/ProjectItem/PythonItem/python-learn-demo/main.py", line 5, in add
return a + b
~~^~~
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'

为了代码更易读,Python 3 提供了一个新的特性:
函数注解

2. 使用语法

2.1 语法

def 函数名(x:类型, y:类型) -> 类型:
...
return x + y

2.2 内置类型

  • int,long,float: 整型,长整形,浮点型
  • bool,str: 布尔型,字符串类型
  • List, Tuple, Dict, Set:列表,元组,字典, 集合
  • Iterable,Iterator:可迭代类型,迭代器类型
  • Generator:生成器类型

3. 参数示例

3.1 内置类型

输出:

传入数字:  6
传入字符串: ab

当函数加上注解时,可以看出当传入不对的类型时,IDE会给出提示,但是代码还是可以正常运行的。 特别要强调的是,Python 解释器并不会因为这些注解而提供额外的校验,这些类型注解加不加,对代码来说没有任何影响,一样可以正常运行.

3.2 自定义类

# ---------------------- 定义类 ----------------------
class Student:
def __init__(self, name: str, age: int):
self.name = name
self.age = age

def desc(self):
print("我是{},今年{}".format(self.name, self.age))

# ---------------------- 接受参数 ----------------------
def operate(s: Student):
isRes = isinstance(s, Student)
if not isRes:
print("参数类型错误~")
return
s.desc()

# ---------------------- 代码运行 ----------------------
if __name__ == "__main__":
# 传个类
stu = Student("小明", 23)
operate(stu)
# 传个基本类型
operate("消息")

有了函数注解后,当传入的是个对象时,IDE会提示我们这个参数有哪些属性和方法。

4.返回值示例

4.1 自定义类

内置类型比较简单,这里不在过多演示,接着上面示例,把返回值也加上说明

# ---------------------- 接受参数 ----------------------
def createStudent(name: str, age: int) -> Student | None:
if age < 10:
return None
return Student(name, age)

# ---------------------- 代码运行 ----------------------
if __name__ == "__main__":
c = createStudent("张三", 18)
if c is not None:
c.desc()

c2 = createStudent("哈士奇", 1)
if c2 is None:
print("未能创建对象~")

# ---------------------- 输出 ----------------------
# 我是张三,今年18
# 未能创建对象~