语言基础篇11——函数、函数参数类型、装饰器、生成器
函数
基本结构
def func_name(value):print(f"Hello {value}")return 0func_name("World")
函数参数
参数默认值和五种参数类型
https://docs.python.org/3/glossary.html#term-parameter
参数默认值
带默认值的参数必须在参数列表右边
def func_name(a, b=0):return a + bprint(func_name(1))
位置或关键字参数,positional-or-keyword argument
默认参数类型,传参的时候可以以位置或者关键字形式传递,但位置参数一定在左,关键字参数一定在右
# a、b均为位置或关键字参数,a以位置参数的形式传递,b以关键字参数的形式传递
def func_name(a, b):return a + bprint(func_name(1, b=2))
仅位置参数,positional-only argument
使用/
用于限定其之前的参数为仅位置参数类型
# a、b均为位置参数,c为位置或关键字参数但以位置参数形式传入
def func_name(a, b, /, c):return a + b + cprint(func_name(1, 2, 3))
仅关键字参数,keyword-only argument
使用*
用于限定其之后的参数为仅关键字参数类型
# a、b为位置或关键字参数但以位置参数传入,c为仅关键字参数
def func_name(a, b, *, c):return a + b + cprint(func_name(1, 2, c=3))
可变位置参数,var-positional argument
a、b为仅位置参数,args为可变位置参数,*args将多余的位置参数装包为元组args,args命名任意,习惯上以args作为可变位置参数名
def func_name(a, b, *args):print(a, b, args, type(args)) # 1 2 (3, 4, 5) <class 'tuple'>func_name(1, 2, 3, 4, 5)
可变关键字参数,var-keyword argument
a、b均为位置或关键字参数,但a、b传入形式不同,**kwargs将多余的关键字参数装包为字典kwargs,kwargs命名任意,习惯上以kwargs作为可变关键字参数名
def func_name(a, b, **kwargs):print(a, b, kwargs, type(kwargs)) # 1 2 {'c': 3, 'd': 4, 'f': 5} <class 'dict'>func_name(1, b=2, c=3, d=4, f=5)
注:
-
整体上,参数传入时必然以位置参数或关键字参数的形式传入,通常联合使用
*args
和**kwargs
接受任意参数def func_name(*args, **kwargs):print(args, kwargs)func_name(1, b=2, c=3, d=4, f=5)
-
a、b为位置参数,c、d为位置或关键字参数,e、f为关键字参数
def func_name(a, b, /, c, d, *, e, f):print(a, b, c, d, e, f)func_name(1, 2, 3, d=4, e=5, f=6)
函数返回值
Python基于元组的自动装包和拆包在语法上实现了多个返回值形式,实际仍为一个返回值
def func_name(a, b):return a, ba, b = func_name(1, 1)
print(a, b) # 1 1r = func_name(1, 1)
print(r, type(r)) # (1, 1) <class 'tuple'>
Python函数返回值默认为None,不存在没有返回值的情况
def func_name1():return
print(func_name1()) # Nonedef func_name2():pass
print(func_name2()) # None
匿名函数,lambda表达式
def pow2(n):return n ** 2
print(pow2(10))calc = lambda n: n ** 2
print(calc(10))add = lambda x, y: x + yl = [-2, 4, -9, 4, 7, 8]
print(max(l, key=lambda n: n * n))
闭包函数
- 闭包函数必须有内嵌函数
- 内嵌函数需要引用该嵌套函数上一级中的变量
- 闭包函数必须返回内嵌函数
# 闭包函数通过将函数名作为返回值使得不释放局部变量引用而保留局部变量
# 具有环境变量n的函数power
def nth_power(a):n = a or 1def power(base):return base ** nreturn power_3power = nth_power(3)
print(_3power(2)) # 8
_closure_
def generate_func(start, end):def print_string(name):print(start, name, end)return print_stringhello = generate_func("Hello", "!")
hello('World') # Hello World !
print(hello.__name__) # print_string
print(hello.__closure__) # (<cell at 0x00000215DB0E7E50: str object at 0x00007FF9311F9900>, <cell at 0x00000215DB0E7EE0: str object at 0x00000215DAD18AB0>)
print(hello.__closure__[0].cell_contents) # !
print(hello.__closure__[1].cell_contents) # Hello
print(id(hello)) # 2292892980448bye = generate_func("Bye", ".")
bye('World') # Bye World .
print(bye.__name__) # print_string
print(bye.__closure__) # (<cell at 0x00000215DB0E7DF0: str object at 0x00007FF9311F9BD8>, <cell at 0x00000215DB0E7E20: str object at 0x00000215DACBB4F0>)
print(bye.__closure__[0].cell_contents) # .
print(bye.__closure__[1].cell_contents) # Bye
print(id(bye)) # 2292892978368
global
a = 1def f1():a = 2def f2():global aa = 3print(a) # 全局变量a=3f2()print(a) # 局部变量a=2f1()
print(a) # 全局变量a=3
nonlocal
a = 1def f1():a = 2def f2():nonlocal aa = 3print(a) # 全局变量a=3f2()print(a) # 局部变量a=3f1()
print(a) # 全局变量a=1
装饰器
import timedef outer(func):def inner(*args, **kwargs):t1 = time.perf_counter()res = func(*args, **kwargs)print(time.perf_counter() - t1)return resreturn innerdef add(a, b):time.sleep(1)return a + badd_plus = outer(add)
print(add_plus(1, 2))
# 1.0007887999818195
# 3@outer
def sub(a, b):time.sleep(1)return a - bprint(sub(1, 2))
# 1.000871800002642
# -1
# 装饰器标准模板
# 装饰器函数\装饰器类,以函数作为装饰器\以类作为装饰器
def wrapper():def outer(func):def inner(*args, **kwargs):res = func(*args, **kwargs)return resreturn innerreturn outer@wrapper()
def func_wrapped():passfunc_wrapped()
无参装饰器
# 无参装饰器
def debug(func):def wrapper(*args):print("[DEBUG]: function {}".format(func.__name__))return func(*args)return wrapper@debug
def add(a, b):return a + badd(1, 2)
# [DEBUG]: function add
有参装饰器
# 有参装饰器
def logging(level):def outer_wrapper(func):def inner_wrapper(*args, **kwargs): # 参数在此print("[{}]: function {}".format(level, func.__name__))return func(*args, **kwargs)return inner_wrapperreturn outer_wrapper# @logging(level="DEBUG")相当于先调用函数outer_wrapper=logging(level="DEBUG")得到@outer_wrapper
# @outer_wrapper相当于inner_wrapper=outer_wrapper(func)
# 最终执行inner_wrapper
@logging(level="DEBUG")
def add(a, b, *args):res = a + bfor i in args:res += ireturn resprint(add(1, 2, 3, 4))
# [DEBUG]: function add
# 10
多重装饰器
自上而下,自下而上
def wrapper1(func):def inner1():print("inner1 before")func()print("inner1 after")return inner1def wrapper2(func):def inner2():print("inner2 before")func()print("inner2 after")return inner2def wrapper3(func):def inner3():print("inner3 before")func()print("inner3 after")return inner3@wrapper1
@wrapper2
@wrapper3
def do():print("fun")do()
# inner1 before
# inner2 before
# inner3 before
# fun
# inner3 after
# inner2 after
# inner1 after
生成器,generator
-
生成器函数 生成器表达式
-
含有yield关键字的函数为生成器函数,yield不可与return共用
def generator():a = '123456'for i in a: # 一般写法yield iyield from a # 简写g = generator()
for i in g:print(i)
# 1
# 2
# 3
# 4
# 5
# 6
# 1
# 2
# 3
# 4
# 5
# 6
不给生成器传参
def generator():print("generator1")yield 'a'print("generator2")yield 'b'result = generator()
print(result)
print(result.__next__()) # a
print(result.__next__()) # b
# print(result.__next__()) # StopIteration# 生成器只能遍历一遍元素,获取完毕之后必须重新new
# 而对于列表来说,可以使用for i in l: print(i)遍历多次,但是生成器会报异常
给生成器传参
def generator():print(1)content = yield 'a'print(2, content)content = yield 'b'print(3, content)yieldg = generator()
print(g.__next__())
print(g.send("content1")) # 需要给上一个yield位置传参,第一个需要用__next__,同理最后一个yield无法获取到值,不过可以yield空
print(g.send("content2"))
# 1
# a
# 2 content1
# b
# 3 content2
# None
def tractor():"""拖拉机@return:"""distance = 0second = 0avg_speed = 0while True:d, t = yield avg_speeddistance += dsecond += tavg_speed = distance / secondavg = tractor()
print(avg.__next__()) # 0 摇车,人力启动柴油机
print(avg.send((10, 1))) # 10.0
print(avg.send((12, 0.5))) # 14.666666666666666
print(avg.send((10, 1))) # 12.8
生成器嵌套
def generator():for i in range(4):yield ig = generator()
g1 = (i for i in g)
print(g1, type(g1))
g2 = (i for i in g1)
print(g2, type(g2))
# print(list(g)) # 若此处注释打开你猜会如何
print(list(g1)) # [0, 1, 2, 3]
print(list(g2)) # [] 因为执行的时候g1只是一个能产生[0, 1, 2, 3]的迭代器,并不同于值本身
def add(a, b):return a + bdef nums():for i in range(4):yield ig = nums()
for a in [1, 10]:g = (add(a, b) for b in g) # 生成器表达式,不实际取元素的时候是不会列出元素的
print(list(g)) # [20, 21, 22, 23]print(list((add(1, b) for b in nums()))) # [1, 2, 3, 4]
print(list((add(10, b) for b in nums()))) # [10, 11, 12, 13]
print(list((add(10, b) for b in (add(1, b) for b in nums())))) # [11, 12, 13, 14]
print(list((add(10, b) for b in (add(10, b) for b in nums())))) # [20, 21, 22, 23] 等价,a的值在list时才
相关文章:
语言基础篇11——函数、函数参数类型、装饰器、生成器
函数 基本结构 def func_name(value):print(f"Hello {value}")return 0func_name("World")函数参数 参数默认值和五种参数类型 https://docs.python.org/3/glossary.html#term-parameter 参数默认值 带默认值的参数必须在参数列表右边 def func_nam…...

