1.描述符

1.描述符就是将某种特殊类型的类的实例指派给另一个类的属性,特殊类型的类即实现下面某个或者全部的方法

  • 访问属性 __get__(self,instance,owner)返回属性的值
  • 分配属性时调用 __set__(self,instance,value)无返回值
  • 删除时 __delete__(self,instance) 无返回值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class A:
    def __get__(self,instance,owner):
    print('__get__', instance, owner)
    def __set__(self,instance,value):
    print('__set__', instance, value)
    def __delete__(self,instance):
    print('__delete__', instance)
    class Test:
    x = A()
    t = Test()
    t.x # __get__ <__main__.Test object at 0x000002B03BE9A550> <class '__main__.Test'>
    print(t) # <__main__.Test object at 0x000002785C3FA550>
    print(Test) # <class '__main__.Test'>
    t.x = 20 # __set__ <__main__.Test object at 0x000002785C3FA550> 20
    del t.x # __delete__ <__main__.Test object at 0x0000024B0EC0A550>

2.描述符与property(property()函数就是描述符类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MyProperty:
def __init__(self,fget = None,fset = None,fdel = None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self,instance,owner):
return self.fget(instance)
def __set__(self,instance,value):
self.fset(instance,value)
def __delete__(self,instance):
self.fdel(instance)
class A:
def __init__(self):
self.num = None
def getNum(self):
return self.num
def setNum(self, value):
self.num = value
def delNum(self):
del self.num
x = MyProperty(getNum,setNum,delNum) # 与property类似
a = A()
a.x = 20
print(a.x) # 20
print(a.num) # 20
del a.num

3.列表生成式

可用range(1,n)生成[1,2,3….n]的列表

1
2
>>> list(x * x for x in range(1,11))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

4.迭代

通过for循环称为迭代

1
2
3
4
5
6
7
a = {"语文":90,"数学":100,"python":100}
for k,v in a.items():
print("%s-->%d" %(k, v))
--------------
语文-->90
数学-->100
python-->100

1.Iterable判断对象是否可迭代对象

1
2
3
4
from collections import Iterable
a = {"语文":90,"数学":100,"python":100}
flag = isinstance(a,Iterable)
print("对象是否可迭代:" , flag) # True

5.生成器generator

可以通过列表生成式生成列表,也可通过生成器generator一边循环一边计算的机制生成列表

1
2
3
4
5
6
7
8
9
a = (x * x for x in range(1,11))
print(a) # a为生成器
print(next(a))
print(next(a))
next(a)没有下一个元素会抛出StopIteration异常
------------------
b = (x * x for x in range(1,11))
for item in b:
print(item)

1.yield语句

遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
方法中出现yield则说明这个函数不是普通函数而是一个generator
yield 返回后面的值相当于return

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def fun():
print('one print')
yield 111
print('two print')
yield 222
print('three print')
yield 333
f = fun()
for item in f:
print('item的值为%d' % item)
-----------
one print
item的值为111
two print
item的值为222
three print
item的值为333