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

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