一、类型提示

在python中,我们定义一个有参函数,调用该函数时需要传入参数,如下所示:

# 定义一个简单的函数
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name print(get_full_name("john", "doe")) # 正常运行,结果:John Doe
print(get_full_name(1,2)) # 报错 """
上面的函数中有两个参数,但是没有说明参数的数据类型,
所以如果我们传入的类型不是str类型就会报错
"""

如上所示,如果没有去看函数的内部代码,函数的调用者并不知道需要传什么数据类型的参数给函数,所以我们就需要给调用者一些提示,告诉调用者该函数的参数应该使用什么数据类型的参数,这就是类型提示,如下:

# 注意函数参数后面的 ':str', 就表示该参数需要的是str类型的数据
def get_full_name(first_name: str, last_name: str):
full_name = first_name.title() + " " + last_name.title()
return full_name print(get_full_name("john", "doe"))

如上面的代码所示,我们将把下面这段代码中的函数参数从:

first_name, last_name

改成:

first_name: str, last_name: str

这样调用者就知道该传什么数据类型的参数。这和声明默认值是不同的,例如:

# 给函数参数添加默认值
first_name="john", last_name="doe"

这两者不一样。

我们用的是冒号(:),不是等号(=)。

而且添加类型提示一般不会改变原来的运行结果。

不只是 str,你能够声明所有的标准 Python 类型。

比如以下类型:

  • int
  • float
  • bool
  • bytes
def get_items(item_a: str, item_b: int, item_c: float, item_d: bool, item_e: bytes):
return item_a, item_b, item_c, item_d, item_d, item_e

嵌套类型

有些容器数据结构可以包含其他的值,比如 dictlistset 和 tuple。它们内部的值也会拥有自己的类型。

你可以使用 Python 的 typing 标准库来声明这些类型以及子类型。

它专门用来支持这些类型提示。

列表类型

例如,让我们来定义一个由 str 组成的 list 变量。

从 typing 模块导入 List(注意是大写的 L):

from typing import List

def process_items(items: List[str]):
for item in items:
print(item)

同样以冒号(:)来声明这个变量。输入 List 作为类型。由于列表是带有"子类型"的类型,所以我们把子类型放在方括号中。

元组和集合类型

声明 tuple 和 set 的方法也是一样的:

from typing import Set, Tuple

def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
return items_t, items_s
  • 变量 items_t 是一个 tuple,其中的前两个元素都是 int 类型, 最后一个元素是 str 类型。
  • 变量 items_s 是一个 set,其中的每个元素都是 bytes 类型。
字典类型

定义 dict 时,需要传入两个子类型,用逗号进行分隔。

第一个子类型声明 dict 的所有键。

第二个子类型声明 dict 的所有值:

from typing import Dict

def process_items(prices: Dict[str, float]):
for item_name, item_price in prices.items():
print(item_name)
print(item_price)

这表示:

  • 变量 prices 是一个 dict

    • 这个 dict 的所有键为 str 类型(可以看作是字典内每个元素的名称)。
    • 这个 dict 的所有值为 float 类型(可以看作是字典内每个元素的价格)。

二、'->'的用法

使用上面的例子,如下:

def get_full_name(first_name: str, last_name: str):
full_name = first_name.title() + " " + last_name.title()
return full_name

可以看到,如果不看内部代码,我们并不知道这个函数返回值的数据类型,所以我们做如下改动:

# 注意函数形参后面有个: -> str
def get_full_name(first_name, last_name) -> str:
full_name = first_name.title() + " " + last_name.title()
return full_name

我们可以看到,在上面的函数中,我们在形参后面添加了 '-> str' ,这个指的是函数的返回值为数据类型,告诉函数调用者这个函数的返回值为 str 类型的数据。

类型提示和python函数中'->'的用法的更多相关文章

  1. Python函数中参数类型

    在学习Python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂.在此做一个小结,加深理解. Python参数的定义 负责给函数提供一些必要的数据或信息,以保证函数 ...

  2. python函数中的参数类型

    python函数中的参数 动态获取函数的参数 python的函数类型详解

  3. 一道题带你搞定Python函数中形参和实参问题

    昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂.人生苦短,我用Python. 为了解答大家 ...

  4. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  5. python 函数中使用全局变量

    python 函数中如果需要使用全局变量,需要使用 global + 变量名 进行声明, 如果不声明,那么就是重新定义一个局部变量,并不会改变全局变量的值 n [1]: a = 3 In [2]: d ...

  6. Python函数中的可变参数

    在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...

  7. python函数中把列表(list)当参数时的"入坑"与"出坑"

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑!! 入坑 def f(x,li=[]): for i in range(x): li.append(i*i ...

  8. python函数中参数是如何传递的?

    python中一切皆对象,函数中参数传递的是对象的引用. 1在函数中改变变量指向的对象,即指向不同对象. 当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变. >>> ...

  9. python 函数中的递归、lambda 、map reduce 等详解

    举例说明 #例1: ###递归函数求和 from traitlets.traitlets import Instance def mysum(L): print(L) if not L: return ...

  10. python函数中参数的传递

    Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递 ...

随机推荐

  1. java中json字符串与实体类对象相互转换

    1.问题描述 有一个需求是这样的,把实体类转为Json字符串存入redis中,然后再把redis中存放的实体类Json字符串插入数据库中.因此需要涉及到json字符串与实体类对象的相互转换. 2.产生 ...

  2. 【CTF隐写工具】binwalk工具使用方法

    工具简介 Binwalk 是一种快速.易于使用的工具,用于分析.逆向工程和提取固件映像. 工具环境 Linux Linux环境下安装 直接使用apt/yum进行安装 apt install binwa ...

  3. [论文总结] 农业工程领域中App和Web相关应用论文笔记

    文章目录 1. Tomato leaf segmentation algorithms for mobile phone applications using deep learning 2. Int ...

  4. python之路36 MySQL查询关键字

    报错及作业讲解 报错 1.粗心大意 单词拼写错误 2.手忙脚乱 不会看报错 思考错误的核心 作业讲解 '''表与表中数据的关系可能会根据业务逻辑的不同 发生改变 不是永远固定的''' 服务器表与应用程 ...

  5. [LeetCode]819. 最常见的单词

    题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned).返回出现次数最多,同时不在禁用列表中的单词.题目保证至少有一个词不在禁用列表中,而且答案唯一. 禁用列表中的单词用小写 ...

  6. IOS(XCode)嵌入Unity模块

    今天下午明明要弄明白Android Studio出AAR给Unity用的,结果发现好多问题,小黑心里苦啊,整不明白了呀,让我做Unity吧... 好了,废话不给大家多说了,今天小黑给大家带来,如何在I ...

  7. postgresql的mysql外部数据扩展mysql_fdw编译及安装

    下载mysql_fdw项目文件:https://pgxn.org/dist/mysql_fdw/ 注:我使用的是ubuntu18.04,可以直接在仓库查看是否有二级制安装文件,当然是有的啦,这是很方便 ...

  8. ASP.NET6 + Mongo + OData

    准备工作 Docker环境 Mongo数据库 配置Mongo数据库 ASP.NET6 集成Mongo 安装MongoDB.Driver { "Logging": { "L ...

  9. C# SMTP发邮件不支持465端口的解决方案

    C# 发邮件帮助类传送门(465端口除外): https://www.cnblogs.com/dennisdong/p/15953790.html 一.问题解惑,为什么465发送失败 查阅资料得知,. ...

  10. Educational Codeforces Round 143 (Rated for Div. 2) A-E

    比赛链接 A 题意 有两座塔由红蓝方块组成,分别有 \(n,m\) 个方块,一次操作可以把一座塔塔顶的方块移动到另一座塔的塔顶,问通过操作是否能使每座塔中没有颜色相同的相邻方块. 题解 知识点:贪心. ...