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 #这样就可以实现生成器数据的传输与访问

 

posted @ 2020-10-09 19:45  想活出点人样  阅读(131)  评论(0编辑  收藏  举报