# r r+ w w+ a(add in the eend b+
"""
# f = open('陈粒','r',encoding='utf-8') data = f.read() print(f.readable()) print(f.writable()) print(f.readline()) # just read one line each time print(f.readlines()) # read all the lines and put in a list print(data)
f = open('陈粒1','r+',encoding='utf-8') f.write('I have seen the desert raining\n') data = f.read() print(data) f.close()
"""
with open('chenli','r',encoding='utf-8') as sdr_s,with open('chenli1','w',encoding='utf-8') as dtr_s: data = sdr_s.read() dtr_s.write(data) f = open('dtr_s','r',encoding='utf-8') data = f.read() print(data)
#iterator and generator:satisfy the principle(__iter__(),means have the use of __next__()
# 1:
l = [1,2,3,4] iter_1 = l.__iter__() print(iter_1.__next__()) print(iter_1.__next__()) print(iter_1.__next__()) print(next(iter_1)) # next():the inner function of python;the same as iter_1.__next__() # 2: for i in l: #iter_1 = l.__iter__() print(iter_1.__next__()) print(i) # 3: print(l[2]) # 4:index index = 0 while index < len(l): print(l[index]) index += 1 # as for dict(return the key values) and files can also use the 'for' sentence
# ***************generator is iterator :
# 1:generator function(replace the return to yield and yield can retain the function's state)
def test(): print('start born:') print('start born:') print('start born:') yield 'me' print('born son') yield 'son' print('born grandson') yield 'grandson' g = test() print(g) print(g.__next__()) print(g.__next__()) print(g.__next__())
# 2: ternary expression:
# name = 'alex' name = 'zxver' res = 'SB' if name == 'alex' else 'beauty' print(res)
l = ['egg%s' %i for i in range (10)] l1 = ['egg%s' %i for i in range (10) if i < 5] print(l) print(l1) # use tuple l2 = ('egg%s' %i for i in range (10)) print(l2) print(l2.__next__()) print(l2.__next__()) print(l2.__next__()) print(l2.__next__()) print(next(l2))
# generator can save the memory: use tuple
print(sum(i for i in range(10000000)))
def produce_baozi(): for i in range(100): # return i yield 'sale a baozi%s' %i pro_g = produce_baozi() baozi1 = pro_g.__next__() print(baozi1) baozi2 = pro_g.__next__() print(baozi2) baozi3 = pro_g.__next__() print(baozi3) # yield can return mutiple numbers and can use the return value directly
def census(): with open('pop.py') as f: for line in f: p = eval(line) yield p['population'] c = census() #print(c.__next__()) #print(c.__next__()) #print(c.__next__()) #print(c.__next__()) all_pop = sum(i for i in c) print(all_pop) ###################calculate the rate:(no any return value cause the generator can just overall on time) for q in c: print(q/all_pop)
# send(self,value),can send the value to the last yield
def sen(): print('start') # yield 1 # firt = yield 1 firt = yield print('the next',firt) yield 2 s = sen() print(s.__next__()) # print(s.__next__()) # print(s.send(None)) print(s.send('value'))
# eat baozi:two separate section
import time def consumer(name): print('I %s start to eat baozi' %name) while True: baozi = yield time.sleep(1) print('%s is eat %s' %(name,baozi)) def producer(): c1 = consumer('zxver') c2 = consumer('alex') c1.__next__() c2.__next__() # c1.send('baozi') for i in range(10): time.sleep(1) c1.send('baozi %s' %i) c2.send('baozi %s' %i) producer()