python学习——【第八弹】

news2024/11/15 13:24:00

前言

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

在这里插入图片描述

函数

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

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

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

函数的创建

python中函数的创建方式:

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

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

函数的调用

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

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

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

函数调用的参数传递

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

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

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

def add(a,b):
    num=a+b
    return 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 140471326216032
    print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44] 140471317443120
    num1=111
    num2.append(999)
    print('num1=',num1,id(num1)) #num1= 111 140471326216704
    print('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 c
    c=a-b
    return c
print(func3())  #-1

全局变量

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

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

递归函数

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

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

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

递归的思想

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

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

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

递归的优缺点

优点:

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

缺点:

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

递归函数的应用

利用递归函数计算阶乘

def func1(n):
    if n == 1:
        return 1
    else:
        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 1
    elif n == 2:
        return 1
    else:
        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 1
    elif num==2:
        return 1
    else:
        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)

在这里插入图片描述

每篇一语

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

如有不足,感谢指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JWT】token jwt-跨域认证的问题、JWT 的原理、java JWT实用案例

本文是向大家介绍token JWT的相关学习&#xff0c;它能够实现登录认证功能的实现,了解它能够让我们对系统有更加全面系统的理解 JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联…

动态组件、keep-alive的使用及自定义指令

目录 1. 动态组件 2.如何实现动态组件渲染 3. 使用keep-alive保持状态 4. keep-alive对应的生命周期函数 5. keep-alive的include属性 自定义指令 1.什么是自定义指令 2. 自定义指令的分类 3. 私有自定义指令 4. update函数 5. 函数简写 全局自定义指令&#xff1a; …

媒体沟通会 | 云擎未来 智信天下:移动云大会终极预告

4月24日&#xff0c;“云擎未来 智信天下”2023移动云大会媒体沟通会在苏州举办&#xff0c;百余家主流新闻媒体参会。在媒体沟通会现场&#xff0c;中国移动云能力中心副总经理吴世俊致欢迎词&#xff0c;市场部副总经理吴炯详细介绍了移动云大会盛况&#xff0c;并透露在本届…

三问 ThreadLocal —— 有什么用 ? 使用时有什么潜在风险?原理 ?

最近想实现一些功能&#xff0c;求诸于网络之后&#xff0c;得到了使用 ThreadLocal 实现的方式&#xff0c;那么 ThreadLocal 到底是什么呢 &#xff1f; 遂写此文&#xff0c;抽丝剥茧的来看一下这个 Java 并发类 。 最近&#xff0c;me 的 gpt 账号没了&#xff0c;所以不能…

【模板】Hexo Docker Nginx 个人博客服务器部署

上文&#xff1a;基于 Hexo 的 Github 博客搭建 注意&#xff1a;通过验证部署&#xff0c;确定无误。AI生成的部分有&#x1f916;图标。 &#x1f916; TLDR By ChatGPT 本指南提供了在服务器上设置Git仓库、将本地Hexo页面推送到服务器仓库、在服务器上创建Nginx配置文件以…

数字信封例程不支持的bug,以及卸载安装配置Node.js

文章目录 前言一、运行错误:0308010C:数字信封例程:不支持二、卸载Node.js三、重新安装Node.js总结 前言 下载了若依项目&#xff0c;但是在前端项目运行打包都出现了bug。最后&#xff0c;卸载了Node.js&#xff0c;并重新安装了低版本的Node.js。 一、运行错误:0308010C:数字…

[算法前沿]--003-AGI通用人工智能模型对安全的影响和开源的大模型

文章目录 0.ChatGPT大模型带来的影响0.1 ChatGPT带来信息化革命性创新&#xff0c;目前尚不能处理专业知识但成长很快0.2 Chat GPT为网安行业带来新的创新方向&#xff0c;也将引领新一轮投融资热潮0.2.1 攻击方发起网络攻击的门槛降低0.2.2 防守方合理使用ChatGPT可大幅减少安…

组态王与PLC之间1主多从自组网无线通信

本方案是基于三菱专用协议下实现的1主多从自组网无线通信形式&#xff0c;主站为组态王&#xff0c;从站为三菱FX3U PLC和485BD扩展。采用日系PLC专用无线通讯终端DTD435MC-V96&#xff0c;作为实现无线通讯的硬件设备&#xff0c;来解决组态王与PLC之间的通讯问题。 一、方案…

百度AI模型“文心一言”新鲜体验

