当前位置: 首页 > news >正文

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_mastermyfunc 的例子:

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目录为交叉编译工具链目录&#xff09…...

【计算机网络】什么是socket编程?以及相关接口详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...