Day 08 python学习笔记
函数
作用域
作用域:变量的访问权限
全局变量与局部变量
声明在函数外边的变量----全局变量 ----》全局作用域
函数内部的变量------局部变量 ----》局部作用域
顶格创建的函数也是全局的
例:
a = 100def test_01():a = 0b = 110print(a)print(b)test_01() #都是局部变量里的
print(a) #全局变量的a
print(b) #报错,因为b变量是局部变量,无访问权限结果:
0
110
100
Traceback (most recent call last):File "D:python\Day08\代码\02-函数中变量的作用域.py", line 19, in <module>print(b)
NameError: name 'b' is not defined
注意:局部的东西,一般都是局部自己访问使用的
但全局变量都可访问
例:
a = 100def test_02():print(a)test_02()结果:
100
扩展:
函数内部可以使用全局变量但是无法修改全局变量
例:
a = 100def test_03():a += 100 #报错,函数内部可以使用全局变量但是无法修改全局变量print(a)test_03()结果:
Traceback (most recent call last):File "D:\python\Day08\代码\02-函数中变量的作用域.py", line 17, in <module>test_03()File "D:\python\Day08\代码\02-函数中变量的作用域.py", line 13, in test_03a += 100
UnboundLocalError: local variable 'a' referenced before assignment
如果要进行修改,使用globle关键字
例:
a = 100def test_03():# 函数内部可以使用全局变量但是无法修改全局变量,如果要进行修改,使用globle关键字global a #添加修改全局变量的权限a += 100print(a)test_03()
函数注释
函数内部:
'''
xxx
'''
例:
def sum_01(a,b):return a+bsum_01(1,2)
将鼠标拖到sum_01(1,2)上,它会显示如下图所示,下方会显示这个函数的一些注释

而我们如果要修改注释
方法如下:
- 在函数内部输入'''(解释器会自动给你在后面补充三个''')
- 直接按回车键
- 将出现的注释删除,写上你想展示的注释
例:



展示

扩展:
我们也可以直接按住ctrl键然后将鼠标移到函数上,然后点击,可以转到注释
例:round()
例round() 我定义在全局中


值传递与引用传递
值传递:在传递参数时,仅仅是把值拷贝一份传递给参数的函数,变量的值不发生变化
例:
def test01(x, y):x += 10y += 20print(x, y)a = 10
b = 20
test01(a, b) #只是拷贝
print(a) #原变量的值不发生变化
print(b)结果:
20 40
10
20
引用传递:在传递参数的时候,传地址,函数形参获取的值,也是同一块内存
例:
def test02(nums):print(id(nums)) #id()用来查看地址,后面会讲nums.append(10)nums.append(100)print(nums)list1 = [1, 2, 3]
print(id(nums))
test02(list1) #传地址,函数形参获取的值,也是同一块内存
print(list1)结果:
2273748378816
2273748378816 #可以看出不是拷贝,是同一个地址
[1, 2, 3, 10, 100]
[1, 2, 3, 10, 100]
匿名函数
匿名函数:python中将函数作为参数传到另外一个函数里边去
python中函数参数的数据类型:只要是对象就可以
python :函数本身就是一个对象
例:
def compute(a,b):return a+bdef test01(fn):a = fn(1,2)print(a)test01(compute) #注意:不能写成test01(compute())#compute()是函数调用,不是对象了,返回的要么是return值,要么是None结果:
3
lambda匿名函数
匿名函数:临时使用一次
python中,存在函数作为参数传递给函数,并且不想被外界访问,而且参数函数足够简单,即可以定义为匿名函数(lambda 表达式)
格式:
lambda 传入参数 :函数体 (函数体只能写一行,不能写多行)lambda [a,b] : 代码块 ([ ]包起来代表可有可无,可能无传入参数)
例:

例:
与上面效果相同
def test01(fn):a = fn(1,2)print(a)test01(lambda a, b: a + b)结果:
3
偏函数:
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下:
int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换:
>>> int('12345')
12345
但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:

>>> int('12345', base=8) #注意前面需要加''
5349 #将8进制‘12345’转换为10进制
>>> int('12345', 16)
74565 #将16进制‘12345’转换为10进制
假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:
def int2(x, base=2): #缺点是base=2可以改,不固定
return int(x, base)
这样,我们转换二进制就非常方便了:
>>> int2('1000000')
64
>>> int2('1010101')
85
functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:
>>> import functools #导入模块(后面会讲)
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
注意到上面的新的int2函数,仅仅是把base参数重新设定默认值为2,但也可以在函数调用时传入其他值:
>>> int2('1000000', base=10)
1000000
最后,创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入:
int2 = functools.partial(int, base=2)
实际上固定了int()函数的关键字参数base,也就是:
int2('10010')
相当于:
kw = { 'base': 2 }
int('10010', **kw)
当传入:
max2 = functools.partial(max, 10)
实际上会把10作为*args的一部分自动加到左边,也就是:
max2(5, 6, 7)
相当于:
args = (10, 5, 6, 7)
max(*args) #求最大值结果:
10
小结:
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
python3.8新特性
声明函数参数类型
在C/C++/JAVA时我们函数传参的时候都是有严格限制参数类型,而我们python则没有
例:
python:
def fun(a,b,c):Java:
public static void fn(int a,double b,String c){}
但是python3.8之后添加了一个限制方法(注:这个限制是非强制的,只是会提醒你)
def add(x: int, y: float): #用来限制传入的参数类型print(x + y)add(1, 1)
add("1","1") #你鼠标放上去会提醒你,但依旧可以执行结果:
2
11def add(x: int, y: float) -> float: #->指向限制返回值的类型print(x + y)return x + yadd(1, 1)
add("1","1")
函数的嵌套
def fun1():b = 20def fun2():pass函数的嵌套,此时的fun2是局部变量.想像成:
#fun2 = def():注意:局部的东西,一般都是局部自己访问使用的
局部变量,就想在外边使用:return
想在外边访问fun2,可以将fun2像变量一样进行返回
return fun2
def fun1():b = 20def fun2():passreturn fun2 #此时我们把函数当做变量进行返回的b1 = fun1() #此时的b1事实上就是函数fun2()
b1()
函数作为返回值:
例:
def lazy_sum(*args):def sum():ax = 0for n in args:ax = ax + nreturn axreturn suma = lazy_sum(1)
print(a)
a = lazy_sum(1)
print(a)结果:
<function lazy_sum.<locals>.sum at 0x000002130129A8C0>#返回一个fun2的函数
<function lazy_sum.<locals>.sum at 0x000002130129B910>
调用一次lazy_sum,返回一个新的函数,即使是相同的参数,两次调用生成的函数也不一样
并且返回的函数可以再调用,即调用内层函数
def fun1():b = 20def fun2(): #fun2 = def(){}print(b)print("222222222")return fun2 #注意:返回函数不要带小括号,有括号是调用a = fun1() #返回fun2的函数
a() #调用fun2函数结果:
20
222222222
函数作为参数进行传递

