Self-study Python Fish-C Note15 P52to53
函数 (part 5)
本节主要讲函数文档、类型注释、内省、高阶函数
函数文档、类型注释、内省 (P52)
函数文档
函数是一种代码封装的方法,对于一个程序来说,函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的,更需要关注的是函数的接口以及执行后的结果。要学会去阅读开发手册和函数文档,以快速的融入一个项目
在 python 中,我们可以使用 help()
函数,快速的查看到一个函数的使用文档:
help(print)
Help on built-in function print in module builtins:print(...)print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)Prints the values to a stream, or to sys.stdout by default.Optional keyword arguments:file: a file-like object (stream); defaults to the current sys.stdout.sep: string inserted between values, default a space.end: string appended after the last value, default a newline.flush: whether to forcibly flush the stream.
# 详解:
# Help on built-in function print in module builtins:# print(...)
# print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) # 展示了 print 函数的原型# Prints the values to a stream, or to sys.stdout by default. # 函数的功能介绍
# Optional keyword arguments: # 各个参数的类型及作用
# file: a file-like object (stream); defaults to the current sys.stdout.
# sep: string inserted between values, default a space.
# end: string appended after the last value, default a newline.
# flush: whether to forcibly flush the stream.
如何创建函数文档,使用 """
:
def exchange(dollar, rate=6.32):"""功能:汇率转换,美元->人民币参数:·dollar 美元数量·rate 汇率,默认值是 6.32 (2022-03-08)返回值:·人民币数量"""return dollar * rate
exchange(20)
126.4
help(exchange)
Help on function exchange in module __main__:exchange(dollar, rate=6.32)功能:汇率转换,美元->人民币参数:·dollar 美元数量·rate 汇率,默认值是 6.32 (2022-03-08)返回值:·人民币数量
注意:函数文档一定是要在函数的最顶部的。
类型注释
示例:
比如以下函数,作者希望调用者传入到a
参数中的类型是字符串类型,b
参数的类型是整数类型,这个函数的返回值将是一个字符串类型。
def func(a:str,b:int) -> str:return a*b
func(a='n',b=3)
'nnn'
但是这并不是强制的。Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。(即并不是设置类型后像 java 那样的强类型定义语言了)。如:
func(3,5)
15
如果我们要设置默认参数:
def func(a:str='e',b:int=5) -> str:return a*b
func()
'eeeee'
如果说我们期待的参数类型是列表,甚至一个整数列表(所有值都是整数的列表)
def func(a:list,b:int=3) -> list:return a*b
func([1,2,3])
[1, 2, 3, 1, 2, 3, 1, 2, 3]
def func(a:list[int],b:int=3) -> list:return a*b
func([1,2,3])
[1, 2, 3, 1, 2, 3, 1, 2, 3]
映射类型也可实现,比如我们期待的字典的键是字符串,而值是整数
def func(a:dict[str,int],b:int=3) -> list:key = list(a.keys())*bv = list(a.values())*bres=key+vreturn res
func({"a":1,'b':2,'c':3})
['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 1, 2, 3, 1, 2, 3, 1, 2, 3]
如果我们想让python帮我们做一下检测,可以使用 Mypy
模块
内省
在程序运行的时候能够进行自我检测的一种机制,称之为内省或自省
Python 是通过一些特殊的属性来实现内省的:
求知一个函数的名字
exchange.__name__
'exchange'
求知一个函数的类型注释
func.__annotations__
{'a': dict[str, int], 'b': int, 'return': list}
查看函数文档
exchange.__doc__
'\n 功能:汇率转换,美元->人民币\n 参数:\n ·dollar 美元数量\n ·rate 汇率,默认值是 6.32 (2022-03-08)\n 返回值:\n ·人民币数量\n '
print(exchange.__doc__)
功能:汇率转换,美元->人民币参数:·dollar 美元数量·rate 汇率,默认值是 6.32 (2022-03-08)返回值:·人民币数量
高阶函数 (higher-order function) (P53)
当一个函数接收另一个函数作为参数的时候,那么这个时候这种函数就叫高阶函数
其实在前面的装饰器那一节我们就碰到过高阶函数
# 前面装饰器的例子
import time
def time_master(func):def call_func():print('start')start = time.time()func()stop = time.time()print('stop')print(f'In total we used {(stop-start):.2f} second')return call_funcdef myfunc():time.sleep(2)print('Hi')myfunc = time_master(myfunc)
myfunc()
start
Hi
stop
In total we used 2.00 second
在这里 time_master()
把 myfunc()
作为参数使用,time_master()
就是一个高阶函数。
Pyhton 中常见的高阶函数有 map
, filter
, 除此外min
, max
, salty
也可以算是高阶,因为他们有一个 key
参数接收的就是一个函数对象。
functools
模块
Python 中收集实用的一些高阶函数以及装饰器的模块
reduce()
函数
reduce()
函数有两个参数,第一个参数是一个函数,第二个参数是一个可迭代对象。
def add_f(a,b):return a+b
import functools
functools.reduce(add_f, [1,2,3,4,5])
15
这里 reduce
的作用就是将可迭代对象中的元素依次传递到第一个参数指定的函数中,最终返回累积的结果。
其实就相当于:
add_f(add_f(add_f(add_f(1,2),3),4),5)
15
reduce()
函数的第一个参数是一个函数,自然也可以是 lambda 表达式。比如计算10的阶乘:
functools.reduce(lambda x,y:x*y, range(1,11))
3628800
偏函数
偏函数是指对指定的函数进行二次包装,通常是对现有的函数部分参数预先绑定,从而得到一个新的函数,则该函数称之为偏函数。
偏函数通过 functools
里的 partial
来实现
偏函数的作用就是将一个函数的多个参数给拆分多次进行传递。如:
square = functools.partial(pow,2)
print(square(2))
print(square(3))
print(square(5))
4
8
32
cube = functools.partial(pow,3)
print(cube(2))
print(cube(3))
print(cube(5))
9
27
243
和我们之前讲到闭包一样实现这个功能,其实这个偏函数的实现原理就是闭包。
@wraps
我们回到前面装饰器 time_master
和 myfunc
的例子:
def time_master(func):def call_func():print('start')start = time.time()func()stop = time.time()print('stop')print(f'In total we used {(stop-start):.2f} second')return call_func@time_master
def myfunc():time.sleep(2)print('Hi')myfunc()
start
Hi
stop
In total we used 2.01 second
但是这里有一个副作用,调用myfunc.__name__
会得到 'call_func'
而不是 myfunc
:
myfunc.__name__
'call_func'
装饰器其实是一个语法糖,代码其实相当于:
def time_master(func):def call_func():print('start')start = time.time()func()stop = time.time()print('stop')print(f'In total we used {(stop-start):.2f} second')return call_funcdef myfunc():time.sleep(2)print('Hi')myfunc = time_master(myfunc)
myfunc()
start
Hi
stop
In total we used 2.01 second
由于闭包的设计,调用 myfunc
函数其实是调用了 time_master
函数,然后传入 myfunc
作为其参数。而调用 time_master
函数其实是调用 call_func
函数。所以当使用 name
属性内省的时候,就是 call_func
了。
其实实际运用的时候影响不大,但是如果想纠正这个问题,可以用 @wraps
装饰器来装饰装饰器。
def time_master(func):@functools.wraps(func)def call_func():print('start')start = time.time()func()stop = time.time()print('stop')print(f'In total we used {(stop-start):.2f} second')return call_funcdef myfunc():time.sleep(2)print('Hi')myfunc = time_master(myfunc)
myfunc()
start
Hi
stop
In total we used 2.00 second
myfunc.__name__
'myfunc'
# 或者装饰器的形式
def time_master(func):@functools.wraps(func)def call_func():print('start')start = time.time()func()stop = time.time()print('stop')print(f'In total we used {(stop-start):.2f} second')return call_func@time_master
def myfunc():time.sleep(2)print('Hi')myfunc()
start
Hi
stop
In total we used 2.01 second
myfunc.__name__
'myfunc'
附言:
题目:Self-study Python Fish-C Note-15 P52-P53
本文为自学B站上鱼C的python课程随手做的笔记。一些概念和例子我个人为更好的理解做了些查询和补充
因本人水平有限,如有任何问题,欢迎大家批评指正!
原视频链接:https://www.bilibili.com/video/BV1c4411e77t?p=8
相关文章:
Self-study Python Fish-C Note15 P52to53
函数 (part 5) 本节主要讲函数文档、类型注释、内省、高阶函数 函数文档、类型注释、内省 (P52) 函数文档 函数是一种代码封装的方法,对于一个程序来说,函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的,更需要关注的…...

Java小白入门到实战应用教程-异常处理
Java小白入门到实战应用教程-异常处理 前言 我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况,它能打断了正常的程序执行流程。 而异常处理是一项至关重要的技术,它使得程序能够优雅地处理运行时错误,避免…...

使用Anaconda安装多个版本的Python并与Pycharm进行对接
1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示,我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单,直接安装即可: 3、设置conda.exe的…...

android系统中data下的xml乱码无法查看问题剖析及解决方法
背景: Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下: 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的,这些syste…...
MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX.语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Python数据可视化利器:Matplotlib详解
目录 Matplotlib简介安装MatplotlibMatplotlib基本用法 简单绘图子图和布局图形定制 常见图表类型 折线图柱状图散点图直方图饼图 高级图表和功能 3D绘图热图极坐标图 交互和动画与其他库的集成 与Pandas集成与Seaborn集成 常见问题与解决方案总结 Matplotlib简介 Matplotli…...

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)
2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda: 大家可以根据自己的网络情况从下面的地址下载: miniconda官网地址:https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…...
介绍rabbitMQ
RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),主要用于在不同的应用程序之间进行异步通信。以下是关于RabbitMQ的详细介绍: 一、基本概念 消息中间件:RabbitMQ是一个消息中间件&#x…...

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
关键词:深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升,且有可能演变成严重且不可逆转的状况,这不仅对家庭幸福构成威胁,还带来巨大的经济负担。当前的研究着重指出&#x…...
VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发
在VB.NET中,利用Windows Presentation Foundation (WPF) 进行图形界面开发是一个强大的选择,因为它提供了丰富的UI元素、动画、数据绑定以及样式和模板等高级功能。以下是在VB.NET项目中使用WPF进行图形界面开发的基本步骤: 1. 创建一个新的…...

Go语言标准库中的双向链表的基本用法
什么是二分查找区间? 什么是链表? 链表节点的代码实现: 链表的遍历: 链表如何插入元素? go语言标准库的链表: 练习代码: package mainimport ("container/list""fm…...

手机游戏录屏软件哪个好,3款软件搞定游戏录屏
在智能手机普及的今天,越来越多的人喜欢在手机上玩游戏,并希望能够录制游戏过程或者分享游戏技巧。然而,面对市面上众多的手机游戏录屏软件,很多人可能会陷入选择困难。究竟手机游戏录屏软件哪个好?在这篇文章中&#…...
【力扣】4.寻找两个正序数组的中位数
题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…...

【C++】初识面向对象:类与对象详解
C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…...

知识图谱学习总结
1 知识图谱的介绍 知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识,使信息资源更易于计算、理解以及评价,并能实现知识的快速响…...
2021-10-23 51单片机LED1-8按秒递增闪烁
缘由51单片机,八个LED灯按LED1亮1s灭1s,LED1亮2s 灭2s以此类推的方式亮灭-编程语言-CSDN问答 #include "REG52.h" sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_…...

在Linux中宏观的看待线程
线程一旦被创建,几乎所有的资源都是被所有的线程共享的。线程也一定要有自己私有的资源,什么样的资源应该是线程私有的? 1.PCB属性私有 2.要有一定的私有上下文结构 3.每个线程都要有独立的栈结构 ps -aL ##1. Linux线程概念 ###什么是线程…...
提示libfakeroot.so或libfakeroot-sysv.so出错处理方法
在RK3588 Buildroot SDK里面,uboot和kernel使用的是prebuild目录下的交叉编译链,而buildroot和APP编译则使用Buildroot生成的交叉编译链来编译(如:位于buildroot/output/rockchip_rk3588/host目录为交叉编译工具链目录)…...

【计算机网络】什么是socket编程?以及相关接口详解
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...