Python函数教程

本文概述

  • Python中的函数
  • 如何定义函数:用户定义函数(UDF)
  • Python中的匿名函数
  • 使用main()作为函数
  • 是否想进一步练习?
函数是Python编程语言的重要组成部分:你可能已经遇到并使用了Python语言内置的或库生态系统附带的许多出色函数。但是, 作为数据科学家, 你将不断需要编写自己的函数来解决数据给你带来的问题。
因此, 本文将向你介绍Python函数。你将涵盖以下主题:
  • Python中的函数
    • 函数与方法
    • 参数与参数
  • 如何定义函数:用户定义函数(UDF)
    • 退货单
    • 如何调用函数
    • 如何将文档字符串添加到Python函数
    • Python中的函数参数
    • 全局变量与局部变量
  • Python中的匿名函数
  • 使用main()作为函数
(要进一步练习, 请尝试srcmini的Python数据科学工具箱(第1部分)课程!)
Python中的函数你可以在编程中使用函数来捆绑要重复使用的指令集, 或者由于它们的复杂性而更好地独立于子程序并在需要时调用。这意味着函数是一段为执行指定任务而编写的代码。为了执行该特定任务, 该功能可能需要也可能不需要多个输入。执行任务时, 该函数可以或不能返回一个或多个值。
Python中有三种类型的函数:
  • 内置函数, 例如help()寻求帮助, min()获得最小值, print()将对象打印到终端, ……你可以在此处找到更多这些功能的概述。
  • 用户定义功能(UDF), 用户创建的功能可以帮助他们;和
  • 匿名函数, 也称为lambda函数, 因为它们未使用标准def关键字声明。
函数与方法
方法是指作为类一部分的函数。你可以使用类的实例或对象访问它。一个函数没有此限制:它仅指一个独立的函数。这意味着所有方法都是函数, 但并非所有功能都是方法。
考虑以下示例, 在该示例中, 首先定义一个函数plus(), 然后定义一个具有sum()方法的Summation类:
如果现在要调用Summation类中的sum()方法, 则首先需要定义该类的实例或对象。因此, 让我们定义一个这样的对象:
请记住, 当你要调用函数plus()时, 不需要此实例化!你将能够在srcmini Light代码块中执行plus(1, 2), 而不会出现任何问题!
参数与参数
参数是定义函数或方法时使用的名称, 参数将映射到其中。换句话说, 参数是提供给任何函数或方法调用的事物, 而函数或方法代码则通过参数名称来引用参数。
请考虑以下示例, 并回顾上面的srcmini Light块:即使你先前定义了三个参数, 即self, a和b, 也将两个参数传递给Summation类的sum()方法。
自我发生了什么?
每个类方法的第一个参数始终是对该类当前实例的引用, 在本例中为Summation。按照惯例, 该参数称为自我。
这一切都意味着在这种情况下, 你不会将引用传递给self, 因为self是隐式传递的参数的参数名称, 该参数引用通过其调用方法的实例。它隐式地插入到参数列表中。
如何定义函数:用户定义函数(UDF)在Python中定义函数的四个步骤如下:
  1. 使用关键字def声明函数, 并在其后加上函数名称。
  2. 向函数添加参数:它们应该在函数的括号内。以冒号结尾。
  3. 添加函数应执行的语句。
  4. 如果函数应该输出某些内容, 请以return语句结束。没有return语句, 你的函数将返回对象None。
当然, 随着你的前进, 你的功能将变得更加复杂:你可以添加for循环, 流控制等, 并对其进行更多添加以使其更细粒度:
def hello():name = str(input("Enter your name: "))if name:print ("Hello " + str(name))else:print("Hello World") return hello()

在上面的功能中, 你要求用户提供一个名称。如果没有给出名称, 该功能将打印出” Hello World” 。否则, 用户将获得个性化的” Hello” 响应。
还要记住, 你可以为UDF定义一个或多个功能参数。处理” 函数参数” 部分时, 你将学到更多有关此的知识。此外, 由于你的函数, 你可能会也可能不会返回一个或多个值。
退货声明
请注意, 当你在UDF hello()中打印某些内容时, 实际上并不需要将其返回。上面的函数和这个函数之间没有任何区别:
但是, 如果要继续使用函数的结果并尝试对其进行一些操作, 则需要使用return语句实际返回一个值, 例如String, 整数, …。考虑以下情形, 其中hello()返回字符串” hello” , 而函数hello_noreturn()返回None:
第二个功能给你一个错误, 因为你无法使用无执行任何操作。你将收到一个TypeError, 该错误表明你无法对NoneType(hello_noreturn()结果为None)和int(2)进行乘法运算。
Tip函数遇到return语句时会立即退出, 即使这意味着它们不会返回任何值:
使用return语句时值得一提的另一件事是, 你可以使用它来返回多个值。为此, 你可以使用元组。
请记住, 此数据结构与列表非常相似:它可以包含多个值。但是, 元组是不可变的, 这意味着你无法修改其中存储的任何数量!你可以在双括号()的帮助下构造它。你可以在逗号和赋值运算符的帮助下将元组解压缩为多个变量。
查看以下示例, 以了解你的函数如何返回多个值:
请注意, return语句的返回总和a将与return(总和a)具有相同的结果:前者实际上将sum和a打包到了内部的元组中!
如何调用函数
在前面的部分中, 你已经看到了很多有关如何调用函数的示例。调用函数意味着你直接从Python提示符下或通过另一个函数(如你在” 嵌套函数” 部分中看到的)执行已定义的函数。
只需执行hello()即可调用新定义的函数hello(), 就像下面的srcmini Light块中一样:
如何将文档字符串添加到Python函数
用Python编写函数的另一个重要方面:文档字符串。文档字符串描述函数的功能, 例如函数执行的计算或其返回值。这些说明可作为函数的文档, 以便阅读函数的文档字符串的任何人都可以理解函数的功能, 而不必跟踪函数定义中的所有代码。
函数文档字符串放在函数标题之后的立即行中, 并放在三引号之间。你的hello()函数合适的文档字符串是” 打印” Hello World” ” 。
def hello():"""Prints "Hello World".Returns:None"""print("Hello World") return

请注意, 文档字符串的长度可能比此处作为示例给出的字符串更长。如果你想更详细地研究文档字符串, 则最好查看一些Python库的Github存储库, 例如scikit-learn或pandas, 你将在其中找到很多示例!
Python中的函数参数
之前, 你了解了参数和参数之间的区别。简而言之, 参数是赋予任何函数或方法调用的事物, 而函数或方法代码则通过参数名称来引用参数。 Python UDF可以采用四种类型的参数:
  • 默认参数
  • 必填参数
  • 关键字参数
  • 可变数量的参数
默认参数默认参数是在函数调用期间未传递任何参数值的情况下采用默认值的参数。你可以使用赋值运算符=来分配此默认值, 如以下示例所示:
必填参数顾名思义, UDF的必需参数是其中必须包含的参数。这些参数需要在函数调用期间以正确的顺序传递, 就像下面的示例一样:
你需要映射到a和b参数的参数来调用该函数, 而不会出现任何错误。如果在a和b之间切换, 结果将不会有所不同, 但是如果将plus()更改为以下内容, 则可能会有所不同:
关键字参数如果要确保以正确的顺序调用所有参数, 则可以在函数调用中使用关键字参数。你可以使用它们通过参数名称来标识参数。让我们以上面的示例为例, 使它更加清楚:
请注意, 通过使用关键字参数, 你还可以切换参数的顺序, 并在执行函数时仍然得到相同的结果:
可变数量的参数如果你不知道要传递给函数的确切参数数量, 则可以将以下语法与* args结合使用:
星号(*)放在包含所有非关键字变量自变量值的变量名之前。请注意, 你可能还已经将* varint, * var_int_args或任何其他名称传递给plus()函数。
提示:请尝试将* args替换为包含星号的其他名称。你会看到上面的代码一直有效!
你会看到上面的函数利用了内置的Python sum()函数对所有传递给plus()的参数求和。如果你想避免这种情况并完全自己构建函数, 则可以使用以下替代方法:
全局变量与局部变量
通常, 在函数体内定义的变量具有局部作用域, 而在外部定义的变量具有全局作用域。这意味着局部变量是在功能块内定义的, 只能在该函数内部访问, 而全局变量可以由脚本中可能存在的所有函数获得:
你会看到会收到一个NameError, 当你尝试打印出函数体内定义的局部变量total时, 未定义名称” total” 。另一方面, 可以将init变量打印出来而没有任何问题。
Python中的匿名函数匿名函数在Python中也称为lambda函数, 因为你可以使用lambda关键字来代替使用标准def关键字声明它们。
在上面的srcmini Light块中, lambda x:x * 2是匿名或lambda函数。 x是参数, x * 2是要求值并返回的表达式或指令。此功能的特殊之处在于它没有名称, 就像你在本功能教程的第一部分中看到的示例一样。如果必须在UDF中编写上述函数, 则结果如下:
def double(x):return x*2

让我们考虑一个lambda函数的另一个示例, 其中使用两个参数:
在短时间内需要匿名函数(在运行时创建)时, 可以使用匿名函数。与之相关的特定上下文是在使用filter(), map()和reduce()时:
顾名思义, filter()函数根据> 10的标准过滤原始输入列表my_list。另一方面, 使用map(), 你可以将函数应用于列表my_list的所有项。在这种情况下, 请将所有元素乘以2。
【Python函数教程】请注意, reduce()函数是functools库的一部分。你可以从左到右对my_list列表中的项目累积使用此函数, 并在这种情况下将序列减少为单个值55。
使用main()作为函数如果你有Java等其他编程语言的经验, 那么你将知道执行功能需要主功能。正如你在上面的示例中看到的那样, Python不一定需要这样做。但是, 在Python程序中包含main()函数可以很方便地在逻辑上构建代码-所有最重要的组件都包含在main()函数中。
你可以轻松定义main()函数并调用它, 就像完成上述所有其他函数一样:
但是, 就目前情况而言, 将main()函数的代码作为模块导入时将被调用。为确保不会发生这种情况, 请在__name__ ==’ __main__’ 时调用main()函数。
这意味着以上代码块的代码变为:
请注意, 除了__main__函数之外, 你还具有__init__函数, 用于初始化类或对象的实例。简而言之, 它充当构造函数或初始化程序, 并在创建类的新实例时自动被调用。使用该功能, 新创建的对象将分配给参数self, 你将在本教程的前面看到该参数。看下面的例子:
class Dog:"""Requires:legs - Legs so that the dog can walk.color - A color of the fur."""def __init__(self, legs, color):self.legs = legsself.color = colordef bark(self):bark = "bark" * 2return barkif __name__ == "__main__":dog = Dog(4, "brown")bark = dog.bark()print(bark)

是否想进一步练习?恭喜!你已经完成了有关Python函数的简短教程。如果你想修改其他基本的Python编程材料, 请不要错过” 数据科学的数据类型” , 该课程将巩固和实践你对列表, 字典, 元组, 集合和日期时间的了解。

    推荐阅读