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

语言基础篇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)

注:

  1. 整体上,参数传入时必然以位置参数或关键字参数的形式传入,通常联合使用*args**kwargs接受任意参数

    def func_name(*args, **kwargs):print(args, kwargs)func_name(1, b=2, c=3, d=4, f=5)
    
  2. 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安装及使用

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

Android studio 调整jar包顺序

第一步&#xff1a;编译jar包&#xff0c;放入lib路径下&#xff1a;如&#xff1a; 第二步&#xff1a;app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步&#xff1a;project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…...

用Qt写的机器视觉绘图工具

一个用QtGraphicsView写的机器视觉绘图工具&#xff0c;支持直线查找&#xff0c;圆拟合&#xff0c;卡尺工具&#xff0c;圆环查找等。底部GraphicsScene可以实时显示相机图像&#xff0c;工具获取图像后通过算法处理图像。 Project是基于Qt的例程项目qdraw改的。...

Spring Boot 打包,将依赖全部打进去

一、背景 spring boot 2.4.4 项目&#xff0c;打包&#xff0c;将依赖全部打进去 二、在pom.xml中引入插件 在项目的 pom.xml 文件中&#xff0c;添加 Maven 插件 spring-boot-maven-plugin&#xff0c;示例如下&#xff1a; <build><plugins><!-- ...其他插件…...

SpringCloud入门实战(十五)分布式事务框架Seata简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…...

MySQL数据库 主从复制与读写分离

读写分离是什么 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要进行读写分离 因…...

Qt day2

目录 1.多态&#xff0c;虚函数&#xff0c;纯虚函数 1.多态性&#xff08;Polymorphism&#xff09;&#xff1a; 2.虚函数&#xff08;Virtual Function&#xff09;&#xff1a; 3.纯虚函数&#xff08;Pure Virtual Function&#xff09;&#xff1a; 将引用作为函数参…...

JavaScript - 好玩的打字动画

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

rpm打包

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

匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!

一、产品介绍 此次发布一款7寸高清全新外壳产品&#xff0c;让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动&#xff1a; 1 表面玻璃盖板使用2.5D立体结构&#xff1b; 2 液晶盖板采用一体黑设计&#xff0c;且液晶屏与触摸板是全贴合结构&#xff1b; …...

华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具

华为云云服务器评测&#xff5c;使用云耀云服务器L实例部署Portainer工具 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 Portainer简介 三、购买云耀云服务器L实例3.1 登录…...

C++并发编程:构建线程安全队列(第一部分:粗粒度锁)

C并发编程&#xff1a;构建线程安全队列&#xff08;第一部分&#xff1a;粗粒度锁&#xff09; 引言 在多线程编程中&#xff0c;线程之间的数据共享和通信是一个非常重要的问题。在这篇博客中&#xff0c;我们将讨论如何用C实现一个基础但非常实用的线程安全队列。这个队列…...

C++设计模式-更新中

单例模式 这个类实现了单例模式。单例模式是一种设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 在 ConnectionManager 类中&#xff0c;它通过以下方式实现了单例模式&#xff1a; 构造函数 ConnectionManager() 被声明为…...

Hydra工具的使用

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

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 卷积神经网络详解&#xff1a;csdn链接 其中包括对卷积操作中卷积核的计算、填充、步幅以及最大值池化的操作。 1. torch.nn.Conv2d 对由多个输入平面组成的输入信号…...

水果库存系统(SSM+Thymeleaf版)

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

如何在VueJS应用程序中设置Toast通知

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

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兼容性...

骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?

骨传导和入耳式这两种耳机虽然都存在一定的危害&#xff0c;但是入耳式耳机对人体的危害要更大一点。 入耳式耳机直接塞进耳朵这种佩戴方式&#xff0c;会阻塞外部声音的进入&#xff0c;长时间使用可能会导致耳道感染&#xff0c;还可能对听力造成损伤&#xff0c;而骨传导耳…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...