1 # File : learning_09_function.py
2 # Datetime : 2022/4/10 0010 16:20
3 import math
4
5
6 # 函数:
7 # 是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
8
9 # 函数的作用
10 # 1. 减少重复代码
11 # 2. 使程序变的可扩展,保持代码一致性
12 # 3. 使程序变得易维护
13
14
15 # 1. 函数的创建
16 # 语法格式
17 # def functionname([parameterlist]):
18 # ['''comments''']
19 # [functionbody]
20 # 参数说明
21 # functionname: 函数名称,在调用函数时使用
22 # parameterlist: 可选参数,用于指定向函数中传递的参数.\
23 # 如果有多个,各参数间使用逗号分割,如果不指定则表示该函数没有参数,在调用时也不指定参数
24 # comments: 可选参数,表示为函数添加注释,注释的内容通常是说明该函数的功能,要传递参数的作用等
25 # functionbody: 可选参数,用于指定函数体,即该函数被调用后要执行的功能代码,如果函数有返回值则使用return语句返回
26
27 def print_ok():
28 """
29 打印OK
30 """
31 print("OK")
32
33
34 print_ok()
35
36
37 # 2. 参数传递
38 # 形参:在定义函数时,函数名后面括号中的参数为形式参数,也称为 形参
39 # 实参:在调用函数时,函数名后面括号中的参数为实际参数,也称为 实参
40 def add_number(a, b):
41 print(a + b)
42
43
44 add_number(3, 5)
45
46
47 # 3. 参数位置
48 # 3.1 实参数量必须与定义函数时形参数量一致
49 # 3.2 位置必须与定义时一致(如:定义函数时函数类型分别有int和str类型,调用函数时需要和定义参数类型一致)
50 def print_info(name, age):
51 print("我的名字叫%s,我今年%d岁" % (name, age))
52
53
54 print_info("xiaoming", 18)
55 # 4. 关键字参数
56 # 关键字参数是指使用形参的名字来确定输入的参数值,同个该方式指定实参,不再需要与形参的位置完全一致
57 print_info(age=18, name="xiaomei")
58
59
60 # 5. 为参数设置默认值
61 # 调用函数时,如果没有指定某个参数将抛出异常,
62 # 即在定义函数时,直接指定形式参数的默认值,
63 # 当调用函数没有传入参数时,则直接使用定义函数时设置的默认值
64 def print_info2(name, age=18):
65 print("我的名字叫%s,我今年%d岁" % (name, age))
66
67
68 print_info2("zhangsan")
69
70
71 # 6. 可变参数
72 # 可变参数也称为不定长参数,即传输函数中的实际参数可以是0个,1个,2个到任意个
73 # 定义可变参数有两种形式
74 # 6.1 *parameter 表示接受任意多个实际参数并将其放到一个元组中
75 # 6.2 **parameter 表示接受任意多个显示赋值的实际参数,并将其放到一个字典中
76 def addnumber(*args):
77 sum1 = 0
78 for i in args:
79 sum1 += i
80 print(sum1)
81
82
83 addnumber(1, 2, 3, 4, 5)
84
85
86 def print_infos(**kwargs):
87 for item in kwargs:
88 print("%s:%s" % (item, kwargs[item]))
89
90
91 print_infos(name="张三", age=18, height=180)
92
93
94 def print_info_full(*args, **kwargs):
95 sum2 = 0
96 for i in args:
97 sum2 += i
98 print("求和结果为%d" % sum2)
99 for item in kwargs:
100 print("%s:%s" % (item, kwargs[item]))
101
102
103 print_info_full(1, 2, 3, name="张三", age=18, height=180)
104
105
106 # 函数参数传递顺序
107 # def fun_name(parameter, default_parameter=default_value, *args, **kwargs):
108 # """
109 # 参数说明
110 # :param parameter: 固定参数
111 # :param default_parameter: 默认值参数
112 # :param args: 元组类型参数
113 # :param kwargs:字典类型参数
114 # :return:
115 # """
116 # pass
117
118 # 7. 函数的返回值
119 # 要想获取函数的执行结果,就可以用return语句把结果返回
120 # 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,即 return语句代表着函数的结束
121 # 如果未在函数中指定return,那这个函数的返回值为None
122 # return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出。
123
124 def number_sun(a, b):
125 return a + b
126
127
128 c = number_sun(1, 2)
129 print(c)
130
131 # 8.变量的作用域
132 # 变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,在访问时就会出现错误.
133 # L:local,局部作用域,即函数中定义的变量;
134 # E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
135 # G:globa,全局变量,就是模块级别定义的变量;
136
137 # B:built-in,系统固定模块里面的变量,比如int, bytearray等。
138 # 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
139 x = int(2.9) # int built-in
140 g_count = 0 # global
141
142
143 def outer():
144 o_count = 1 # enclosing
145
146 def inner():
147 i_count = 2 # local
148 print(o_count)
149
150 # print(i_count) 找不到
151 inner()
152
153
154 outer()
155 # print(o_count) #找不到
156
157 # 作用域产生:在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
158 # 其它的代码块(如if、try、for等)是不会引入新的作用域的
159 # global关键字
160 # 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,
161 # 当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下:
162 count = 10
163
164
165 def outer():
166 global count
167 print(count)
168 count = 100
169 print(count)
170
171
172 outer()
173
174
175 # nonlocal关键字
176 # global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,
177 # 当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量怎么办呢,这时就需要nonlocal关键字了
178 def outer():
179 count = 10
180
181 def inner():
182 nonlocal count
183 count = 20
184 print(count)
185
186 inner()
187 print(count)
188
189
190 outer()
191
192 # 9. 匿名函数
193 # 匿名函数是指没有名字的函数,它主要应用在需要一个函数,但是又不想费神去命名这个函数的场合.通常这样的函数只使用一次.
194 # 语法格式
195 # result = lambda [arg1 [,arg2,...argn]] : expression
196 # 参数说明:
197 # result 用于调用lambda表达式
198 # [arg1 [,arg2,...argn]] 可选参数,用于指定要传递的参数列表,多个参数使用逗号分隔
199 # expression 必选参数,用于指定一个实现具体功能的表达式,如果有参数,那么在该表达式中将应用这些参数
200 r = 10 # 定义圆的半径
201 result = lambda r: math.pi * r * r
202 print("圆的面积为%0.2f" % result(r))
203
204
205 # 递归函数
206 # 在函数内部调用自身本身,这个函数就是递归函数。
207 # 斐波那契列数(这个数列从第3项开始,每一项都等于前两项之和。)
208 def fibonacci_number(num):
209 if num <= 1:
210 return num
211 return fibonacci_number(num - 1) + fibonacci_number(num - 2)
212
213
214 print(fibonacci_number(9)) # 输出第10个数 输入9因为是以0开头