【学习】python函数语法(面像对象、封装函数)

阅读开源深度学习源码的时候,使用到了很多封装函数以及Python的高级语法,看起来很混乱很痛苦很困难。对python函数语法做个总结!!!

Table of Contents

  1. 熟练Python语法,尤其是函数参数、迭代器与生成器、函数式编程、面向对象编程
  2. 学会查看封装函数的具体实现

先看两个pythton关键字:

  • in关键字:in关键字用于检查一个元素是否存在于一个集合中,如列表、元组、字典等。它通常与条件语句(如if语句)一起使用,也可以用在循环中。它是用来检查某个值是否在一个容器中的成员,比如:

     numbers = [1, 2, 3, 4, 5] if 3 in numbers:print("3 存在于列表中") else:print("3 不存在于列表中")
  • range()函数:range()函数用于生成一个指定范围内的整数序列。它常与for循环结合使用,用来遍历一定范围内的整数。range()函数的语法是range(start,
    stop, step),其中start是序列的起始值(默认为0),stop是序列的结束值(不包含),step是序列的步长(默认为1)。

    for i in range(5):print(i) ```

下面,进入正题!

1.Python语法

1.1 函数参数

1.1.1位置参数

位置参数就是平时用到最多的一种情况:实参与形参数量相等、位置对应。
举个例子:计算一个实数 x 的 n 次幂

def power(x, n):s = 1while n > 0:n = n - 1s = s * xreturn s

在这里插入图片描述
那么如果少一个参数或者位置不对应就达不到预期效果,甚至会报错。但我们平时用到的最多的就是 2 次幂,所以我们想即使少一个参数 n 也能达到预期效果,该怎么办呢?
答案是 使用默认参数

1.1.2 默认参数

def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s

在这里插入图片描述
使用默认参数要注意一下几点:

  • 必选参数在前,默认参数在后,否则Python的解释器会报错(因为Python解释器会按照位从左至右的顺序去寻找);
  • 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

你可能会说:这虽然解决了参数数量问题,还是得考虑位置对应问题呀!是的,看个例子:

def enroll(name, gender, age=6, city='Beijing'):print('name:', name)print('gender:', gender)print('age:', age)print('city:', city)

在这里插入图片描述
所以,默认参数是按顺序提供的,即实参会与形参从左至右匹配,最后剩余没有匹配完的参数采用默认值。当然,也可以不按顺序提供部分默认参数,当不按顺序提供部分默认参数时,需要把参数名写上。
注: 定义默认参数要牢记一点:默认参数必须指向不变对象! 因为可变参数会导致默认参数改变

1.1.3 可变参数

你是不是在想:在参数数量不相等的情况下靠默认参数对应,能不能实现不依赖参数数量呢?即参数数量随时可变!

使用方式:加一个*

def calc(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum

在这里插入图片描述
看!加一个 * 就实现可变参数的方式,其实在函数内部,参数numbers接收到的是一个tuple(元组)。

:Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。(1.1.4节关键字参数也一样)
在这里插入图片描述

1.1.4 关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

使用方式:加两个**

在这里插入图片描述
注:当没有关键字参数时默认是一个空字典{}。
关键字参数有什么用?它可以扩展函数的功能。就像上面所说的,他真正实现了“不依赖于参数数量与参数位置”,可以任意添加参数。

1.2 生成器 (暂时没遇到过,不太清楚)

掌握生成器你必须理解两个问题:

  1. 什么是生成器?
  2. 为什么需要生成器?

1.2.1 什么是生成器?

在Python中,一边循环一边计算的机制就是生成器(generator)。那么如何创建 generator 呢?
方法一:把一个列表生成式的 [ ] 改成 () 。

在这里插入图片描述

注:generator 也是可迭代对象,因此可以通过 for 循环来遍历迭代器中每一个元素。

方法二:计算规则过于复杂,用列表生成式写不出来时,可以用函数实现。
在这里插入图片描述
注:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

回顾一下,列表元素可以按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这有什么用呢?这样就不必创建完整的list,从而节省大量的空间。
因此,生成器可以创建很大容量的数据对象,但是不需要很大的存储空间。
在这里插入图片描述
上面例子可以充分体现生成器一个应用:用于生成训练数据,每调用一次生成一个batch的数据。

1.3 函数式编程

函数是编程是Python中极为重要的,主要包括高阶函数、匿名函数、返回函数、装饰器与偏函数。
这里详细介绍一下装饰器(decorator),也是项目中的一个常用方法。
装饰器是什么? 在不希望修改函数的定义,在代码运行期间动态增加函数功能的方式,称之为“装饰器”(Decorator)。本质上,decorator就是一个返回函数的高阶函数。
怎么去使用装饰器呢? decorator接受一个函数作为参数,并返回一个函数。 借助Python的@语法,把decorator置于函数的定义处,实现功能扩展的目的。

在我另一篇博客有关于装饰器的理解与介绍:python装饰器

在这里插入图片描述
可以看到,now() 函数功能是打印今天的日期,log() 是定义的一个装饰器,借助@将装饰器置于函数now() 的定义处,是的now() 具有打印日志的功能。

但是这个原理是怎么样的呢? 千万不要以为是按顺序依次地调用了两个函数!

把 @log 放到 now() 函数的定义处,相当于执行了语句:now = log(now)

由于 log() 是一个decorator,返回一个函数,所以,原来的 now() 函数仍然存在,只是现在同名的 now 变量指向了新的函数,于是调用 now() 将执行新函数,即在log()函数中返回的wrapper()函数。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。
所以原始函数 now() 的功能是在装饰器中实现的,通过传入的参数(是一个函数)来实现的。

你应该知道下面代码是如何运行的了。
在这里插入图片描述

1.4 面向对象编程

面向对象的三个基本特征是:封装、继承、多态。面向对象的优势只有在实战中才能感受,就不多说空洞的话了!

注意:@property,多重继承、定制类、枚举类、元类等都是面向对象编程的重要知识点。

2. 封装函数

在深度学习框架中,我们可以看见基本都是封装的函数,在查看官方文档弄清楚函数功能之后,我们要读封装函数的具体实现。
比如 keras 中 fit_generator() 函数
在这里插入图片描述
如何进入函数内部呢?Ctrl+鼠标左键!(pycharm中)
进入到函数定义处如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Redis做缓存的小案例

如果不了解Redis,可以查看本人博客:Redis入门 Redis基于内存,因此查询速度快,常常可以用来作为缓存使用,缓存就是我们在内存中开辟一段区域来存储我们查询比较频繁的数据,这样,我们在下一次查询…

C#,图论与图算法,有向图(Directed Graph)的环(Cycle)的普通判断算法与源代码

1 检查该图是否包含循环 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或…

[视觉基础知识]: img to bev # include bev seg

参考:https://towardsdatascience.com/monocular-birds-eye-view-semantic-segmentation-for-autonomous-driving-ee2f771afb59 有源传感器(lidar or radar)得到的数据,天然就是一种bev表示(x-y平面)&#…

kafka connect

kafka connect是kafka和外部存储系统交互的工具 bootstrap.servers key.converter:JSON and Avro. value.converter:JSON and Avro. 一、standalone模式 1、在config/connect-standalone.properties中配置 plugin.pathlibs/connect-file-3.6.1.jar 2、在…

如何进行Android的SDK开发

进行Android的SDK开发,需要以下步骤: 安装Android开发工具包(Android SDK) 首先,需要安装Android开发工具包(Android SDK)。可以从Google官方网站下载并安装Android Studio,它将包含…

想速成AD?凡亿教育正式上线《Altium Designer 24:150讲操作速成实战课程》

随着电子技术的不断发展,芯片生产工艺迭代更新,印制电路板(PCB)结构日益复杂,从最早的单片机到双面板,再到复杂的多层板结构,电路板上的布线密度越来越高。 同时,随着DSP、ARM、FPGA、DDR等高速逻辑元件的应用,PCB的信号完整性和抗干扰性能显得尤为重要,光靠EDA软件的自动布线…

LeetCode每日一题 翻转二叉树(二叉树)

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root [2,1,3] 输出:[2,3,1]示…

每天几道面试题|Kafka(一)基础概念

文章目录 什么是 Apache Kafka?它是用来解决什么问题的?Kafka 的主要组件有哪些?它们各自的作用是什么?Kafka 中的生产者和消费者是什么?它们之间的关系是怎样的?Kafka 中的分区是什么?为什么要…

Mistral AI vs. Meta:两大 Top 开源模型的对比

编者按: 随着大模型的不断升级和参数量的持续扩大,越来越多人开始重视大模型存在的硬件资源要求高、碳排放量较大等问题。如何在保持模型性能的同时,降低计算成本和资源消耗,成为了业界一个迫切需要解决的问题。 我们今天为大家带…

Servlet使用

文章目录 简介一、快速入门二、Servlet 执行流程三、Servlet 生命周期四、Servlet 方法介绍五、Servlet 体系结构六、Servlet urlPattern配置七、XML 配置方式编写 Servlet 简介 一、快速入门 <dependencies><dependency><groupId>javax.servlet</groupId…

个人网站制作 Part 9 添加发布、管理博客功能 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加博客功能&#x1f528;使用Express和MongoDB&#x1f527;步骤 1: 创建博客模型&#x1f527;步骤 2: 创建博客路由 &#x1f528;使用前端框架&#x1f527;步骤 3:…

界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(三)

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 本文中的内容概述了…

外包干了28天,技术退步明显......

说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…

Testng框架集成新业务

总体框架设计见我另一篇博客&#xff1a;httpclienttestng接口自动化整体框架设计 <block&#xff1a;表示测试用例块> block后面是 测试用例的名称 ||接口名,该接口名在URL.txt里维护接口 ||get\post&#xff1a;表示请求的方法 get_1\2\3\4&#xff1a;代表加密 get: …

【保姆级教程】如何拥有GPT?(Proton邮箱版)

OnlyFans 订阅教程移步&#xff1a;【保姆级】2024年最新Onlyfans订阅教程 Midjourney 订阅教程移步&#xff1a; 【一看就会】五分钟完成MidJourney订阅 GPT-4.0 升级教程移步&#xff1a;五分钟开通GPT4.0 如果你需要使用Wildcard开通GPT4、Midjourney或是Onlyfans的话&am…

排序算法之选择排序介绍

目录 算法简介 算法描述 代码实现 算法简介 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理&#xff1a;首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素…

22个常用数据结构实现与原理分析

前两天V哥跟一个老学员吃饭&#xff0c;聊起面试大厂的事&#xff0c;说为啥大厂面试第一看基本条件&#xff0c;第二就是考数据结构算法&#xff0c;其他高阶的内容会比较少&#xff0c;最近V哥也在跟大厂对接这一块业务&#xff0c;了解得多一些&#xff0c;这是因为考察基本…

Altair HyperStudy 多学科设计研究软件,帮助设计师探索和优化产品的性能和鲁棒性

HyperStudy 是一款多学科设计研究软件&#xff0c;可帮助设计师探索和优化产品的性能和鲁棒性。 HyperStudy 通过结合新型数学方法、预测性建模和数据挖掘功能的自动化流程&#xff0c;可智能、高效地探索任何系统模型的设计空间。在考虑多物理场约束的同时&#xff0c;引导用…

业务服务:redisson

文章目录 前言一、配置1. 添加依赖2. 配置文件/类3. 注入redission3. 封装工具类 二、应用1. RedisUtils工具类的基本使用 三、队列1. 工具类2. 普通队列3. 有界队列&#xff08;限制数据量&#xff09;4. 延迟队列&#xff08;延迟获取数据&#xff09;5. 优先队列&#xff08…

使用分治法解决矩阵乘法的Strassen算法及C代码示例

使用分治法解决矩阵乘法的Strassen算法及C代码示例 一、背景与意义二、分治法与矩阵乘法二、Strassen算法的基本思想三、Strassen算法的具体步骤四、Strassen算法的C代码实现五、Strassen算法的时间复杂度分析六、Strassen算法的优缺点及改进七、结论 一、背景与意义 在计算机…