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开头