• 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 #这样就可以实现生成器数据的传输与访问
    悟已往之不谏,知来者之可追
  • 相关阅读:
    友链大集合
    雅礼学习10.7
    雅礼学习10.6
    雅礼学习10.5
    雅礼学习10.4
    雅礼学习10.3
    雅礼学习10.4
    雅礼学习10.2
    雅礼学习10.1
    如何让SublimeText3更好用
  • 原文地址:https://www.cnblogs.com/ljh-study/p/13787703.html
Copyright © 2020-2023  润新知