面向对象(上)
推导式
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
基本格式为: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
列表推导式
a = [i for i in range(30) if i % 3 == 0]
print(a)
Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
字典推导式
实例:
例:快速交换key和value
d = {'a': 10, 'b': 34}
d_dome = {v:k for k, v in d.items()}
print (d_dome)
# Output: {10: 'a', 34: 'b'}
集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
实例:
dome = {x**2 for x in [1, 1, 2]}
print(dome)
Output: set([1, 4])
迭代器Iterator
迭代器
- 迭代器是访问可迭代对象的工具
- 迭代器是指用iter(obj)函数返回的对象(实例)
- 迭代器是指用next(it)函数获取可迭代对象的数据
-
注意:
1.迭代器只能往前取值,不会后退
2.用iter函数可以返回一个可迭代对象的迭代器,如果无法获取下一条记录,则触发stoptrerator异常
示例:
list = [1, 2, 3, 4, 5, 6]
l = iter(list)
print(next(l))
print(next(l))
isinstance() 检查一个对象是否是另一个对象的实例```
print(isinstance(lst,Iterable)) # True
print(isinstance('123',Iterable)) # True
print(isinstance(123,Iterable)) # False
print(isinstance(g,Iterable)) # True
迭代器用途
用迭代器可以依次访问可迭代对象的数据
示例:
list = [2, 3, 5, 7]
it = iter(list)
while True:
x = next(it)
print(x)
注意:超出取值范围会报错
生成器
生成器定义
一边循环一边计算的机制,称为生成器:generator。
为什么要有生成器
简单一句话:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
如何创建生成器
第一种方法很简单,只要把一个列表生成式的**[]改成()**,就创建了一个generator:
实例:
列表生成式
l=[xx for x in range(10)]
print(l)
生成器
l=(xx for x in range(10))
print(l)
生成器的工作原理
(1)生成器(generator)能够迭代的关键是它有一个next()方法,
工作原理就是通过重复调用next()方法,直到捕获一个异常。
(2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
可用next()调用生成器对象来取值。next 两种方式 t.next() | next(t)。
可用for 循环获取返回值(每执行一次,取生成器里面一个值)
(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。
(3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
(4).send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
可迭代对象,迭代器和生成器三者之间的关系
可迭代对象:可以进行for循环都是可迭代对象,原因是其内部实现了一个__iter__方法
迭代器:能够进行next(迭代器对象),都是迭代器对象,其内部实现了__iter__和__next__方法
生成器:元祖推导式和函数里使用yield的函数都是生成器
生成器属于迭代器
迭代器属于可迭代对象
类
类的简介
面向对象中两个重要的概念:
1.类 :对一类事物的描述,是抽象的、概念上的定义。比如做石膏像的模型
2.对象:实际存在的该类事物的每个个体,因而也称实例(instance)。比如石膏像
二者的关系:对象是由类派生的、创建的。一个类可以创建无穷多个对象,每个对象都属于类。
定义一个简单类
‘’’
class 类名([父类]):
代码块
‘’’
class MyClass:
pass