今天收到通知可以体验百度的AI模型“文心一言”&#xff0c;等了一个多月迫不及待的去体验了一把&#xff0c;以下是体验的相关记录。 1、简单介绍 通过文心一言官网链接https://yiyan.baidu.com/进入&#xff0c;看到如下界面&#xff1a; 在文心一言的自我介绍中&#xff0c…

seetaface6 GPU版本windows编译

目录 1. seetaface6概述2. 编译说明2.1 编译工具2.2 编译顺序 3. 编译OpenRoleZoo4. 编译SeetaAuthorize5. 编译TenniS6. 编译FaceTracker6 1. seetaface6概述 seetaface6源码以及模型文件github下载路径&#xff1a;https://github.com/SeetaFace6Open/index 由于项目性能需求…

华为为何要搞相对冷门的ERP?

大家都知道华为的研发实力很强&#xff0c;但几天前他们宣布研发出超大规模云原生的ERP时&#xff0c;还是有些吃惊。 20日&#xff0c;在东莞的一场“英雄强渡大渡河”表彰会上&#xff0c;华为抛出一个大多数公司都难以做到的成果&#xff1a;三年时间&#xff0c;数千人&am…

从零开始写ChatGLM大模型的微调代码

cursor 的下载及安装&#xff08;免费版每月100次&#xff0c;升级pro 20刀/月&#xff09; cursor是一款与openai合作的&#xff0c;使用gpt-4的一款编程工具&#xff0c;它可以让你通过gpt-4进行辅助编程&#xff0c;以此提高效率。 下载地址&#xff1a;https://www.curso…

CentOS系统安装Intel E810 25G网卡驱动

因特尔网卡驱动给的都是二进制包&#xff0c;需要编译环境。 首先去Intel下载最新的驱动 E810驱动下载&#xff1a;https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html?wapkwe810 里面有三个驱…

量子计算新进展!瑞典和芬兰率先研发芯片

&#xff08;图片来源&#xff1a;网络&#xff09; 芬兰和瑞典在北欧率先推出了独立的量子计算机项目&#xff0c;并在未来量子技术方面取得了可喜的新进展。 在瑞典&#xff0c;查尔姆斯理工大学 (Chalmers UoT) 获得了追加的900万欧元&#xff08;约合6774万元人民币&#x…

风力发电系统的随机调度研究(matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【神经网络】tensorflow实验8--梯度下降法

1. 实验目的 ①掌握TensorFlow的可训练变量和自动求导机制 ②能够使用TensorFlow实现梯度下降法&#xff0c;求解一元和多元线性回归问题 2. 实验内容 下载波士顿房价数据集&#xff0c;使用线性回归模型实现对波士顿房价的预测&#xff0c;并以可视化的形式输出模型训练的过…

【Git】—— 版本控制(忽略文件、查看修改内容,撤销未提交的修改、查看历史提交记录)

目录 一、准备工作 二、忽略文件 三、查看修改内容 四、撤销未提交的修改 五、查看提交记录 前面学习了Git最基本的用法&#xff0c;包括安装Git、创建代码仓库以及提交本地代码。 下面将要学习版本控制。 一、准备工作 先选择一个项目&#xff0c;给它创建一个代码仓库&a…

Linux环境定时备份MySQL数据库

数据库备份常有&#xff0c;实现备份&#xff0c;大概需要3个步骤&#xff1a; 目录 1.创建数据库备份用户 2.创建数据库备份shell脚本 3.创建定时任务 1.创建数据库备份用户 为了数据安全&#xff0c;不建议使用root用户。举例&#xff1a;创建数据库备份用户 dump&#…

复现永恒之蓝[MS17_010]

目录 准备靶机 测试ping连通性 攻击漏洞 利用漏洞 准备靶机 1台kali&#xff0c;1台win7 win7系统可以在MSDN镜像网站里获取 注:将win7安装好&#xff0c;win7无法安装vmtools&#xff0c;若升级系统&#xff0c;可能会把永恒之蓝补丁打上&#xff0c;所以建议别升级系统 测试…

用Java创建可扩展的OpenAI GPT应用程序

ChatGPT 值得深入使用的方面之一是它的引擎&#xff0c;它不仅为基于Web的聊天机器人提供动力&#xff0c;还可以集成到Java应用程序中。 ▌Budget Journey App 想象一下&#xff0c;你想去一个城市旅行并且设置好了预算&#xff0c;你应该如何分配你的钱并让你的旅行难忘&am…