5.8 notes and assignments

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()

Added by vadercole on Thu, 14 Nov 2019 18:08:20 +0200