函数与作用域

1.函数

1.1函数一般形式

1 def f():
2     print("OK")
3 f()
4 print(f)

函数作用:

(1)避免码重复

(2)可拓展性强

(3)代码一致性

这其中需注意:打印出来的f相当于是一个变量的地址;只有()才会执行函数;函数有着自己的作用域;函数会预先储存进内存,但是执行还是一行一行来。

1.2形参和实参

1 def num(a,b): 2 print("gaga is %s %s"%a,b)

上述代码中的a,b就是形参。通过形参就可以将外来的数据带入到函数中执行。

在运行函数的时候num(1,2)其中1和2就是实参。实参是根据自己需要输入进去的。

注意:不单单是数字输入其他的如:变量,函数等。

1.3返回值

1 def f(n):                       
2     return n*n
3 def foo(a,b,func):
4     return func(a)+func(b)
5 print(foo(1,2,f))

返回关键字return后面的内容就是该函数的返回值。返回值的作用是结束函数并且返回一个值。

从上述的代码中可以看出:

(1)返回多个值 return会将其做成一个元组

(2)以函数为实参时注意括号有无很重要

1.4 四种方式

函数  >>>  执行

1.def f(a,b)  >>> f(1,2)         # 必须一一对应  

2.def f(sex="female")             # 有默认的效果

3.def f(*args) >>> f (1,2,i,j)  # 必须是无命名,也可以元组的形式添加。但是*[1,2,4]这样实参会是一个元组

4.def f(**kwargs) >>> f("name"="a","lk"=23) # 道理同上,但都是键值对。

四种之间的顺序是:1234 其中有些细节应以试验效果为准。没出现歧义为准。

2.作用域

 int (a)
1
a =1 2 def f(): 3 a =2 4 b =9 5 print(a) # 2 6 def l(): 7 # nonlocal b 8 b = 3 9 def p(): 10 nonlocal b 11 b=4 12 print(b) # 4 13 a =4 14 p() 15 print(b) # 4 16 l() 17 print(b) # 9 18 f()

此处进行了3次函数的嵌套,共4层,且将最里面一层看成第四层。

作用域的思考搜寻范围一次为:legb即

"build in"    >>>   int
"global" >>> a = 1
"enclosing" >>> a = 2 b = 3
"local" >>> b = 4 a = 4

总结:

(1)从里往外找。在最里层print(b)中解释器会先在本层找b,本层没有就找到外层的b=3。
(2)里层需要用外层的变量。"若local和enclosing中想修改enclosing中的即内部层修改其上一层(不包括global)的用nonlocal 并且只能修改上一层上上层没影响"例子是注释中的b=9
(3)"变量在没声明的情况下不能修改上一层的,即使变量名字一样也是指在本层中使用(不是同一个变量)"

(4)第四层中若是没声明nonenclosing b 则打印b会报错原因是不能先执行后打印。这也说明的解释器将函数先储存进了内存。

原文地址:https://www.cnblogs.com/khal-Cgg/p/5848772.html