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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP