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

python学习——【第八弹】

前言

上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此python中的序列的学习就完成啦,这篇文章开始学习python中的函数

在这里插入图片描述

函数

在学习其他编程语言的时候我们就了解过函数函数就是执行特定任何以完成特定功能的一段代码

那么我们为什么要使用函数呢?

复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试

函数的创建

python中函数的创建方式:

def 函数名 ([输入参数]):
函数体
[return xxx]

形参:形参出现在函数的定义处
实参:实际参数的值,位置出现在函数的调用处
在这里插入图片描述

函数的调用

在学习其他的语言时我们知道,函数只有在调用的时候才能执行,python中的函数也是一样的。调用函数的方式也很简单:

[返回值] = 函数名([参数])
如果函数没有参数,则括号中可以留空
def pri():print('helloworld')
pri()#调用函数 

那么在调用函数时,对调用的参数有什么要求呢?

函数调用的参数传递

位置实参:根据形参对应的位置进行实参传递

def add(a,b):num=a+breturn num
result=add(10,20)
print(result)  #30

关键字实参:根据形参名称进行实参传递

def add(a,b):num=a+breturn num
result=add(b=10,a=20)
print(result) #30

需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。

函数参数的定义

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

def fun1(a,b=10):print(a,b)
# 函数调用
fun1(100) #100 10
fun1(20,30) #20 30 与默认形参值不相符,传递实参值

个数可变的位置形参

1:定义函数时,可能无法事先确定传递的位置的实参的个数,可以使用可变的位置参数
2:使用 * 定义个数可变的位置形参
3:结果为元组类型
4:如果没有需传递的位置实参,但是使用了可变的位置参数,这时再调用该函数,会返回一个空元组 即args=()

def fun1(*args):print(args,type(args))
fun1(10)
fun1(10,20)
fun1(10,20,30)
'''
(10,) <class 'tuple'>
(10, 20) <class 'tuple'>
(10, 20, 30) <class 'tuple'>
'''
def fun11(x,y,*args): #已知形参(x,y)要放在位置形参之前;否则会报 SyntaxError: invalid syntax 无效语法错误print('x=',x)print('y=',y)print('args=',args)
fun11(11,22,33,44,55)'''
x= 11
y= 22
args= (33, 44, 55)
'''

注意:使用个数可变的位置参数时,可变的位置参数只能是1个
在这里插入图片描述

个数可变的关键字形参

1:定义函数时,无法事先确定确定传递的关键字实参的个数时,使用可变的关键字形参

2:使用 ** 定义个数可变的关键字形参

3:结果是一个字典

4:如果没有需要传递的关键字实参,但是使用了可变的关键字参数,这时再调用该函数,会返回一个空字典 即args={}

def fun2(**args):print(args,type(args))
fun2(a=10)
fun2(a=10,b=20,c=30)
'''
{'a': 10} <class 'dict'>
{'a': 10, 'b': 20, 'c': 30} <class 'dict'>
'''def fun22(x,y,**args):  #已知形参(x,y)要放在关键字形参之前;并且位置实参的个数要和位置形参的个数保持一致,否则会报:TypeError: fun22() takes ... positional arguments but ... were given  实参数与形参数不符print('x=',x)print('y=',y)print('args=',args)
fun22(11,22,c=10,d=0)
'''
{'a': 10}
{'a': 10, 'b': 20, 'c': 30}
'''

注意:使用个数可变的关键字形参时,可变的关键字形参只能是1个

def fun6(**args,**args):pass
# 程序报错 SyntaxError: invalid syntax  无效语法

定义函数的过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变的位置形参放在个数可变的关键字形参之前。

def fun(x, y, *args, **argss):print("x=", x)print("y=", y)print("args=", args)print("argss=", argss)
fun(1, 2, 3, 4, e=5, f=6, g=7) 
'''
x= 1
y= 2
args= (3, 4)
argss= {'e': 5, 'f': 6, 'g': 7}
'''
# 可变位置参数和可变关键字参数需要传递的实参数不相匹配时,如果可变位置参数或可变关键字参数没有收到需要传递的实参的值的话,调用函数时分别返回空元组和空字典。
def fun(x, y, *args, **argss):print("x=", x)print("y=", y)print("args=", args)print("argss=", argss)
fun(3, 4) 
'''
x= 3
y= 4
args= ()
argss= {}
'''

函数参数的传递

位置参数的传递

def funs(a,b,c):print('a=',a)print('b=',b)print('c=',c)
funs(10,20,30)
lst=[11,22,33]
funs(*lst)# 使用位置参数传递,在函数调用时,将列表中的每个元素都转换为位置参数传入
'''
a= 10
b= 20
c= 30
a= 11
b= 22
c= 33
'''

