学习日志007--python函数 学完再练习练
函数小练习
一、函数的概念
1.定义
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
2.作用
函数能提高应用的模块性,和代码的重复利用率
3.定义
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):"函数_文档字符串"function_suitereturn [expression]
二、参数传递
以下是调用函数时可使用的正式参数类型:
1.位置参数(必备参数)
位置参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
def fun3(name,age,score):print(f"name={name:}\tage={age}\tscore={score}")fun3(score=98.5,name='梨花',age='8848')
fun3(98.5,'梨花',8848)
fun3('梨花','8848',98.5)
结果
name=梨花 age=8848 score=98.5
name=98.5 age=梨花 score=8848
name=梨花 age=8848 score=98.5
调用该函数,你必须传入一个参数,不然会出现语法错误:
Traceback (most recent call last):File "test.py", line 11, in <module>printme()
TypeError: printme() takes exactly 1 argument (0 given)
2.关键字参数
关键字参数:调用函数传递参数时,按照 参数名=值 的方式,传参的顺序可以和定义参数的顺序不一致。
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
下例能将关键字参数顺序不重要展示得更清楚:
def printinfo(name, age):print("Name: ", name)print("Age ", age)return
printinfo(age=50, name="miki")
Name: miki
Age 50
3.默认参数
默认参数:在函数定义时给参数设置默认值,那么在函数调用时,若不传参就是用默认值,若传参就是用传参的值。
下例会打印默认的age,如果age没有被传入:
def printinfo(name, age=35):print("Name:", name)print("Age ", age)returnprintinfo(age=50, name="miki")
printinfo(name="miki")
Name: miki
Age 50
Name: miki
Age 35
4.位置不定长参数
位置不定长参数:在定义函数时参数名前加 * ,也就是def fun( *args ),那么在传参的时候就可以传若干个位置参数。
一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
将参数打包成——元组。
加了星号(*)的变量名会存放所有未命名的变量参数。不定长参数实例如下:
无法同时使用两个位置不定长参数,只有关键字参数能与不定长参数同时使用
def fun5(*num,a,b):print(f"num={num}\ta={a}\tb={b}")fun5('1',3,4,5,[1,2,34,"rev"],a="我是关键字参数a",b="我是关键字参数b")
num=('1', 3, 4, 5, [1, 2, 34, 'rev']) a=我是关键字参数a b=我是关键字参数b
5.关键字不定长参数
关键字不定长参数:在定义函数参数名前加 ** ,也就是 def fun( **kwargs ),那么传参的时候就可以传若干个 关键字参数。
将参数打包成——字典。
def fun7(**kwargs):print(kwargs)
fun7(姓名='张三',学号='10086',成绩=97.5)
d1 = dict(姓名='张三',学号='10086',成绩=97.5)
print(d1)
{'姓名': '张三', '学号': '10086', '成绩': 97.5}
{'姓名': '张三', '学号': '10086', '成绩': 97.5}
6.形参与实参
实参(argument)——全称为"实际参数"是在调用时传递给函数的参数。 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值
形参(parameter)——全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。
1、参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
2、实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
3、实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
4、函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化
三、函数的返回值
1.定义
函数需要先定义后调用,函数体中 return 语句的结果就是返回值。如果一个函数没有 reutrn 语句,其实它有一个隐含的 return 语句,返回值是 None,类型也是 'NoneType'。
2.return 语句的作用
结束函数调用、返回值
3.指定返回值与隐含返回值
指定 return 返回值函数举例
def showplus(x):print(x)return x + 1num = showplus(6)add = num + 2print(add)
6
9
隐含 return None 举例:
def showplus(x):print(x)num = showplus(6)print(num)print(type(num))
6
None
<class 'NoneType'>
4.return 语句位置与多条 return 语句
python 函数使用 return 语句返回 "返回值",可以将其赋给其它变量作其它的用处;
所有函数都有返回值,如果没有 return 语句,会隐式地调用 return None 作为返回值;
一个函数可以存在多条 return 语句,但只有一条可以被执行,如果没有一条 reutrn 语句被执行,同样会隐式调用 return None 作为返回值;
如果有必要,可以显式调用 return None 明确返回一个None(空值对象)作为返回值,可以简写为 return,不过 python 中懒惰即美德,所以一般能不写就不写;
如果函数执行了 return 语句,函数会立刻返回,结束调用,return 之后的其它语句都不会被执行了
def showplus(x):print(x)return x + 1,xprint(x + 1) #该语句会执行么print(showplus(6),type(showplus(6)))
6
6
(7, 6) <class 'tuple'>
5.返回值类型
无论定义的是返回什么类型,return 只能返回单值,但值可以存在多个元素;
return [1,3,5] 是指返回一个列表,是一个列表对象,1,3,5 分别是这个列表的元素;
return 1,3,5 看似返回多个值,隐式地被Python封装成了一个元祖返回
6.函数嵌套
函数有可见范围(内外可见关系),这就是作用域的概念;
内部函数不能被外部直接调用,会抛异常 NameError
def outer():def inner(): print("inner")print("outer")outer()
outer
此时如果调用 outer(),只会执行 print("outer"),因为 inner 虽然在 outer 函数内,但它也是一个函数,函数如果要调用,就必须用 '函数名()' 方式。
def outer():def inner():print("inner")print("outer")inner()outer()
outer
inner
四、递归函数
1.定义
递归函数是一种在其定义中调用自身的函数。在Python中,递归函数可以用来解决那些可以分解为更小相似问题的任务。递归函数的核心在于定义一个明确的结束条件,避免无限递归导致栈溢出。
2.结构
递归函数通常包含三个基本部分:
- 边界条件/基线条件 跳出/结束递归的条件
- 递归返回段 满足结束条件时,返回
- 递归前进段 不满足结束条件时,前进/继续递归
3.优缺点
递归函数的优点在于其定义简单,逻辑清晰。对于某些问题,递归解决方案比非递归解决方案更容易理解和实现。然而,递归函数也有其缺点,包括可能的低效率和栈溢出风险。在Python中,递归深度有限制,通常为1000层,超过这个限制会引发RecursionError。
五、函数中变量的作用域
变量的作用域:是指变量能起作用的范围,根据作用范围大小不同分为全局变量和局部变量。
- 全局变量:定义在函数外,作用范围是整个程序,程序结束时全局变量声明周期结束。
- 局部变量:定义在函数代码块里或者函数的参数里,作用范围是整个函数,函数执行结束时局部变量生命周期结束。
1.作用域的必要性
为啥变量要有作用域呢?
在Python里遇到的内置、局部、全局及自由变量,就是说变量的作用域。
语言区分作用域,是为了复用变量名。引入作用域,相当于给变量划分了各自的“隔离区”,在不同”隔离区“里,查找变量变得很容易。
正是因为有了作用域,我们在函数内才可以随意使用变量名,而不担心其与全局变量、其他函数中的变量冲突——因为这两个作用域是分割的。
2.LEGB规则
在本地空间寻找不到的变量,逐级向上级寻找。
里的LEGB分别指代Local,Enclose,Global和Builtin。
在函数中读取和赋值全局变量,在内嵌函数中读取和赋值自由变量,会有一些不同的地方。
3. nonlocal 和 global
为了解决局部作用域中赋值全局变量和自由变量导致的变成局部变量问题,Python引入关键字 global
和 nonlocal
。
global
x = '我是函数外的x'
def out_fun():global xx = '我是外函数的x'def in_fun():global xx = '我是内函数的x'print(x)in_fun()print(x)
out_fun()
print(x)
我是内函数的x
我是内函数的x
我是内函数的x
x = '我是函数外的x'
def out_fun():# global xx = '我是外函数的x'def in_fun():# global xx = '我是内函数的x'print(x)in_fun()print(x)
out_fun()
print(x)
我是内函数的x
我是外函数的x
我是函数外的x
在嵌套函数中,如果需要修改外部函数的变量,可以使用 nonlocal
关键字。 nonlocal:
def out_fun():x = 111def in_fun():nonlocal xx = '我是内函数的x'print(x)in_fun()print(x)
out_fun()
我是内函数的x
我是内函数的x
六、函数嵌套
函数嵌套允许我们在一个函数内部定义另一个函数,这个内部定义的函数被称为内函数,而包含它的函数被称为外函数。内函数可以访问外函数的变量,这种行为称为作用域链。函数嵌套的优点
定义:
在一个函数的内部 还嵌套定义了 另外一个函数。
外部的我们称之为 外函数,内部的我们称之为 内函数。
def out_fun():print("我是外函数")def in_fun():print("我是内函数")return in_fun()out_fun()
函数嵌套的优点
-
封装:内函数可以作为数据隐藏的一种方式,它不会被外部作用域直接访问。
-
DRY原则:不重复自己。如果多个函数需要执行相似的操作,可以将这些操作封装在一个内函数中,避免代码重复。
-
闭包:通过闭包,可以维持函数的状态,使得函数可以记住某些值,而不需要使用全局变量。
函数嵌套的缺点
-
作用域混乱:如果嵌套过多,可能会导致作用域链混乱,难以追踪变量的来源。
-
性能问题:每次外函数执行时,都会创建一个新的内函数实例,如果不断地调用外函数,可能会导致性能问题。
七、闭包
闭包是一种特殊的函数嵌套,其中内函数引用了外函数的变量,即使外函数的执行已经结束,这些变量仍然可以被内函数访问。闭包常用于创建只有内函数可以访问的私有变量。
def out_fun():print("我是外函数")def in_fun():print("我是内函数")return in_funout_fun()()
我是外函数
我是内函数
定义
什么是闭包函数?——如果内函数中使用了外函数的局部变量,并且外函数把内函数返回的过程就叫闭包。
形成闭包的条件:
- 函数嵌套
- 将内函数作为返回值返回
- 内函数必须使用外函数的局部变量
作用域:
def outer(): a=1print('我是外层函数')def inner(): a=10print('我是内层函数')print('内层函数打印',a)return inner #
f=outer()
f()
在内层函数中又有a=10,此时并不是改变的外层函数中的a,而是在内层函数中定义的新变量,是两个不同的东西。从结果也能看出来。这就是作用域的问题。
内层函数中调用的变量首先会从内层函数中找,找不到就去外层函数中找,再找不到就到函数外代码中找,再找不到就到内置的模块中找,最后还是找不到,就报错。
在内层函数中修改外层函数中的变量
在内层函数中修改外部函数中的变量a,此时会报错中的变量冲突——因为这两个作用域是分割的。
def outer():a=1print('我是外层函数')def inner():a+=10print('我是内层函数')print('内层函数打印',a)return inner
f=outer()
f()
我是外层函数
Traceback (most recent call last):File "C:\Users\31284\OneDrive\Desktop\PYTHON\day6\1.py", line 355, in <module>f()File "C:\Users\31284\OneDrive\Desktop\PYTHON\day6\1.py", line 350, in innera+=10^
UnboundLocalError: cannot access local variable 'a' where it is not associated with a value
如果想修改外部函数中的变量,必须加一个nonlocal的声明,修改如下。这和在函数中修改全局变量,加global 有异曲同工之妙
def outer():a=1print('我是外层函数')def inner():nonlocal a a+=10print('我是内层函数')print('内层函数打印',a)return inner
f=outer()
f()
我是外层函数
我是内层函数
内层函数打印 11
函数小练习
相关文章:

