2021年6月份的《青少年软件编程(Python)等级考试试卷(四级)》有这么一个题:
题目中的自定义函数pic(a:int,b:str)->str中出现了:int、:str和->str,那这些符号什么意思呢?
大家都知道,Python是动态类型语言,自定义函数时不需要声明与指定类型,但是在Python3.5之后,新增了对函数参数和返回值的类型指定和检查。但即使参数输入类型与定义时不一致,实际上运行不会报错,Python的本质还是动态类型语言。
自Python3.5开始,Python引入了类型注解(type hints)。类型检查,防止运行时出现参数和返回值类型、变量类型不符合的现象。作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
typing模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。PyCharm目前支持typing检查,参数类型错误会黄色提示。
官网typing详细说明
typing类型标注的常用类型见表1。
一、基本类型指定
例1
函数名:test,a:int指定了输入参数a为int类型,b:str指定了输入参数b为str类型,-> str 指定函数返回值为srt类型。
例1中,调用a为str,与定义int不一致,返回了一个int,与定义str不一致。
在Python的IDLE中只是提示,要PyCharm中会背景色提醒,但不会报错。
二、复杂的类型标注
复杂的类型标记要用到模块typing。
例2
from typing import List, Tuple, Dict
def test2(a: List[int, str], b: Tuple[str, int]) -> Dict:
print(int(a))
return {b: a}
test3([123, 'test'], ("123123", 'abc'))
这里需要注意,元组这个类型是比较特殊的,因为它是不可变的。
所以,当我们指定Tuple[str, str]时,就只能传入长度为2,并且元组中的所有元素都是str类型。
三、序列类型指定
当不需要指定具体类型的序列时,可用Sequence类型,Sequence类型表示序列,可以是列表、元组、字符串、迭代器等。
例3
from typing import Sequence
def test3(lst: Sequence[int]) -> int:
total = 0
for i in lst:
total += i
return total
test3([123, 345])
test3((123, 345))
test3(b"812")
test3(range(5))
四、存在问题
例4
from typing import List
def test(b: List[int]) -> str:
print(b)
return 'test'
test([1, 'a'])
从这个例子可以看出来,虽然定义函数时指定了List[int]即由int组成的列表,但是,实际中,只要这个列表中存在int(其他的可以为任何类型),就不会出现提醒。
回到开头的题目,一个整数乘以字符串,即字符串重复这个整数次,所以答案为A。