关键字参数的传递

# 关键字参数传递
funs(a=111,b=222,c=333)
dic={'a':444,'b':555,'c':666}
funs(**dic)# 使用关键字参数传递,在函数调用时,将字典中的每个元素的键值对都转换为关键字参数传入
'''
a= 111
b= 222
c= 333
a= 444
b= 555
c= 666
'''

在 * 之后的参数,在函数调用时,只能采用关键字参数进行传递

def funcs(a,b,*,c,d):print('a=',a)print('b=',b)print('c=',c)print('d=',d)
funcs(10,20,c=30,d=40)
'''
a= 10
b= 20
c= 30
d= 40
'''

在这里插入图片描述

函数传递时形参的位置问题

在这里插入图片描述

函数的参数总结
1 :将序列中的每个元素都转换为位置实参 使用*

2 :将字典中的每个键值对都转换为关键字实参 使用 **

3 : 关键字形参 使用*

4 :个数可变的位置形参 使用*

5 :个数可变的关键字形参 使用**

函数调用参数传递内存分析

def fun(num1,num2):print('num1=',num1,id(num1)) #num1= 90 140471326216032print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44] 140471317443120num1=111num2.append(999)print('num1=',num1,id(num1)) #num1= 111 140471326216704print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44, 999] 140471317443120
print('---------调用函数之前---------')
add1=90
add2=[11,22,33,44]
print(add1,id(add1))  #90 140471326216032
print(add2,id(add2))  #[11, 22, 33, 44] 140471317443120
print('-------------调用函数----------')
fun(add1,add2)
'''
num1= 90 140471326216032
num2= [11, 22, 33, 44] 140471317443120
num1= 111 140471326216704
num2= [11, 22, 33, 44, 999] 140471317443120
'''
print('-----------调用函数后----------')
print(add1,id(add1)) #90 140471326216032
print(add2,id(add2))  #[11, 22, 33, 44, 999] 140471317443120

在这里插入图片描述

可以发现:在函数调用过程中,若要进行参数传递:

如果是可变对象(如列表、集合、字典),在函数体内对其进行修改会影响到函数体外的这个可变对象的值(因为可变对象在内存中是可变的,可以被修改),其id地址不会发生改变

如果是不可变对象(如数值、字符串、元组),在函数体内对其进行修改不会影响到函数体外这个不可变对象的值(因为不可变对象在内存中是固定的,无法被修改),其id地址不会发生改变

函数返回值

1:当函数不需要返回值时,函数体内可以省略return;并且​函数执行完毕后,不需要给调用处提供数据

def pri():print('helloworld')
pri()

2:当函数只有一个返回值时,返回值类型就是原类型

def fun2():return 'hello'
res=fun2()
print(res,type(res)) #hello <class 'str'>

3:当函数有多个返回值时,返回值类型是一个元组

def fun(num):odd=[]even=[]for i in num:if i%2==0:odd.append(i)else:even.append(i)return odd,even
list1=[11,22,32,23,45,6,0]
print(fun(list1),type(fun(list1)))
# ([22, 32, 6, 0], [11, 23, 45]) <class 'tuple'>

变量的作用域

程序代码能访问该变量的区域 称作变量的作用域

根据变量的有效范围可分为:

局部变量

在函数体内定义并使用的变量,只在函数内部有效,局部变量使用global声明 , 这个变量就会成为全局变量

def func1(a,b):c=a+b   #c 就成为局部变量  因为c是在函数体内进行定义的变量   a,b是函数的形参  作用范围也是函数内部  相当于局部变量return c
print(func1(1,2))#3
# 使用global 声明局部变量,a b为全局变量,在函数体内可以直接被调用;c在函数体内定义,属于局部变量,因此需要用global声明才能在函数体外被调用
a=1
b=2
def func3():global cc=a-breturn c
print(func3())  #-1

全局变量

函数体外定义的变量 ,可作用于函数体内

# 全局变量  a=1,b=2为定义在函数体外的变量,属于全局变量,在函数体内与函数体外均可调用
a=1
b=2
def func2():c=a+breturn c
print(func2())  #3

递归函数

什么是递归函数如果在一个函数的函数体内调用了该函数本身, 这个函数就称作递归函数

递归的组成部分递归调用与递归终止条件

递归的调用过程每递归调用一次函数 ,都会在栈内存分配一个栈帧(每次调用函数时,在内存中都会单独开辟一个空间,配合函数运行,这个空间叫做栈帧空间。)每执行完一次函数, 都会释放相应的空间

