找回密码
 会员注册
查看: 35|回复: 0

Python函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71772
发表于 2024-9-6 20:50:38 | 显示全部楼层 |阅读模式
文章目录函数的定义函数的调用形参和实参函数的返回值一个return多个return多元赋值变量作用域函数内的变量全局变量和局部变量修改全局变量函数的定义函数的定义:分配任务def函数名(形参列表): 函数体 return返回值123def:define,定义形参列表中,可以有多个形参,它们之间使用逗号分隔函数体要带一级缩进,带有缩进的代码,才能算是函数的内部语句函数执行到return就代表执行完了,后面跟的值就是函数的返回值。return语句不是必须得,可有可无函数的调用函数的调用:开始完成任务函数名(实参列表)1实参列表,简称实参,此处写的实参的个数要和形参的个数匹配deftest():print('hello')print('hello')print('hello')#调用函数test()"""运行结果hellohellohello"""12345678910111213函数调用才会真正执行函数体里面的代码函数经过一次定义之后,可以被调用多次Python中要求,函数定义写在前面,调用在后面,“先定义,再使用”形参和实参举一个例子:我有一个朋友高中的时候,是一个学霸通过是一个非常漂亮的女生他们的关系非常好,但是因为一些原因,最终没能在一起这个朋友,其实就是我在这里面,“我有一个朋友“就是形参,“我”就是实参函数的调用是可以有多次的,每次调用的实参,也是可以不同的函数的实参,就是在函数调用的时候,要赋值给形参defcalcSum(beg,end):theSum=0foriinrange(beg,end+1):theSum+=iprint(theSum)#求1-100的和calcSum(1,100)#求300-400的和calcSum(300,400)"""运行结果505035350"""123456789101112131415161718在C++/Java里面,不光要求实参和形参的个数要匹配,还要求类型也匹配。但是在Python里面,只要求个数,对类型没有要求(动态类型)deftest(x,y): returnx+ytest(10,20)test(12.4,11.5)test('hello','world')"""运行结果3023.9helloworld"""123456789101112131415也不是说传入什么类型都可以,只要保证传入的参数类型,在函数体里面能够支持对应的运算操作即可(字符串和数字就不能一起)函数的返回值函数的参数可以视为是函数的“输入”,则函数的返回值,就可以视为是函数的“输出”.此处的“输入”,“输出”是更广义的输入输出,不是单纯指通过控制台输入输出.我们可以把函数想象成一个“工厂”.工厂需要买入原材料,进行加工,并生产出产品.函数的参数就是原材料,函数的返回值就是生产出的产品.一个return求beg-end之间的数的和:defcalcSum(beg,end):theSum=0foriinrange(beg,end+1):theSum+=ireturntheSumresult=calcSum(1,100)print(result)123456789此处的求和代码,在calcSum内部只进行了计算,而把打印的逻辑放到了函数的外面,calcSum把计算结果当做返回值,返回给“函数的调用者”这里把函数里面算好的5050赋值给了result变量在实际开发中,一般更倾向于这种写法。一个通用的编程原则:一个函数只做一件事解耦合在一个稍微复杂一点的程序中,经常会涉及到很多个模块,模块之间可能要进行交互交互就会带来耦合,我们希望通过良好的设计让耦合尽量低你和你的女朋友,耦合就比较强,一方产生变动,对另一方影响就非常大比如你的女朋友生病了,你就要去照顾她,去陪她你和你的其他普通女性朋友之间的耦合就几乎为0,一方产生变动,对另一方几乎没啥影响如果这个朋友生病了,你肯定不会去照顾她,你甚至都不会知道多个return一般多个return语句是搭配:分支语句/循环语句defisOdd(num):ifnum%2==0:returnFalseelse:returnTrueprint(isOdd(10))print(isOdd(19))"""运行结果FalseTrue"""12345678910111213141516isOdd是在判断输入的数字是不是奇数是,返回真不是,返回假defOdd(num): ifnum%2==0: returnFalse returnTrue1234这个代码逻辑和上面的逻辑是等价的当函数执行到return的时候就不再继续向下执行了,而是回到了调用位置(函数结束了)把returnTrue写到if外面,意味着不管条件是否满足,都会执行returnTrue,但是仔细观察,就会发现当条件满足之后,if里面有一个return了,所以一旦条件满足,就会执行if里面的return,函数就结束了,就没有机会执行到外面的return了Python中的一个函数可以返回多个值,是非常香的特征,C++/Java都馋哭了C++/Java中调用一个函数一次只能返回一个值C++要想返回多个值,可以通过输出型参数(指针/引用)Java要想返回多个值,需要把多个值给包装成一个对象,然后再返回这个对象多元赋值defgetPoint():x=10y=20returnx,ya,b=getPoint()1234567这里就将x赋值给了a,将y赋值给了bGolang在设计的时候也把这个机制给引用进去了虽然现在返回了多个值,但是我只想用其中一部分,不关注其他的可以使用_来进行占位defgetPoint():x=10y=20returnx,y_,b=getPoint()1234567不要x了,只要y,把y赋值给b即可变量作用域defgetPoint():x=10y=20returnx,yx,y=getPoint()1234567在这个代码中,函数内部存在x,y,函数外部也有x,y.但是这两组x,y不是相同的变量,而只是恰好有一样的名字.比如说,你喊你的女朋友“宝贝”,你的朋友喊他女朋友也是“宝贝”但是这两个“宝贝”是不同的,这是在各自不同的范围你喊你的女朋友“宝贝”,是在你俩的圈子里你朋友喊你的女朋友“宝贝”,是在他俩的圈子里你们俩在各自圈子里互不影响函数内的变量一个变量的有效范围是一定的,只在一个固定的区域内生效函数内部的变量只在函数内部生效,出了函数就失效了defgetPoint():x=10y=20returnx,ygetPoint()print(x,y)12345678全局变量和局部变量虽然名字相同,实际上是不同的变量.x=10deftest():x=20print(f'函数内部x={x}')test()print(f'函数外部x={x}')"""运行结果函数内部x=20函数外部x=10"""1234567891011121314外面的x是全局变量,是在整个程序中都有效的函数里面的x是局部变量,只在函数内部有效x=10deftest():print(f'x={x}')test()"""运行结果x=10"""1234567891011在函数里读取全局变量是可以的当函数中尝试访问某个变量的时候,会先尝在局部变量中查找,如果找到,就直接访问如果没有找到,就向上一级作用域中进行查找,test再往上一级,就是全局了修改全局变量如果是想在函数内部修改全局变量的值,需要使用global关键字声明x=10deftest():globalxx=20test()print(f'x={x}')"""运行结果x=20"""12345678910111213如果没有global,此时就会把x=10当做是在函数内部创建了一个局部变量x,但实际上是要修改全局变量x为了让函数里面知道这里的x是一个全局变量,就是用global关键字先声明一下if,else,while,for这些关键字也会引入“代码块”,但是这些代码块不会对变量的作用域产生影响,上述语句中的代码块内部定义的变量,可以在外面被访问foriinrange(1,3):print(i)print('---------------')print(i)"""12---------------2"""12345678910111213在C++/Java中只要是{}就会影响到作用域,而Python不会,Python中只有函数能影响作用域
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 13:59 , Processed in 0.912364 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表