Python之函数

函数

函数:实现某种功能(数学形式、python def函数式编程)

过程:就是函数没有返回值

参数

1、形参 实参 位置参数 关键字参数 默认参数

 1 # 形参x,y不分配内存空间  实参2,3在调用的时候才分配空间,调用完毕就释放空间
 2 def calc(x, y):
 3     res = x ** y
 4     return res
 5 
 6 
 7 c = calc(2, 3)
 8 print(c)
 9 
10 
11 def test(x, y, z):
12     print(x)
13     print(y)
14     print(z)
15 
16 
17 # 位置参数(一一对应,缺一不行,多一不行)
18 test(1, 2, 3)
19 # 关键字参数(位置不固定,缺一不行,多一不行)
20 test(x=1, y=2, z=3)
21 # 混合使用:位置参数必须在关键字参数左边
22 test(1, 2, z=3)
23 # test(1, 2, z=3, y=4) # 特殊情况仍然要报错
24 
25 
26 # 默认参数
27 def handle(x, y='mysql'):
28     print(x)
29     print(y)
30 
31 
32 handle('hello')
33 handle('hello', 'sqlite')

 2、参数组 *args(列表) **kwargs  (字典)

 1 # 参数组 **字典 *列表
 2 
 3 
 4 # def test(x, *args):
 5 #     print(x)
 6 #     print(args)
 7 #     print(args[0])
 8 
 9 
10 # test(1, 2, 3, 4, 5, 6)
11 # test(1, *['x', 'y', 'z'])  # ('x', 'y', 'z')
12 # test(1, ['x', 'y', 'z'])   # (['x', 'y', 'z'],)
13 
14 # def test(x, **kwargs):
15 #     print(x)
16 #     print(kwargs)
17 #
18 #
19 # test(1, y=2, z=3)   # {'y': 2, 'z': 3}
20 
21 
22 # def test(x, *args, **kwargs):
23 #     print(x)
24 #     print(args)
25 #     print(kwargs)
26 #
27 #
28 # test(1, 2, 3, 4, 5, y=1, z=2)
29 # test(1, *[1, 2, 3], **{'y': 1})
 1 def test(x, *args, **kwargs):
 2     print(x)
 3     print(args)
 4     print(kwargs)
 5 
 6 
 7 test(1, 2, 3, 4, 5, y=1, z=2)   # 1 (2, 3, 4, 5) {'y': 1, 'z': 2}
 8 test(1, *[1, 2, 3], **{'y': 1})   # 1 (1, 2, 3) {'y': 1}
 9 test(1, [1, 2, 3], **{'y': 1})   # 1 ([1, 2, 3],) {'y': 1}
10 test(1, 2, 3, {'name': 'eric'})   # 1  (2, 3, {'name': 'eric'}) {}
不定长参数

局部变量与全局变量

1、局部变量:子程序中的变量(有缩进)

2、全局变量:没有缩进,在全局都可以使用

 1 # 局部与全局变量
 2 # name = "火爆哥"
 3 #
 4 #
 5 # def change_name():
 6 #     global name  # ------>其实是指针指向全局变量name的值
 7 #     name = "帅的一比"
 8 #     print('change_name', name)
 9 #
10 #
11 # change_name()
12 # print(name)
13 
14 # name = "刚娘"
15 #
16 #
17 # def weihou():
18 #     name = "陈卓"
19 #
20 #     def weiweihou():
21 #         nonlocal name  # ----->nonlocal指针指向name="陈卓"(上一级) global是指向全局的变量name = "刚娘"
22 #         name = "冷静"
23 #     weiweihou()
24 #     print(name)
25 #
26 #
27 # print(name)  # 刚娘
28 # weihou()     # 冷静
29 # print(name)  # 刚娘

前向引用

 1 # def bar():
 2 #     print('from bar')
 3 #
 4 #
 5 # def foo():
 6 #     print('from foo')
 7 #     bar()
 8 #
 9 #
10 # foo()
11 
12 
13 # def foo():
14 #     print('from foo')
15 #     bar()
16 #
17 #
18 # def bar():
19 #     print('from bar')
20 #
21 #
22 # foo()
23 # 从这里可以说明函数即变量
24 # foo = '函数体'

函数递归(先搞个简单的例子,后期持续更新中)

记住:一层层的进去然后再一层层的返回来(要有点节制,不能无穷无尽,官方说1300多层左右貌似)

递归:函数自己调用自己,且有终止条件即可

1 def clac(n):
2     print(n)
3     if int(n / 2) == 0:
4         return n
5     return clac(int(n / 2))
6 
7 
8 res = clac(10)
9 print(res)

上图来说

 函数作用域

 1 name = 'china'
 2 
 3 
 4 def foo():
 5     # name = 'sichuan'
 6 
 7     def bar():
 8         # name = 'chengdu'
 9         print(name)
10     return bar
11 
12 
13 a = foo() # ---->bar
14 print(a)  # bar 内存地址
15 a()       # a()==foo()() 执行bar()函数找name一层层找
原文地址:https://www.cnblogs.com/Alexephor/p/11188277.html