学习日志007--python函数 学完再练习练
函数小练习 一、函数的概念 1.定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 2.作用 函数能提高应用的模块性,和代码的重复利用率 3.定义 函数代码块以 def 关键词开头,后接函数标识符…...

DOM操作和事件监听综合练习——轮播图
下面制作一个如下图所示的轮播图(按Enter键可以控制轮播的开启和关闭,或者点击按钮“第几张”即可跳转到第几张): 下面是其HTML和CSS代码(还没有设置轮播): <!DOCTYPE html> <html …...

nodejs:下载,安装,系统环境配置,更换镜像
下载 地址:https://nodejs.org/zh-cn/download/prebuilt-installer 安装包 开始安装 安装完成 配置环境变量 将原来的用户变量-> Path D:\nodejs\node_global 【系统变量】 添加Path–>变量名:NODE_PATH-> 变量值:D: \…...

【Django】视图函数
【Django】视图函数 视图函数的本质是Python中的函数,视图函数负责处理用户的请求并返回响应,该响应可以是网页的HTML内容、重定向、404错误、XML文档、图像或者任何东西,一般在应用中的views.py编写,示例代码如下: …...

MySQL查询-补充
数据准备: -- 部门表 create table dept(deptno int primary key, -- 部门编号 主键:唯一,非空dname varchar(14), -- 部门名称loc varchar(13) -- 部门地址 );insert into dept values (10,accounting,n…...

【Python Tips】多个条件判断——一种更加简洁清晰的写法
一、引言 在python写条件判断 if 语句时,有时会遇到多种条件的真假判断考虑,比如要同时考虑A和B两个变量的True or False,只有当两者都为真,或都为假,或任意为真为假,再继续处理。此时如果用 if,…...

【Vue】简易博客项目跟做
项目框架搭建 1.使用vue create快速搭建vue项目 2.使用VC Code打开新生成的项目 端口号简单配置 修改vue.config.js文件,内容修改如下 所需库安装 npm install vue-resource --save --no-fund npm install vue-router3 --save --no-fund npm install axios --save …...

【HarmonyOS】PixelMap转化为Uri
【HarmonyOS】PixelMap转化为Uri 问题背景 鸿蒙中的PixelMap类型,其实类似于Android和IOS中的bitmap,是对图片数据信息进行描述的一种逻辑运算使用的图片类型。 而鸿蒙中的Uri类型,本质其实是带file头的文件存储地址,是用来指向…...

【架构论文-2】架构设计中存在的问题和改进方向
一、性能优化相关 当前情况 在高负载情况下,系统的响应时间出现了一定程度的延迟。特别是在业务高峰期,大量并发请求导致部分关键业务模块的处理效率降低,影响了用户体验。改进方向 计划引入性能分析工具对系统进行全面的性能剖析࿰…...

go语言中的结构体含义和用法详解
在Go语言中,结构体(struct)是一种聚合数据类型,可以将多个不同类型的数据组合成一个更复杂的类型。结构体类似于面向对象编程中的“类”,但是Go语言没有类和继承的概念,而是通过结构体和接口实现面向对象编程的特性。 1. 结构体的定义 结构体是一组字段(field)的集合…...

985研一学习日记 - 2024.11.8
一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。 日常 1、起床 2、健身 3、LeetCode刷了2题 买卖股票的最佳时机 将最大利润拆分为每天的利润之和,仅仅收集每天的正利润…...

编写一个基于React的聊天室
前言 此前已经编写了一版后端的im,此次就用其作为服务端,可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…...

[前端]NodeJS常见面试题目
什么是非阻塞 I/O? Node.js 如何实现非阻塞 I/O? 非阻塞 I/O 是一种编程模式,它允许 I/O 操作(如读取文件、网络请求等)在执行时不阻塞程序的其余部分。换句话说,当一个 I/O 操作发起后,程序可以立即继续执行其他任…...

【实测可用】Sublime Text4 4180 windows 已测可用
------------------测试时间2024年11月7日------------------- 打开浏览器进入网站: 点击进入修改网站打开sublime text4安装目录选择文件sublime_text.exe搜索80 79 05 00 0f 94 c2更改为c6 41 05 01 b2 00 90(第一个匹配到的)保存文件命名为sublime_text.exe并…...

JAVA日期加减运算 JsonObject 转换对象List
1.用java.util.Calender来实现 Calendar calendarCalendar.getInstance(); calendar.setTime(new Date());System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//今天的日期calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DAY_OF_MONTH)1);//让日期加1 Sy…...

在 PostgreSQL 中,重建索引可以通过 `REINDEX` 命令来完成
在 PostgreSQL 中,重建索引 在 PostgreSQL 中,重建索引可以通过 REINDEX 命令来完成。 重建索引的主要目的是提高查询性能,尤其是在数据频繁更新的情况下。以下是重建索引的基本语法和示例: 基本语法 REINDEX INDEX index_name…...

SQL相关常见的面试题
SQL(Structured Query Language)是数据库管理中不可或缺的一部分,因此在技术面试中经常会被问到与 SQL 相关的问题。以下是一些常见的 SQL 面试题及其答案。 基础概念 什么是 SQL? SQL 是一种用于管理和处理关系型数据库的标准语…...

Vue数据响应式原理
前言 Vue是一个结构的框架,也就是 数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新 响应式实现 基于发布订阅模式和数据劫持实现 1.发布订阅模式:vue使用发布订阅模式来实现数据变动的通知和更新 2…...

Electron + Vue3 开发桌面应用+附源码
什么是 Electron? Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序的框架。它由 GitHub 开发并维护,允许开发者使用现代 Web 技术创建原生应用程序。Electron 结合了 Chromium 渲染引擎和 Node.js 运行时环境,使得开发…...

Webserver(5.2)网页服务器框架
目录 网页服务器服务器编程基本框架两种高效的事件处理模式reactor模式proactor模式同步IO模拟Proactor模式 网页服务器 接收、存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应。 Web服务器底层是基于tcp协议的,因为要保证数据安全。…...

股指期货交易中,如何应对震荡行情?
在股指期货交易中,趋势和震荡是市场波动的两种基本形态。然而,对于许多交易者来说,如何在趋势交易中有效应对震荡行情,却是一个令人头疼的问题。本文将结合相关链接内容,为您详细解读期货交易中如何应对震荡行情。 一…...

理想汽车Android面试题及参考答案
请解释一下 Android 中的 Handler 是如何工作的 在 Android 中,Handler 主要用于在不同线程之间进行通信,特别是在主线程(UI 线程)和工作线程之间。 Handler 是基于消息队列(MessageQueue)和 Looper 来工作…...

【数据集】【YOLO】【目标检测】口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程!
数据集介绍 【数据集】口罩佩戴检测数据集 1971 张,目标检测,包含YOLO/VOC格式标注。 数据集中包含1种分类:{0: face_mask},佩戴口罩。 数据集来自国内外图片网站和视频截图。 检测场景为城市街道、医院、商场、机场、车站、办…...

前端将后端返回的文件下载到本地
vue 将后端返回的文件地址下载到本地 在 template 拿到后端返回的文件路径 <el-button link type"success" icon"Download" click"handleDownload(file)"> 附件下载 </el-button>在 script 里面写方法 function handleDownload(v…...

GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件
在现代地理信息系统(GIS)领域,有许多大家耳熟能详的GIS软件。它们各自具有独特的优势,适用于不同的行业需求和使用场景。在众多企业和开发者面前,如何选择合适的 GIS 软件成为了一个值得深入思考的问题。今天ÿ…...

掌握分布式系统的38个核心概念
天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…...

如何使用 VNC 服务器连接桌面
如何使用VNC软件去连接远程桌面系统呢? 一、什么是VNC? VNC(Virtual Network Computing,虚拟网络计算)是一种远程桌面共享协议,允许用户通过网络访问和控制远程计算机的桌面界面。VNC 使用的是一种基于图像的方式,将远程计算机的桌面环境发送到客户端的显示设备上,同时…...

算法每日练 -- 双指针篇(持续更新中)
介绍: 常见的双指针有两种形式,一种是对撞指针(左右指针),一种是快慢指针(前后指针)。需要注意这里的双指针不是 int* 之类的类型指针,而是使用数组下标模拟地址来进行遍历的方式。 …...

读取excel并且显示进度条
读取excel并且显示进度条 通过C#实现DataGridView加载EXCEL文件,但加载时不能阻塞UI刷新线程,且向UI显示加载进度条。 #region 左上角导入 private async void ToolStripMenuItem_ClickAsync(object sender, EventArgs e) { …...

MySQL多表查询习题
数据内容介绍 数据库中有两个表 内容如下: 习题 列出所有员工的姓名及其直接上级的姓名。列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。列出在财务部工作的员…...