此时的实参可以是函数
代理模式:函数test_func代理了compute
综上:
- 函数可以作为返回值进行返回
- 函数可以当做参数进行传递
- 函数名本质上就是变量名,指向函数所在的内存地址
闭包
闭包:一个函数嵌套另一个函数,内层函数用到外层函数的局部变量,内层函数即为闭包
def outer():a = 10def inner():print(a)return inner #内层函数inner即为闭包
a = outer()
a()结果:
10
如果内层变量想要更改外部变量的值(直接修改)
例:
def outer():a = 10def inner():a += 1 #报错print(a)return innera = outer()
a()结果:
Traceback (most recent call last):File "D:\python\Day08\代码\09-闭包.py", line 17, in <module>a()File "D:\python\Day08\代码\09-闭包.py", line 11, in innera += 1
UnboundLocalError: local variable 'a' referenced before assignment
我们需要用到关键字nonlocla
nonlocla:内层变量想要更改外部变量的值,
在内层函数添加x的声明:
nonlocal x语法结构和规则:
def func():a = 10def inner():nonlocal aprint("原", a)a += 1print(a)return innerret = func()
ret() #a = 11
ret() #a = 12
#事实上实现了在全局作用域(外层)对局部变量进行更改#局部变量的好处:外界很难更改
#不通过inner去更改a:改不了结果:
原 10
11
原 11
12
闭包:
- 可以让一个变量常驻在内存当中
- 可以避免全局变量被修改
本质:内层函数对外层函数的局部变量的使用,内层函数被称为闭包
相关文章:
Day 08 python学习笔记
函数 作用域 作用域:变量的访问权限 全局变量与局部变量 声明在函数外边的变量----全局变量 ----》全局作用域 函数内部的变量------局部变量 ----》局部作用域顶格创建的函数也是全局的 例: a 100def test_01():a 0b 110print…...
Qt Designer如何安装,打开方式
Qt Designer分为PyQt5 Qt Designer、PySide6 Qt Designer,下面分别介绍各自的安装方式和打开方式 首先,检查是否安装了python,使用cmd打开命令行窗口,输入: python --version若出现python的版本号,则已安…...
《Effective C++》知识点(1)--让自己习惯C++
多年前看过的这本书(侯捷翻译的),忘得差不多了,重温复习一下。 1. 视C为一个语言联邦 C并不只是一个带有一组守则的一体语言;它是从四个次语言组成的联邦(federation)政府,每个次语言都有自己的规约。 次语言说明CC是C的基础&am…...
UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》
前面的文章学习,想必大家都对interface 有了深入了解。大家可不要骄傲哦,俗话说:小心驶得万年船。今天,再给大家介绍一个工作中,不是经常遇到,但是一旦遇到,会让你纠结很久的事情。 前面文章提到,随着验证复杂度的不断增加,interface 的bind 的操作,是必不可少的用法…...
BBR算法的几种状态
BBR(Bottleneck Bandwidth and Round-trip propagation time)算法根据互联网的拥塞行为定义了四种状态:STARTUP、DRAIN、PROBE_BW和PROBE_RTT。下面对每种状态进行详细解释,并说明它们之间的区别: STARTUP(…...
利用jupyter进行分类
Jupyter Notebook是一个非常强大的工具,可以用于各种数据分析和机器学习任务,包括分类问题。在Jupyter Notebook中进行分类通常需要以下步骤: 导入所需的库:首先,你需要导入必要的Python库,例如NumPy、Pand…...
【LeetCode 算法专题突破】滑动窗口(⭐)
文章目录 前言1. 长度最小的子数组题目描述代码 2. 无重复字符的最长子串题目描述代码 3. 最大连续1的个数 III题目描述代码 4. 将 x 减到 0 的最小操作数题目描述代码 5. 水果成篮题目描述代码 6. 找到字符串中所有字母异位词题目描述代码 7. 串联所有单词的子串题目描述代码 …...
按键中断控制LED灯亮灭
EXTI—外部中断/事件控制器 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可…...
YOLOV8目标检测——模型训练
文章目录 1下载yolov8([网址](https://github.com/ultralytics/ultralytics))2用pycharm打开文件3训练自己的YOLOV8数据集4run下运行完了之后没有best.pt文件5导出为onnx文件 本章内容主要解决如何训练自己的YOLOV8模型。 1下载yolov8(网址&a…...
利用dockerfile升级flink的curl
最近Nusses扫出flink镜像有CURL漏洞,才发现要更新到最新版本 8.4.0,笔者当时flink版本为: flink:1.17.1-scala_2.12-java8 官方镜像仓库:https://hub.docker.com/_/flinkapt源 我试了如上2种方法,都不能更新curl到8…...
element 日期选择器禁止选择指定日期前后时间
画圈重点:disabledDate的写法要用箭头函数,不能用普通函数写法,否则this指向就错了,会报 undefined <el-date-picker v-model"time" type"date" value-format"yyyy-MM-dd" :…...
00TD时尚女童睡衣,蕾丝边+蝴蝶结太好看了
甜美又可爱的蕾丝花边加蝴蝶结 真的一下子戳中了我的心巴, 满满的少女风真的很好看, 妥妥的可爱小公主一枚 柔软又亲肤,厚厚的很保暖 睡觉真的很舒服 还有袖口和裤脚都做了松紧设计哟!...
网络基础知识点
osi七层模型: 应用层:提供用户接口,与用户进行交互 表示层:进行数据格式的转换 会话层:建立、维护和验证会话 传输层:保证目标从源到目的地的传输(传输协议和端口号) 网络层&#x…...
力扣每日一题54:螺旋矩阵
题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入&#…...
基于WebRTC的程序因虚拟内存不足导致闪退问题的排查以及解决办法的研究
目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上,没有感知到异常或中断 3.2、Windbg感知到了中断,中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …...
2023年9月青少年软件编程(C 语言) 等级考试试卷(三级)
2023年9月青少年软件编程(C 语言) 等级考试试卷(三级)含答案 1.谁是你的潜在朋友 题目描述 “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你…...
用节点亲和性把 Pod 分配到节点
用节点亲和性把 Pod 分配到节点 当前集群信息: rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…...
GB28181学习(十)——视音频文件下载
要求 SIP服务器接收到媒体接收者发送的视音频文件下载请求后向媒体流发送者发送媒体文件下载命令,媒体流发送者采用RTP将视频流传输给媒体流接收者,媒体流接收者直接将视频流保存为媒体文件;媒体流接收者或SIP服务器可通过配置查询等方式获取…...
2023 年和 2024 年 10 个最佳加密货币趋势
1.熊市低迷 加密货币市场已进入持续数月的长期看跌阶段。尽管 2023 年初出现了一些看涨走势,但大多数领先的加密货币随后都出现了看跌低迷,导致其市值大幅下跌。 此外,持续的熊市可归因于一系列因素,包括宏观经济不确定性、利率…...
0026【Edabit ★☆☆☆☆☆】Convert Hours and Minutes into Seconds
0026【Edabit ★☆☆☆☆☆】Convert Hours and Minutes into Seconds language_fundamentals math Instructions Write a function that takes two integers (hours, minutes), converts them to seconds, and adds them. Examples convert(1, 3) // 3780 convert(2, 0) //…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
Qt学习及使用_第1部分_认识Qt---Qt开发基本流程
前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】
一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下核心特性: 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...
SDU棋界精灵——硬件程序ESP32实现opus编码
一、 音频处理框架 该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节: 1.核心组件 (1) 音频前端处理 (AFE - Audio Front-End) main/components/audio_pipeline/afe_processor.c功能: 声学回声…...