linux jar包class热部署 工具 arthas安装及使用
在不改变类、方法 的前提下,在方法中对业务逻辑做处理 或 打日志等情况下使用。 建议线上日志调试时使用: arthas安装 1. 下载文件 arthas-packaging-3.7.1-bin.zip https://arthas.aliyun.com 2. 服务器安装arthas 2.1 服务器指定目录下创建目录 c…...

Android studio 调整jar包顺序
第一步:编译jar包,放入lib路径下:如: 第二步:app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步:project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…...

用Qt写的机器视觉绘图工具
一个用QtGraphicsView写的机器视觉绘图工具,支持直线查找,圆拟合,卡尺工具,圆环查找等。底部GraphicsScene可以实时显示相机图像,工具获取图像后通过算法处理图像。 Project是基于Qt的例程项目qdraw改的。...
Spring Boot 打包,将依赖全部打进去
一、背景 spring boot 2.4.4 项目,打包,将依赖全部打进去 二、在pom.xml中引入插件 在项目的 pom.xml 文件中,添加 Maven 插件 spring-boot-maven-plugin,示例如下: <build><plugins><!-- ...其他插件…...

SpringCloud入门实战(十五)分布式事务框架Seata简介
📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…...
MySQL数据库 主从复制与读写分离
读写分离是什么 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要进行读写分离 因…...

