Write a singleton mode
class Stu(): def __new__(cls, *args, **kwargs): if not hasattr(cls,'inst'): cls.inst=object.__new__(cls) return cls.inst def show(self,name): self.name=name zs=Stu('Zhang San') ls=Stu('Li Si') print(zs is ls) print(zs==ls)
__call to write a Fibonacci sequence
class Feibo(): def __init__(self): pass def __call__(self,n): a,b=1,1 lb=[] if n==1: lb.append(1) elif n==2: lb.append(1) lb.append(1) else: x=1 while x<=n: lb.append(a) a,b=b,a+b x+=1 return lb a=Feibo() print(a(5))
3. How to destroy an object
4. Write the method of str
class A(): def __init__(self,name,age): self.name=name self.age=age def __str__(self): return 'My name is{},This year{}year'.format(self.name,self.age) def __repr__(self): return 'Full name{},Age{}'.format(self.name,self.age) zs=A('Zhang San',19) ls=A('Li Si',10) print('%s'%zs)#Call str print('%r'%ls)#Call repr. When str is not available, call repr by default
5. Hash() function
class A(): def __init__(self,name,age): self.name=name self.age=age def __eq__(self, other): return self.__dict__==other.__dict__ def __hash__(self): return hash(self.name) a=A('Zhang San',19) b=A('Li Si',20) c=A('Zhang San',19) d={a,b,c} print(a==c)#True print(a is c)#False, different address print(d)
issubclass(B, A) determines whether B is A subclass of A
isintance (c,A) judge whether c is an example of class A
enumerate function
a='abc' for x,y in enumerate(a): print(x,y)
dir, view available functions
print(dir([].__iter__())) print(dir({})) print(dir(()))
#Iterator is to print one by one to reduce memory consumption
a=[1,3,4] b=a.__iter__() print(next(b)) print(b.__next__()) a='123' b=list(a) c=tuple(a) print(c)
Write a Fibonacci sequence by iteration
class Feibo(): def __init__(self,num): self.num=num self.current=1 self.a=1 self.b=1 def __iter__(self): return self def __next__(self): if self.current<=self.num: ret=self.a self.a,self.b=self.b,self.a+self.b self.current+=1 return ret else: raise StopIteration#Stop iteration for x in Feibo(5): print(x)
Generator, yeld generator, the principle is to stop at first, do other things, and then come back
def han(): i=0 while i<10: yield i i+=1 b=han() print(next(b)) print(next(b))
##eg:
def hanshu(): yield 1 yield 2 a=hanshu() print(next(a)) print(next(a))
##Use of send method
def bingqilin(): a=0 b=yield a print('b-----',b) yield 2 yield 3 x=bingqilin() print(next(x))#0 y=x.send(999)to B Assign 999 and 2 to y print(y)#2 print(next(x))#3
#send method eg
def jisuan(): get_num=0 count=1 avg=0 total=0 while True: get_num=yield avg total=total+get_num avg=total/count count+=1 b=jisuan() next(b) print(b.send(10)) print(b.send(20)) print(b.send(30))
eg:
def qushu(): for x in 'abc': yield x for x in range(5): yield x b=qushu() for i in b: print(i)
Use of yeld from
def gen(): yield from 'asf' yield from range(3) for x in gen(): print(x)
#Expressions for generators
a=[i for i in range(3)] print(a)#[0,1,2] c=(i for i in range(3))#Generator Expressions print(c)
Decorator
Three elements of closure
1. Closure function, must have nested function
2. For embedded functions, the variables of the outer function must be referenced
3. The closure function returns the address of the embedded function (function name)
def hanshu1(tax): name='Zhang San' def hanshu2(a,b): c=(a+b)*tax return c print(hanshu2.__closure__)#Judge whether it is a closure function, with call it is a closure return hanshu2 a=hanshu1(0.2) y=a(5,6) print(y)#0.2*(5+6) b=hanshu1(0.3) z=b(5,6) print(z)#0.3*(5+6)
Decorator
import time def hehe(f): def haha(): a=time.time() print('11111') f()##The meaning of this sentence is to jump back to the modified function, execute the modified function, and then execute the following statement b=time.time() print('2222222222',b-a) return haha @hehe#The function hs is used to modify hehe, so first find hehe def hs(): print('start') he=0 for i in range(5): he+=1 print('End') hs() @hehe##(the meaning of this sentence is to modify the hehe function with hs1, so find the hehe function first.) def hs1(): print('iiiiiiiii') print('yyyyyyyyy') hs1()
#eg:
def decor(f): def neibu(*args,**kwargs): print('****') f(*args,**kwargs) print('*****') return neibu @decor def yanchanghui(*args,**kwargs): print(args) for x in args: print(x,end=' ') print() print(kwargs) for k,v in kwargs.items(): print(k,v) print('Vocal concert') yanchanghui('Lau Andy','Sherry',age=18,address='Guangzhou')
Decorator with return value
def decor(f): def neibu(name,age): print('***')#1 r=f(name,age) print('******')#4 return r#5 return neibu @decor def hanshu(name,age): print(name,age,'Concert')#2 return name+str(age)#3 x=hanshu('Lau Andy',19) print(x)
eg:
from functools import wraps def decor(f): @wraps(f) def neibu(name,age): print('***') r=f(name,age) print('*****') return r return neibu @decor def hanshu(name,age): ''' :param name: :param age: :return: ''' print(name,age,'Concert') return name+str(age) x=hanshu('Lau Andy',19) print(x) print(hanshu.__doc__) print(hanshu.__name__)
eg:
def decor1(func): def neib(name,age): print('1') ret =func(name,age) print('2') return ret return neib def decor2(func): def neib(name,age): print('1#') ret=func(name,age) print('2#') return ret return neib @decor1 @decor2 def hello(name,age): print('hello') return name+str(age) ret=hello('Lau Andy',19) print(ret)
property method
class Stu(): def __init__(self,name,age): self.name=name self.__age=age @property def message(self): print('I am here') return self.__age @message.setter def message(self,x): print('11111') self.__age=x s=Stu('Zhang San',19) s.message=29 print(s.message) print(s.name)
task
1. Iterator exercise
class PrimeNumbers: def __init__(self, start, end): self.start = start self.end = end def isPrimeNum(self, k): if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.end + 1): if self.isPrimeNum(k): yield k for x in PrimeNumbers(1, 10): print(x)
2. Generator practice
Generator exercises
def read_file(fpath): BLOCK_SIZE = 6 with open(fpath, 'r') as f: while True: block = f.read(BLOCK_SIZE) if block: yield block else: return import os g = read_file(os.getcwd() + '\\aa.txt') for content in g: print(content)
3. Decorator practice
from sys import stdout def forever(fun): def inner(): print("loop") while True: # nonlocal n n = input("Enter the number of rows in the upper triangle of the diamond:") if n == "q" or n == "exit": print("Program exited!") break fun(n) return inner def verify_number(fun): def inner(n): print("Verify the validity of the input") if isinstance(n, int) or n.isdigit(): # Determine whether the string is composed of pure integer numbers n = int(n) fun(n) else: print("Please input integer!!!") return inner @forever @verify_number def print_diamond(n): for i in range(1, n + 1): for j in range(1, n - i + 1): stdout.write(' ') for k in range(1, 2 * i - 1 + 1): stdout.write('*') print() for i in range(1, n - 1 + 1): for j in range(1, i + 1): stdout.write(' ') for k in range(1, 2 * (n - i) - 1 + 1): stdout.write('*') print() print_diamond()