Python基础16 函数返回值 作用区域 生成器
1 #函数 2 3 #函数的返还值 4 #返还值有三种形式,无返还值,单一返还值,多返还值 5 6 #无返还值 7 #有时我们调用一个函数只是完成一个过程或者某个动作 8 #而不需要去设置返还值 9 10 def no_return (): 11 print("我不需要返还值哦"); 12 13 14 def no_return_2 (): 15 print("写个return就行了"); 16 return 17 18 def no_return_3 (): 19 print("return None"); 20 return None 21 22 no_return(); 23 no_return_2(); 24 no_return_3(); 25 #这里我们建立的这个函数就不需要返还值 26 #我们可以省略返还值,也可以只写一个return 或者加上None 27 28 #单返还值 29 def one_return (): 30 i=54188; 31 return i 32 33 print(one_return()); 34 #这就通过return产生了返还值 35 36 #注意,return后面是不能加;的!!!!!(我开始就搞错了) 37 38 #多返还值 39 #一般采用元组返还的方法,因为元组是不可以变的,比较安全 40 41 def tuple_return(): 42 Q1="哈噻!" 43 Q2="哈噻!" 44 Q3="hasaki!" 45 return (Q1,Q2,Q3) 46 47 print(tuple_return()[0]) 48 #这里我们就把这个返还值送了出来,而且他是稳定的 49 #而且这里开可以进行[]的索引 50 #我们也可以遍历元组 51 52 for i in tuple_return(): 53 print(i) 54 #也是可以直接使用的 55 56 def tuple_return(): 57 Q1="哈噻!" 58 Q2="哈噻!" 59 Q3="hasaki!" 60 return Q1+Q2+Q3 61 62 print(tuple_return()) 63 #如果是字符串的话还可直接加起来输出 64 #return后面是可以写运算的 65 #但是这样子就是去意义了,还是元组会更好 66 67 def tuple_return(): 68 Q1="哈噻!" 69 Q2="哈噻!" 70 Q3="hasaki!" 71 return [Q1,Q2,Q3] 72 print(tuple_return()) 73 #既然元组可以,那列表也是一定可以的 74 75 def tuple_return(): 76 Q1="哈噻!" 77 Q2="哈噻!" 78 Q3="hasaki!" 79 return {Q1,Q2,Q3} 80 print(tuple_return()) 81 #但是集合有点不一样了 82 #首先集合是一个无序不重复的结构 83 #所以我们这里保存来的Q1和Q2是重复的 84 #只会保留一个 85 86 #字典就算了吧,还要在里面构成字典的结构,麻烦得很,,, 87 88 print("////////////////////////////") 89 90 #函数的局部变量和全局变量问题 91 92 test = 100; 93 def hanshu_0 (): 94 print("局部变量test={0}".format(test)) 95 print("全局变量test={0}".format(test)) 96 hanshu_0() 97 #这里函数中直接调用的test是全局变量的test,也就是这个模块中可以随便使用 98 #局部变量就只能在设定的范围内起作用 99 #例如在函数中设置的变量就只能在函数中起作用 100 101 def hanshu_1 (): 102 test="不是100了哦!我现在是字符串了!" 103 print("局部变量test={0}".format(test)) 104 print("全局变量test={0}".format(test)) 105 hanshu_1() 106 #这里就让起作用的是局部变量了 107 #正所谓 108 #翔龙斗不过地头蛇 109 #在同时存在同名变量时,优先满足局部变量 110 111 test_2="测试是否改动了我" 112 def hanshu_2 (): 113 global test 114 # global test_2 = "改变!" 115 print("局部变量test={0}".format(test)) 116 print("全局变量test={0}".format(test)) 117 hanshu_2() 118 #这里使用的就不再时局部变量 119 #我们再test前面声明了gobal表明了这里test时调用的时全局变量 120 #同时我们发现global 变量 不能直接在函数中被改变 121 122 print('////////////////////////////') 123 124 #生成器 125 #新东西 126 #函数中间,我们一般使用return返还数据 127 #但是有时候我们可以使用yield关键字函数返回一个生成器(generator)对象 128 #生成器对象是可迭代对象 129 130 def fang(num): 131 for i in range(1,num+1): 132 yield i*i 133 134 for j in fang(5): 135 print(j) 136 #这里我们就生成了从1到5的数的平方 137 #而这里yield返还的值是一个一个可迭代的数据 138 139 #我们来验证一下 140 print(type(fang(1))) 141 #这里我们看到,这里生成的类型是generator生成器类型的 142 print(fang(5)) 143 #<generator object fang at 0x0000024D4721CF20> 144 #返还的是这样的数据 145 #我们除了可以使用for来调用还可以使用next来调用 146 #(但是不推荐,毕竟用for会更可靠也不用担心抛出错误) 147 print(next(fang(5))) 148 #他会就生成下一个的数据 149 #但是如果我们一直向下写呢? 150 print(next(fang(5))) 151 print(next(fang(5))) 152 print(next(fang(5))) 153 print(next(fang(5))) 154 #结果全都是1 155 #而没有向后面推 156 #这是因为这里生成器虽然建立了,但是每一次我们都是先调用函数 157 #这就导致了每一次都是重新建立并储存的数据 158 159 160 generator_0=(i*i for i in range(5)) 161 for j in generator_0: 162 print("生成器数据",j) 163 164 #这样我们就建立了一个生成器的数据 165 #它类似于列表的形式 166 #但是它比列表更简单,节省了内存空间 167 #而这样建立的数据,就可以用next一直向后推了 168 169 #print(next(generator_0)) 170 #但是这里却直接异常抛出了 171 #StopIteration 172 #原因是我们上面的for循环将generator中的数据遍历到了最后面 173 #所以我们再在这里使用next就直接超过了原有的数据列 174 #就会报错 175 176 #这个时候我们就要重置一下生成器了 177 #有三种方法 178 #第一种直接让生成代码重新运行 179 #第二种则是在生成这些代码的时候就建立数据的第二个版本 180 #这里我们就要使用itertool.tee 181 182 import itertools 183 generator_1=(i*i for i in range(5)) 184 yy,yyy = itertools.tee(generator_1) 185 for i in yy: 186 print("yy",i) 187 for j in yyy: 188 print("yyy",j) 189 #这样我们就通过itertools模块中的tee来给为generator建立了两个副本 190 #yy和yyy就已经和generator_1没有什么不同了 191 #但是它存在的类型却发生了变化 192 print(type(yy)) 193 #这里的类型是itertools. 194 195 #第三种方法就是转存,将数据转存到其他变量中保存下来 196 #然后就可以使用__next__()方法来操作了 197 198 199 def fang_2(num): 200 for i in range(1,num+1): 201 yield i*i 202 ccc=fang_2(5) 203 #这样ccc就保存了generator的值 204 #这里就可以使用到__next__()方法 205 print(ccc.__next__()) 206 print(ccc.__next__()) 207 print(ccc.__next__()) 208 print(ccc.__next__()) 209 print(ccc.__next__()) 210 #这样就可以实现生成器数据的传输与访问
悟已往之不谏,知来者之可追