Qt day2
目录 1.多态,虚函数,纯虚函数 1.多态性(Polymorphism): 2.虚函数(Virtual Function): 3.纯虚函数(Pure Virtual Function): 将引用作为函数参…...

JavaScript - 好玩的打字动画
效果预览: 🚀HTML版本 <!DOCTYPE html> <html> <head><title>打字动画示例</title><style>.typewriter {color: #000;overflow: hidden; /* 隐藏溢出的文本 */white-space: nowrap; /* 不换行 */border-right: .…...

rpm打包
文章目录 rpm打包 1. rpm打包步骤0)准备工作:安装打包工具rpm-build和rpmdevtools(1)在线安装(2)离线安装 1)创建初始化目录2)准备打包内容3)编写打包脚本 spec文件4&…...

匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!
一、产品介绍 此次发布一款7寸高清全新外壳产品,让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动: 1 表面玻璃盖板使用2.5D立体结构; 2 液晶盖板采用一体黑设计,且液晶屏与触摸板是全贴合结构; …...

华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具
华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 Portainer简介 三、购买云耀云服务器L实例3.1 登录…...
C++并发编程:构建线程安全队列(第一部分:粗粒度锁)
C并发编程:构建线程安全队列(第一部分:粗粒度锁) 引言 在多线程编程中,线程之间的数据共享和通信是一个非常重要的问题。在这篇博客中,我们将讨论如何用C实现一个基础但非常实用的线程安全队列。这个队列…...
C++设计模式-更新中
单例模式 这个类实现了单例模式。单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 在 ConnectionManager 类中,它通过以下方式实现了单例模式: 构造函数 ConnectionManager() 被声明为…...

Hydra工具的使用
目录 Hydra初识 Hydra使用 hydra破解mysql 前言 不固定用户名密码爆破 hydra破解ssh 以用户名为密码登录 hydra破解rdp 将爆破密码的结果输出到文件中 Hydra初识 前言: hydra是一款开源的暴力破解工具,支持多种服务破解原理:使用户…...

Pytorch学习:卷积神经网络—nn.Conv2d、nn.MaxPool2d、nn.ReLU、nn.Linear和nn.Dropout
文章目录 1. torch.nn.Conv2d2. torch.nn.MaxPool2d3. torch.nn.ReLU4. torch.nn.Linear5. torch.nn.Dropout 卷积神经网络详解:csdn链接 其中包括对卷积操作中卷积核的计算、填充、步幅以及最大值池化的操作。 1. torch.nn.Conv2d 对由多个输入平面组成的输入信号…...

水果库存系统(SSM+Thymeleaf版)
不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 文章目录 一、前言二、系统架构与需求分析1、技术栈1.1 后端1.2 前端 2、需求分析 三、设计…...

如何在VueJS应用程序中设置Toast通知
通知是开发者提升应用程序互动性和改善用户体验的强大工具。通过利用通知,开发者可以在用户与应用程序互动的同时,有效地向用户传达重要事件。 通知在应用程序中起着至关重要的作用,可以及时通知用户有关各种操作和事件的信息。它们可以用于通…...

css让元素保持等比例宽高
使用新属性 aspect-ratio: 16/9; 代码示例 <style>div {width: 60%;/* 等比例宽高 */aspect-ratio: 16/9;background-color: red;margin: auto;}</style> </head><body><div></div> </body>示例 aspect-ratio兼容性...

骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?
骨传导和入耳式这两种耳机虽然都存在一定的危害,但是入耳式耳机对人体的危害要更大一点。 入耳式耳机直接塞进耳朵这种佩戴方式,会阻塞外部声音的进入,长时间使用可能会导致耳道感染,还可能对听力造成损伤,而骨传导耳…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...