可迭代对象
- 我们可知list、tuple、dict、set、str等类型的数据使用for…in…的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
- 所以我们把可以通过for…in…这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。
推导式
- 推导式分为
列表推导式、字典推导式、集合推导式等。
在这里我们主要说其中一种也是用的最多列表推导式 - 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表简单理解就是由一个旧的列表来构建出一个新的列表
#[表达式 for 变量 in 旧列表]
#[表达式 for 变量 in 旧列表 if 条件]
list1 = [11,20,30,45,54]
list2 = [a * 2 for a in list1]
list3 = [b + 1 for b in list1 if b %3 == 0]
print(list2)
print(list3)
运行结果:
生成器
- 背景
通过列表推导式我们可以直接创建出一个列表,但是受到内存的限制,我们不可能创造出一个无限大的列表。而且创建一个有200万个元素的列表,会占用很大的内存空间,而这个时候我们仅仅需要访问列表中几个元素,那么后面的元素就占用着空间就是一种浪费的行为。那么我们可不可以用几个元素就创建出几个元素。这样在一定程度上就优化了内存。那么在Python中有一种一边循环一边计算的机制就是生成器
#生成器,方式一,推导式
list1 = [x for x in range(1,11)]
print(list1)
list2 = (x for x in range(20))
print(list2,type(list2)) #<generator object <genexpr> at 0x00000000023DC308> <class 'generator'> 生成器类型
print(list2.__next__())
print(list2.__next__())
print(next(list2))
运行结果:
- 生成器取出数据是按顺序进行的,取出后,再次调用的时候就会从下一个数据开始。调用生成器,生成器类似一个容器,取出数据,类似于剪切,取出后,生成器中此数据已不再存在。
- 超出生成器范围,报错StopIteration,停止迭代。
list3 = (x for x in range(1,4))
print(next(list3))
print(next(list3))
print(next(list3))
print(next(list3))
# 生成器,方式二,函数方式
def new():
i = 0
while True:
i += 1
# return i
yield i #同return的阻塞效果,但是每次调用都会运行一次,yield是生成器的特征关键字
x = new()
print(x)
print(x.__next__())
print(next(x))
运行结果
- 生成器的特征
#生成器的特征,取出后就没有了
def new1():
for i in range(1,9):
yield i
y = new1() #生成器的对象
print(y)
list1 = [a for a in y] #遍历生成器的对象,实际内部使用的也是next的方式
list2 = [b for b in y]
print(list1)
print(list2)
迭代器
关系对应图
- 迭代器
迭代器是访问可迭代对象(可被遍历的类型)的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,指导所有元素被访问完结束。
可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
生成器是可迭代的,也是迭代器
列表是可迭代的,但不是迭代器
通过iter()函数可以将可迭代的变成一个迭代器
# 迭代器,利用iter方式将可迭代对象转换成迭代器
list1 = [1,2,3,4,5] #创建一个可迭代对象
xnew = iter(list1) #用iter方式生成迭代器
print(xnew,type(xnew))
list2 = [i for i in xnew]
list3 = [j for j in xnew]
print(list2)
print(list3)
a = 'michal jordan'
b = iter(a)
print(b,type(b))
print(b.__next__())
print(b.__next__())
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))
运行结果
面向对象(一)
1.面向对象的简介
- Python是一门面向对象的编程语言
- 所谓面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的
- 面向过程
1.妈妈穿衣服穿鞋出门
2.妈妈骑上电动车
3.妈妈到超市门口放好电动车
4.妈妈买西瓜
5.妈妈结账
6.妈妈骑电动车回家
7.到家孩子吃西瓜 - 面向对象的编程语言,关注于对象,不注重过程,对于面向对象一切皆对象。
- 以上的方式,可以用孩子妈妈给孩子买瓜来解决,孩子妈妈为对象,给她赋予一个买瓜的方法,面向对象,调用方法来解决操作。
- 面向对象的编程思想,将所有功能统一保存到对应的对象中,要使用某个功能,直接找到对应的对象即可
- 这种编码方式比较容易阅读,并且易于维护,容易复用。但是编写的过程中不太符合常规的思维,编写相对麻烦
2.类(class)
- 我们目前学习的都是Python的内置对象,但是内置对象并不都能满足我们的需求,所以我们在开发中经常要自定义一些对象
- 类简单理解它就是相当于一个图纸,在程序汇总我们需要根据类来创建对象。
- 类就是对象的图纸
- 我们也称对象是类的实例(instance)
- 如果多个对象是通过一个类创建的,我们称这些对象是一类对象
class NewClass(): #创建类
pass
mark1 = NewClass() #创建对象,类的实例化
print(mark1,type(mark1))
运行结果:
class NewClass(): #创建类
pass
mark1 = NewClass() #创建对象,类的实例化
print(mark1,type(mark1))
mark2 = NewClass()
mark3 = NewClass()
mark4 = str()
# isinstance() 检测是否属于此类的一个对象
x = isinstance(mark2,NewClass)
y = isinstance(mark4,NewClass)
z = isinstance(mark4,str)
print(x)
print(y)
print(z)
运行结果:
- 类也是一个对象,类就是用来创建对象的对象
- 可以像对象中添加变量,对象中的变量称之为属性 语法:对象.属性名 = 属性值
类的定义
- 类和对象都是对现实生活中事物的抽象
- 事物包含两部分
- 数据(属性)
- 行为(方法)
- 调用方法 对象.方法名()
- 方便调用和函数调用的区别:如果是函数调用,调用时有几个形参,就会传递几个实参。如果是方法调用,默认传递一个参数,所以方法中至少得有一个形参
- 在类代码块中,我们可以定义变量和函数
变量会成为该类实例的公共属性,所有的该实例都可以通过 对象.属性名的形式访问
函数会成为该类实例的公共方法,所有该类实例都可以通过 对象.方法名的形式访问
class Sameone():
heavy = '50kg' #属性
def sing(self): #能做的事,方法
print('我家住在桃花山,山上一棵桃花树')
return
def read(self):
print('本是青灯不归客 却因浊酒留风尘')
Alex = Sameone()
Mary = Sameone()
John = Sameone()
Alex.heavy = '45kg' #给实例对象添加属性的方式
print(Alex.heavy) #属性有新属性
print(Mary.heavy)
John.read() #实例对象调动类的方法
Mary.sing()
运行结果: