Python函数的基本特征详解

2023-10-25 00:30

本文主要是介绍Python函数的基本特征详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1Python中文社区 全球Python中文开发者的 精神部落 640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

要点抢先看

1、开始编写一个简单完整的函数

2、函数也是对象

3、函数的多态内涵

今天开始,我们来讲讲函数,简而言之一个函数就是将一些语句集合在一起的部件,它们能够不止一次的在程序中运行。函数还能计算出一个返回值,并能够改变作为函数输入的参数,而这些参数在代码运行时也许每次“代入”的值都不相同。函数是python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。

函数有关的内容主要分为函数的基本概念、作用域以及参数传递,还有一些相关的高级概念,如装饰器。

那这一节我们先学习函数的最基本用法吧

首先我们先学习一下在python中如何去编写一个函数。今天我们先抛出点儿理论:需要注意的是,函数在python中同在C语言中是有所不同的。

第一:def引导一段可执行的代码:

def本身是一个可执行的语句,函数此时并不存在,直到python运行了def后,函数才存在,def后面包含的就是函数语句。在典型的操作中,def语句在模块文件中编写,并自然而然的在模块文件第一次被导入的时候生成定义的函数。

第二:函数也是对象。def创建了一个对象并将其赋值给某一变量名。

当python运行到def语句时,它将会生成一个新的函数对象并将其赋值给这个函数名。和普通对象赋值一样,函数名就成了某一个函数的引用。python中,万物皆对象,因此函数也是一种对象,他可以赋值给其他的变量名,并且可以保存在列表之中。

第三:函数是通过赋值语句(对象引用)传递的。

在python中,参数通过赋值传递给了函数(也就是说,就像我们所学过的,使用对象引用),在python中,调用者以及函数通过引用共享对象,但是改变传递的可变对象可以改变调用者共享的那个对象。

第四:函数的多态性。可以传递任意类型的参数给函数,函数也可以返回任意类型的对象。

其结果就是,函数常常可以用在很多类型的对象身上,任意支持兼容接口(方法和表达式)的对象都能使用。

哎呀,说了这么些理论,也够枯燥的,那我们来看实际的例子吧:

 
  1. def func(a,b):

  2.    return a+b

  3. other_name = func

  4. print(other_name(1,2))

  5. 3

在这里我们可以看到如何定义一个最简单的函数,重要的是我们还将函数赋值给一个不同的变量名,并通过新的变量名进行了调用。这说明了一点,在python中函数也是对象。

python的函数使用还是非常简单的,我们再举一个例子:主要描述了两个方面:def定义(即函数的创建)和函数的调用(表达式告诉python去运行函数主体)

 
  1. def func(x,y):

  2.    return x * y

  3. print(func(2,4))

  4. 8

结合前面的例子我们可以看到,在例子中,参数x被赋值为2,y被赋值为4,经过函数主体运算,return返回结果对象。

这和上面的例子不是一模一样吗?

别急,我们接着看:

 
  1. def func(x,y):

  2.    return x * y

  3. print(func(3.14,8))

  4. 25.12

 
  1. def func(x,y):

  2.    return x * y

  3. print(func('Ab',8))

  4. AbAbAbAbAbAbAbAb

出现这种现象非常重要,我们在函数声明时并没有对参数和返回值进行类型声明,因此实际上,这些数据类型是依托调用者的传入类型,即传入什么就是什么,函数体的执行过程可能会因为参数类型的改变而发生变化。因此这里出现了数字的乘法和字符串的重复这两种似乎截然不同的现象。换句话说func函数的运行结果取决于传递给他的值。

函数中x *y表达式的意义完全取决于x和y的对象类型,在一个实例下执行时数值乘法,在另一个实例下执行是字符串的重复,python将对某一对象在某种语法下的合理性交由对象自身来判断。

这种依赖于类型的行为称为多态,其含义就是一个操作的意义取决于被操作对象的类型,因为python是动态类型语言,所以多态在python中随处可见。

如果传递的对象不支持这种预期的接口,那么python会在*表达式运行时进行检测,并自动抛出一个异常:

 
  1. def func(x,y):

  2.    return x * y

  3. print(func('Ab','aa'))

  4. Traceback (most recent call last):

  5. File "E:/12homework/12homework.py", line 4, in <module>

  6. print(func('Ab','aa'))

  7. File "E:/12homework/12homework.py", line 2, in func

  8. return x * y

  9. TypeError: can't multiply sequence by non-int of type 'str'

因此,这种多态的编程模型意味着必须测试代码去检测错误。

我们看一个例子:

 
  1. def func(seq1, seq2):

  2.    res = []

  3.    for x in seq1:

  4.        if x in seq2:

  5.            res.append(x)

  6.    return res

模型中我们可以看到,调用者可以传递任何类型的参数,通过遍历两个序列,寻找他们的交集,因此函数中使用任意可迭代对象作为参数都是合适的。并在最后将运算结果的列表对象返给调用者

 
  1. print(func([1,2,3,4,5,6], (5,6,7,8)))

  2. [5, 6]

  3. print(func('spam', ('s','p','c','m')))

  4. ['s', 'p', 'm']

甚至使用列表解析式也可以

 
  1. print(func([1,2,3,4], [x for x in (2,3,5)]))

  2. [2, 3]

可以看出,这个函数也是多态的,他支持多种参数类型,记住,只要支持对象接口----可进行数据迭代即可,第一个参数支持for循环,第二个参数支持成员测试,满足上述条件的任意对象都可以使得函数正常工作,包括实际存在的物理序列,字符串、列表等,以及可迭代对象,文件和字典等等,都可以传入使用。

同时我们需要注意,函数的参数是通过赋值而被传入的,所以seq1和seq2是本地变量,结果列表对象是通过赋值得到的,也是本地对象,所有的本地变量都在函数调用时出现,在函数退出时消失。

另外需要专门说明一点,return语句返回结果对象给调用者,但是res对象本身会在函数调用结束时消失。

作者:酱油哥,清华程序猿、IT非主流,知乎专栏《给妹子讲python》

最近热门文章

如何用Python做一个骚气的程序员

用Python爬取陈奕迅新歌《我们》10万条评论的新发现

机器学习算法KNN简介及实现

Python有趣的解包用法

用Python分析苹果公司股价数据

Nginx+uwsgi部署Django应用

Python自然语言处理分析倚天屠龙记

Python 3.6实现单博主微博文本、图片及热评爬取

640?wx_fmt=jpeg

▼ 点击下方阅读原文免费成为社区会员

这篇关于Python函数的基本特征详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278781

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat