【学习】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.rhkb.cn/news/280835.html

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

相关文章

内网横向1

IPC$详解 IPC( Internet Process Connection) 共享 “ 命名管道 ” 的资源 , 是为了实现进程间通信而开放的命名管道。 IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用 通过 ipc$ ,可以与目标机器建立连…

C++ 模板入门详解

目录 0. 模板引入 1.函数模板 1. 函数重载的缺点 2. 函数模板的概念和格式 2. 函数模板的实例化 2.1 隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2.2 显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 2.3 函数模板参数的匹…

Linux常用命令之文件权限类

1.1 Linux的文件属性 在Linux里使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组。 以-开头&#xff1a;普通文件 以d开头&#xff1a;目录 以l开头&#xff1a;链接 以c开头&#xff1a;字符类型的设备文件(例如&#xff1a;鼠标、键盘&#xff0c;他们输入…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

区域规划(Regional Planning)的学习笔记

目录 一、概念题 1.区域的概念、类型、特性 2.区域分析的概念、主要内容 3.自然环境、自然资源的概念 4.区域自然资源评价的内容 5.可持续发展理论定义 6.经济增长、经济结构定义 7.产业结构概念 8.人口增长分析的含义、指标 9.技术进步概念、类型 10.技术进步对区域…

javaSwing推箱子游戏

一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力&#xff0c;使人们暂时忘却生活当中的烦恼&#xff0c;增强人们的逻辑思维能力&#xff0c;游戏的艺术美也吸引着越来越多的玩家和厂商&#xff0c;寓教于乐&#xff0c;在放松人们心情的同时还可以活跃双手。在人类…

【算法】差分算法(空调)

可用于求一个数组要变为另一个数组最少要改变多少次的次数 Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N 个牛栏&#xff0c;编号为 1…N&#xff0c;每个牛栏里有一头…

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术&#xff0c;蓝牙主要负责位置服务&#xff0c;LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”&#xff0c;是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术&#xff0c;抗干…

Java版直播商城免 费 搭 建:电商、小程序、三级分销及免 费 搭 建,平台规划与营销策略全掌握

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

吴恩达机器学习-可选实验室:简单神经网络(Simple Neural Network)

在这个实验室里&#xff0c;我们将使用Numpy构建一个小型神经网络。它将与您在Tensorflow中实现的“咖啡烘焙”网络相同。 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) import tensorflow as tf from lab_utils_common impor…

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如何让intellij idea支持一个目录多个springtboot或maven项目

一、背景 有的时候&#xff0c;我们希望intellij idea 能像 eclipse 一样有workspace的概念&#xff0c;能在一个workspace目录里面引入多个项目&#xff0c;如&#xff1a; 我们有项目a、项目b&#xff0c;现在的项目几乎都是springboot项目&#xff08;即maven项目&#xf…

Mac读写NTFS格式硬盘的神器2024免费版Tuxera NTFS for Mac

Mac读写NTFS格式硬盘的神器——Tuxera NTFS for Mac&#xff0c;让你的数据传输更加快捷&#xff01;轻松解决Mac与Windows之间的数据传输难题&#xff0c;Tuxera NTFS for Mac是你不可错过的选择&#xff01; 随着科技的不断发展&#xff0c;我们的生活中越来越多的设备需要进…

GIS设计与开发的学习笔记

目录 一、简答题 1.GeoDatabase数据模型结构类型与四种关系。 2.组件式GIS的基本思想是什么&#xff1f; 3.请简述创建空间书签的实现逻辑。 4.请问与地理要素编辑相关的类有哪些&#xff1f;&#xff08;列举至少五个类&#xff09; 5.利用ArcGIS Engine提供的栅格运算工…

gitLab server version 13.12.1 is not supported

拉代码的时候&#xff0c;报的这个错&#xff0c;实际上就是因为gitLab 版本太低了&#xff0c;这里不准备升级版本&#xff0c;打算继续使用账号密码来拉取代码 在idea已经安装的插件中&#xff0c;去掉gitlab插件&#xff0c;如下&#xff1a; 之后再拉取代码&#xff0c;就…

多进程数据库不适合作为hive的元数据库

简介 “今天发现一个比较奇怪的现象&#xff0c;因为博主不熟悉mysql&#xff0c;所以在安装hive的使用了postgresql作为hive的元数据库&#xff0c;在测试几个连接工具对hive进行链接&#xff0c;后面再测试的时候发现链接不上了&#xff0c;并且报错日志如下&#xff1a;” …

HTTPS证书是什么?多少钱?

HTTPS证书&#xff0c;其实就是SSL证书或者TLS证书&#xff0c;它就像是个网络保安&#xff0c;专门保护你的网站和用户浏览器之间的聊天内容不被坏人偷听或者改掉。当你给网站装上有效的HTTPS证书后&#xff0c;网址前面就会出现"https://"&#xff0c;旁边可能还会…

【Linux第三课-基础开发工具的使用】yum、vim、gcc/g++编译器、gdb、Make/Makefile编写、进度条程序、git命令行简单操作

目录 yum - 软件包管理器快速认识yum快速使用yumyum搜索yum安装yum卸载 yum的周边 - yum的整个生态问题 vim快速介绍vimvim的模式命令模式插入模式低行模式 常见模式 -- 命令、低行命令模式 -- 光标的移动命令模式 -- 复制粘贴、剪贴、删除命令模式 -- 小写/大写替换模式命令模…

linux命令(二)

环境变量 在这里我说一下linux的环境变量 windows的环境变量大家应该都用的很熟吧&#xff0c;在这里说一下linux怎么查看以及设置环境变量 首先是查看环境变量 export这就会列出来所有的环境变量 既然能看到环境变量&#xff0c;那如何进行设置呢 首先先试试echo $PATH看看…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…