Python限定方法参数类型、变量类型及“->”的作用

    20216月份的《青少年软件编程(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

函数名:testa:int指定了输入参数aint类型,b:str指定了输入参数bstr类型,-> str 指定函数返回值为srt类型。

    例1中,调用astr,与定义int不一致,返回了一个int,与定义str不一致。

    在PythonIDLE中只是提示,要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。

猜你喜欢

转载自blog.csdn.net/hz_zhangrl/article/details/130466791