阅读目录:

  1、函数的返回值

  2、函数嵌套

  3、作用域 ***

  4、闭包**

  5、nonlocal 关键字

  6、默认值的作用域

  7、变量名解析原则LEGB

   8、函数的销毁

 

内容:

1、函数的返回值:

  单条 return 语句:

 1 def showplus(x):
 2     print(x)
 3     return x + 1
 4 
 5 showplus(5)
 6 
 7 
 8 def  showplus(x):
 9     print(x)
10     return x + 1
11     print(x+1) # 不会被执行,因为之前出现了return 并执行了 return语句
12     
13 showplus(5)

  多条 return 语句:

 1 # def guess(x):
 2 #     if x > 3:
 3 #         return "> 3"
 4 #     else:
 5 #         return " <= 3"
 6 # print(guess(10)) # > 3
 7 
 8 def showplus(x):
 9     print(x)
10     return x+1
11     return x+2 # 不被执行
12 showplus(5)
13 
14 
15 def fn(x):
16     for i in range(x):
17         if i > 3:
18             return i
19     else:
20         print('-', i)
21 
22 print(fn(5)) # 4
23 print(fn(3)) # 
24 
25 # - 2
26 # None

 

  总结:

    1. Python 函数使用 return 语句返回“返回值”
    2. 所有函数都有返回值,如果没有return 语句,隐式调用return None
    3. return 语句并不一定是函数的语句块的最后一条语句
    4. 一个函数可以存在多条return语句,但是只有一条被执行,乳沟哦没有一条return 语句被执行到隐式调用return None
    5. 如果有必要,可以显示调用return None,可以简写为return。
    6. 如果函数执行了return 语句,函数就会返回,当前被执行的return 语句之后的其他语句就不会被执行了
    7. 作用:结束函数调用,返回值

  返回多个值 ???:return 是无法返回多个值的!,一次只能返回一个 ,返回类型根据具体情况而定!

1 def showplus():
2     return [1,2,3] # [1, 2, 3]
3 def showplus():
4     return 1,2,3  # (1, 2, 3)
5 
6 print(showplus())

 

     总结:

      • 函数是 不能同时返回多个值
      • return [12,3,4] 是指明返回一个列表,是一个列表对象
      • return 1,,2,3 看似返回多个值,隐式的被python 封装成一个元组     
1 def showplus():
2     return 1,2,3  # (1, 2, 3)
3 
4 print(showplus())
5 a,b,c = showplus()
6 print(a, b, c) # 1 2 3

 

2、函数嵌套

  在一个函数中定义了另外一个函数

1 def outer():
2     def inner():
3         print('inner')
4     print('outer')
5     inner()
6 outer() # 可以调用 outer()
7 inner() # 调用不到inner()

 

    函数有可见范围,这就是“作用域”的概念。

    内部函数不能再外部直接使用,会抛NameError 异常,因为 它 不可见。

3、作用域 ***

  作用域:

    一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域。

  常见作用域可能出现的问题:

 1 # NO 1
 2 x = 5
 3 
 4 def foo():
 5     print(x)
 6 
 7 foo() # 是可见的
 8 
 9 # NO 2
10 x = 5
11 
12 def foo():
13     # UnboundLocalError: local variable 'x' referenced before assignment
14     x += 1 # 不可见的
15     print(x)
16 foo()
17 
18 # NO 3
19 def foo():
20     a = 10
21     print(x)# 4
22 x = 4
23 
24 foo()# 是可以看到的,正常打印
25 
26 # NO 4  
27 x = 5
28 
29 def show():
30     ## 在函数内部再次使用 = 的时候,要注意,此时这个变量变为 local 变量
31     ## 赋值即被重新定义,即,赋值的时候,x 不知道多少,所以会报错
32     x += 1 # 报错,
33     print(x)
34 
35 show()
36     
37 # NO 6
38 x = 6
39 
40 def show():
41     print(x)
42     x += 1 # 跟上一个报错一样     # UnboundLocalError: local variable 'x' referenced before assignment
43 
44 show()
45     
46 # NO 7
47 x = 5
48 
49 def show(x):# 同样报错,x此时还是局部变量,但是没有先定义,直接打印
50     print(x)
51     x += 1
52     print(x)
53 
54 show(4)
55 
56 # NO 8
57 x = 5
58 
59 def show(x):# 相当于给了一个局部变量x = 4
60     print(x) # 4
61     x = 1
62     print(x) # 1
63 
64 show(4) # 传参 
65 print(x) # 5
66     
67 # NO 9
68 x = 5 # 赋值即定义
69 
70 def show():
71     print(x) # 报错,赋值定义 应该 在打印之后
72     x = 1 
73 
74 show()
75 
76 
77 
78 
79 
80 
81     
82     
test-作用域案例

相关文章: