代码改变世界

函数

2018-07-19 10:47  冻奶香甜玉米片  阅读(208)  评论(0编辑  收藏  举报

函数就是通过函数名封装一组语句,以后可以直接通过函数名来调用这组语句

使用函数可以减少重复语句,使后期维护更方便

例:

def  sayhi(name):

  print("hello",name)

name 是参数

调用函数时,实参传给形参,形参自己在函数内部使用(猜在函数内部也是x,y表示)

 

定义函数时,默认参数要放在位置参数后面,否则你不输入该参数,但是该参数放在位置参数前面,你填参数时,谁知道你赋值的是给默认参数,还是位置参数

 

关键参数:

就是在调用参数时指定了参数名的参数,这样调用可以不按定义函数时的顺序,但是必须放在位置参数后面,且不能多次赋值

假如你用的关键参数在定义参数的第*位,定义的参数第*位之后的参数全部要以关键参数的形式输入,否则,他会按顺序取值,则该参数会多次赋值,不行

 

非固定参数:

例如:def message(msg,*user):

              (一般*后面叫args即,(def message(msg,*user):))

     (*user即是非固定参数,传递的参数可以不再是固定个数,传递过来的所有参数打包成一个元祖)

    for i in user:

      print(msg,i) (注意这里要用i,不然他会每次都直接把打包的元素全部传过来) 不可(print(msg,user)),他会把整个元祖输出

这样可以解决多次操作的需求,不用每次都调用函数

输入的时候可以 message(msg,"alex","rain","xxx","ooo")这样输入

这是直接把非固定参数打包成元祖传递给user,就不需要多次调用

也可以message(msg,*[alex","rain","xxx","ooo"]这样输入,必须加*,不然会认为是整个列表是元祖第一个元素

如果def message(msg,*user,age):

这种非固定参数后面还有参数的情况,在调用参数时输入后面的参数时,要输入age=

 

还有一种非固定参数def message(name,*args,**kwargs)

**kwargs,用来接收没有定义的参数,以字典形式输出,例:

message("alex","rain“,“shanshan”,d="hahaha",P="jjj")

P和d会进入到**kwargs里面

如果想直接传入字典,而不被*args认为是其一个函数,则输入时:

d={"name":"hello"}

message(alex.**d),则直接被放入**kwargs范畴里

 

    

return:

当函数碰到return,就会结束

函数永远只能返回一个值,如果retrun a,b 则会把a,b形成一个元祖返回

如果没有return,则函数返回的是None,则函数等于None

 

局部变量:函数内部定义的变量,只能在函数内生效

全局变量:函数外部定义的变量,没有再被函数包裹,顶部的一级代码变量,全局能用(但是还是要注意代码的上下顺序)

 

在函数内部没有该变量时,可以调用全局变量,如果有的话,就优先使用函数内部的变量,需要一层一层往上找

但是函数内部无法修改外部变量,因为修改其实是赋值(除非调用global)

(global name 等于调用全局变量,并且可以修改全局变量,不用import global,但是global在函数内必须出现在变量前面,不能把局部变量声明在global之前)

不建议使用global,因为程序员间的默契,你其他地方也要调用该变量, 你什么时候改了都不知道(global在函数内,定义时没事,一运行函数就改了)

global的调用时全面的,既可以调用值,又可以修改,但是在函数里调用global name,其实在函数内你是没找到name的,你是往外找了全局变量,global以下对name的操作都是对全局变量name的修改

 这种情况,age 已经被拿到下面了(告诉你可以调用全局变量了),但是你实际上找还是fun2没找到 ,往fun1找,没找到,再往全局变量找了

 

但是存在函数内部不用调用global就可以直接修改全局变量的情况:

全局变量时list,key,set,对象,类,可以修改里面某个元素,因为之前讲过list是一个大地址,里面指向很多小地址,函数内部无法修改大地址,但是小地址还是可以修改的。

list=[1,2,3,4]

def abc():

list=[1,2,3,4,5]这样是不行的,等于修改大地址,但是list[0]=9这样是可以的,修改小地址,如果需要修改整体(即大地址)仍然需要global

(无法修改数字,字符串,他们已经是最小单元了,是最小的地址,里面已经没有再指向其他地址了(自己的理解) )

 

函数外没办法调用局部变量,因为函数执行完立刻释放内存

 两个函数间的变量无法互相调用