递归的思想

递归是一去一回的过程,调用函数时,会开辟栈帧空间,函数执行结束之后,会释放栈帧空间,递归实际上就是不停地开辟和释放栈帧空间的过程,每次开辟栈帧空间,都是独立的一份,其中的资源不共享。

递归其实利用的时是压栈的思想,我们看一下下面这个例子:
在这里插入图片描述

压栈思想:
在这里插入图片描述

递归的优缺点

优点:

递归函数使代码看起来干净整洁。
使用递归可以将复杂的任务分解为更简单的子问题。
与使用嵌套嵌套相比,使用递归更容易生成序列。

缺点:

有些情况,递归背后的逻辑很难遵循。
递归调用很昂贵(效率低),因为它们占用大量内存和时间。
递归函数调试较为复杂。

递归函数的应用

利用递归函数计算阶乘

def func1(n):if n == 1:return 1else:return n*func1(n-1)
print(func1(6)) #720

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

利用递归函数计算​ ​斐波那契数列​​

斐波那契数列:1、1、2、3、5、8、13、21、34。。。

F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

计算第n位的斐波那契数是多少

def func2(n):if n == 1:return 1elif n == 2:return 1else:res=func2(n-1)+func2(n-2)return res
print(func2(6)) #8

打印出整个斐波那契数列

for i in range(1,7):print(func2(i),end=' ')
print('\n')#1 1 2 3 5 8 

键盘录入一个整数,然后根据这个正整数打印出斐波那契数列以及其数列和

num=int(input('请输入一个正整数:'))
def func3(num):if num==1:return 1elif num==2:return 1else:result=func3(num-1)+func3(num-2)return result
nums=[]
sums=0
for n in range(1,num+1):# print(func3(n),end=' ')nums.append(func3(n))sums+=func3(n)
print('产生的斐波那契数列是:',nums)
print('\n第',num,'位的斐波那契数为:',func3(num))
print('\n斐波那契数列之和为:',sums)

在这里插入图片描述

每篇一语

努力的人运气都不会太差!

如有不足,感谢指正!

相关文章:

python学习——【第八弹】

前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合&#xff0c;自此python中的序列的学习就完成啦&#xff0c;这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就了解过函数&#xff1a;函数就是执行特定任何以完成特定功能的一段代…...

铁路应答器传输系统介绍

应答器传输系统 应答器传输系统是安全点式信息传输系统&#xff0c;通过应答器实现地面设备向车载设备传输信息。 应答器可根据应用需求向车载设备传输固定的&#xff08;通过无源应答器&#xff09;或可变的&#xff08;通过有源应答器&#xff09;上行链路数据。 当天线单…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;通过BGAPI SDK直接保存Mono12/16图像3&#xf…...

C语言入门篇——介绍篇

目录 1、什么是C语言 1、C语言的优点 3、语言标准 4、使用C语言的步骤 5、第一个C语言程序 6、关键字 1、什么是C语言 1972年&#xff0c;贝尔实验室的丹尼斯里奇和肯汤普逊在开发UNIX操作系统时设计了C语言&#xff0c;C语言是在B语言的基础上进行设计。C语言设计的初衷…...

Latex数学公式排版

文章目录 Latex使用最佳方式&#xff1a;读官方文档Latex中的字符数学公式排版1.引入宏包:2.公式排版基础3.数学符号(1).希腊字母(2).指数,上下标,导数(3).分式和根式(4).关系符(5).算符(6).巨算符(7).箭头 Latex使用 最佳方式&#xff1a;读官方文档 The not so short intro…...

