语言基础篇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兼容性...

骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?
骨传导和入耳式这两种耳机虽然都存在一定的危害,但是入耳式耳机对人体的危害要更大一点。 入耳式耳机直接塞进耳朵这种佩戴方式,会阻塞外部声音的进入,长时间使用可能会导致耳道感染,还可能对听力造成损伤,而骨传导耳…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...