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编程?以及相关接口详解
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
项目研究:使用 LangGraph 构建智能客服代理
概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具,可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪,并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中,…...