【Linux】-关于Linux的指令(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; TOC 前言 今天我们来讲关于Linux的基本指令&#xff0c;博主讲的指令会对应着Windows…...

【论文写作】引言写作的四个重要的语言点之时态!!!

在本篇文章当中&#xff0c;我们将着重介绍四个重要的写作语言要点之一的时态&#xff0c;其他语言点如下&#xff1a; 1. 时态 2. 标志性的衔接词 3. 主动、被动语态 4. 段落 1. 简单现在时和现在进行时 时态主要有现在时和现在进行时&#xff0c;看以下两个句子 I live in…...

Super Yolo论文翻译

论文&#xff1a;SuperYOLO: Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery【IEEE】 论文地址&#xff1a; IEEE Xplore Full-Text PDF:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10075555项目地址&#xff1a;icey…...

【CocosCreator入门】CocosCreator组件 | ProgressBar(进度条)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的ProgressBar组件是一种用于实现进度条效果的重要组件。它可以让我们在游戏中展示各种进度条效果&#xff0c;例如加载进度条、血条等。 目录 一、组件介绍 二、组件属性 三、脚本…...

大数据数仓维度建模

目录 维度建模分为三种&#xff1a; 1、星型模型&#xff1a; 2、雪花模型&#xff1a; 3、星座模型&#xff1a; 模型的选择&#xff1a; 维度表和事实表&#xff1a; 维度表&#xff1a; 维度表特性 &#xff1a; 事实表&#xff1a; 事实表特性&#xff1a; 事务型…...

ESP32设备驱动-BH1745NUC 亮度和颜色传感器驱动

BH1745NUC 亮度和颜色传感器驱动 文章目录 BH1745NUC 亮度和颜色传感器驱动2、硬件准备3、软件准备4、驱动实现BH1745NUC 是具有 IC 总线接口的数字颜色传感器 IC。 该 IC 感应红光、绿光和蓝光 (RGB) 并将它们转换为数字值。 高灵敏度、宽动态范围和出色的 Ircut 特性使该 IC …...

通达信VCP形态选股公式,憋了好几天才写出来

VCP形态的英文”Volatility Contraction Pattern”的缩写&#xff0c;意思是“波动收缩形态”。VCP形态是全美交易冠军马克米勒维尼的核心交易模式之一&#xff0c;在其著作《股票魔法师》中有详细介绍。 马克米勒维尼把VCP形态比喻为湿毛巾&#xff0c;拧过一次后仍含水&…...

vue 知识储备

vue2 和 vue3 的区别 模块拆分:vue3采用 compnent API 更注重模块上的拆分,而vue2中则需要使用完整的vuejs,无法使用单独的模块重写API:vue2组件方法挂载到实例中未使用也会被打包,vue3通过 tree-shaking机制,实现按需引入,减少用户打包后体积数据双向绑定:vue2使用 Ob…...

MySQL表的增删查改

目录 一 插入 1 基本语法 ①全列插入 ②指定列插入 ③多条记录插入 ④冲突更新 二 查询 查询全部数据 指定列查询 显示 拼接 取别名 去重查找 where 逻辑运算符和比较运算符 结果排序 Limit group by 分组 聚合函数 对于count 对于sum 对于group by 相关的语…...

详解C语言string.h中常用的14个库函数(三)

本篇博客继续讲解C语言string.h头文件中的库函数。本篇博客计划讲解3个函数&#xff0c;分别是&#xff1a;strstr, strtok, strerror。其中strstr函数我会用一种最简单的方式模拟实现。 strstr char * strstr ( const char * str1, const char * str2 );strstr可以在str1中查…...

无人机视频与GIS融合三维实景怎么实现?

无人机视频与GIS融合三维实景怎么实现?无人机三维GIS作为一项新兴的测绘重要手段&#xff0c;具有续航时间长、成本低、机动灵活等优点&#xff0c;为城市的规划建设带来极大便利。 那么此项技术有什么样的特点呢?下面智汇云舟就带大家一起来了解一下。 三维是将采集以及经运…...

瞬间让你效率提高一倍的高效学习方法

方法不对&#xff0c;努力白费&#xff1b;方法对了&#xff0c;事半功倍&#xff01;在学习的过程中我们会遇到各种困难与阻碍&#xff0c;如何发现并优化自己的学习方法就变得尤为重要。高效学习方法是指通过科学的、有效的方法来提高学习效率&#xff0c;实现更好的学习成果…...

442. 数组中重复的数据|||41. 缺失的第一个正数|||485. 最大连续 1 的个数

442. 数组中重复的数据 题目 给你一个长度为 n 的整数数组 nums &#xff0c;其中 nums 的所有整数都在范围 [1, n] 内&#xff0c;且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数&#xff0c;并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅…...

中国地图标准坐标和投影参数

目录 一、地理坐标 二、投影坐标 三、ArcGIS投影变换 四、说明 一、地理坐标 GCS_Krasovsky_1940&#xff08;克拉索夫斯基_1940椭球体&#xff09; 具体参数如下图&#xff1a; 每个国家或地区都有各自的基准面&#xff0c;我们通常所说的北京54坐标系、西安80坐标系实际上…...

CNN中卷积层、池化的计算公式

卷积计算公式 1、卷积层输入特征图(input feature map)的尺寸为&#xff1a;(batch_size,Channel,H,W) H(input)表示输入特征图的高 W(input)表示输入特征图的宽 C(input)表示输入特征图的通道数&#xff08;如果是第一个卷积层则是输入图像的通道数&#xff0c;如果是中间…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...