内置函数
1.help()
help:返回对象的帮助信息
help(str)
2.id()
id:返回一串相当于内存地址的数字
s = '春游去动物园'
print(id(s)) # 30058944
3.int()
int:根据传入的参数创建一个新的整数
类型转换、进制转换
print(int()) # 0 #不传入参数时,得到结果0。
print(int('2')) # 2
4.isinstance()
isinstance:判断对象是否是类或者类型元组中任意类元素的实例(判断数据类型)
print(isinstance(1, int)) # True
print(isinstance(1, str)) # False
print(isinstance(1, (int, str))) # True
5.pow()
pow:幂指数
print(pow(10,3)) # 1000
6.round()
round:对浮点数进行四舍五入求值
print(round(3.1415926)) # 3
print(round(45.55631,2)) # 45.56 第二个参数控制需要保留几位小数部分
7.sum()
sum:求和
print(sum([1,2,3,4,45,6])) # 61
可迭代对象
什么是可迭代对象
简单的理解是可以用for循环的对象,就是可迭代对象。比如:list,字符串,dict,元组,生成器等。
Python中,列表、元组、字典、集合、字符串等类型的数据可以使用for ..in...的语法从其中依次取到
数据来使用,这样的过程称为遍历,也叫迭代。
判断对象是否为可迭代的
使用isinstance判断一个对象是否为可迭代对象(Iterable)
from collections import Iterable #需要导包
print(isinstance([1, 2, 3], Iterable)) # 列表为可迭代对象
True
print(isinstance({1, 2, 3}, Iterable)) # 集合为可迭代对象
True
print(isinstance(100, Iterable)) # 整型不是可迭代对象
False
可迭代对象的本质
分析迭代的过程,可发现:每迭代一次(即在for…in…中每循环一次),都会返回对象中的下一条数据,
一直向后读取,直到迭代完全部数据才结束。
在迭代过程中,应该有一个“记录员”去记录每次访问到第几条数据,以便每次迭代都可以返回下一条数据。
Python将这个“记录员”称为迭代器。可迭代对象的本质是:这个对象提供给用户一个迭代器,来帮助用户在
遍历对象时使用。
可迭代对象通过__iter__方法通过给我们一个迭代器。当用户在迭代一个可迭代对象时,实际上就是先获
取该对象提供的迭代器,然后通过这个迭代器来一次获取对象中的每一个数据。
具备__iter__方法的对象,就是一个可迭代对象。
"""
属于可迭代对象的有
字符串、列表、字典、元组、集合、文件对象
可迭代对象其实就是为了后续迭代取值做准备
提供了不依赖于索引取值的方式
"""
iter()与next()
对于可迭代对象,可以使用iter()函数得到这些可迭代对象的迭代器,然后对迭代器使用next()函数来获
取下一条数据。(iter()函数调用了可迭代对象的__iter__方法)
list1 = [1, 2, 3] # 可迭代对象
list1_iter = iter(list1) # list1使用__iter__方法,形成迭代器list1_iter
print(next(list1_iter))
1
print(next(list1_iter))
2
print(next(list1_iter))
3
next(list1_iter)
StopIteration
在使用next()迭代完最后一个元素后,再次调用next就会抛出StopIteration异常,以此来告诉我们所
有元素均迭代完成。
迭代器对象
什么是迭代器对象
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集
合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这
就是迭代器
迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,因此
不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从
集合中的第一个元素开始访问,直到所有的元素被访问完。迭代器有两个方法:iter()和next()方法。
内部实现了__iter__,__next__方法,可以被next函数调用并不断返回下一个值的对象称为迭代器对象,
迭代器对象也可以使用for循环
迭代器的优点:节约内存,方便操作
迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值
可以被next()函数调用并不断返回下一个值得对象称为迭代器(Iterator对象)
可以使用isinstance()函数判断一个对象是否是Iterator对象
isinstance(object,type)
Iterator转换
可以通过Iter()函数将list、tuple、dict、string转换为Iterator对象(迭代器对象)
a = iter([1, 2, 3, 4, 5])
print(next(a)) # 1
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
#结果
True
True
True
True
判断对象是否是迭代器
from collections import Iterator # 需要导包
a = [1, 2, 3, 4, 5]
print(isinstance(iter(a), Iterator)) # True
print(isinstance([], Iterator)) # False []是可迭代对象,不是迭代器
print(isinstance({}, Iterator)) # False {}是可迭代对象,不是迭代器
print(isinstance((), Iterator)) # False ()是可迭代对象,不是迭代器
print(isinstance(set(), Iterator)) # False set()是可迭代对象,不是迭代器
print(isinstance("", Iterator)) # False ""是可迭代对象,不是迭代器
迭代器补充
1.有很多双下方法其实都有简便写法 但不是全部
"""
__方法名__ 等价 方法名()
最为常见的两个是
__iter__ iter()
__next__ next()
"""
2.有一些可迭代对象本身也是迭代器对象>>>:文件对象
3.可迭代对象调用一次__iter__方法编程迭代器对象 如果继续调用 结果还是迭代器对象本身
res = s.__iter__()
res1 = s.__iter__().__iter__().__iter__()
print(res, res1) # <str_iterator object at 0x10762bdd8> <str_iterator object at 0x107636dd8>
4.迭代取值
a = '春游去动物园'
print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值
print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值
print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值
res = a.__iter__() # 已经变成迭代器对象了
print(res.__iter__().__next__()) # 春 之后再调用还是自身
print(res.__iter__().__next__()) # 游
print(res.__iter__().__next__()) # 去
print(res.__iter__().__next__()) # 动
print(res.__iter__().__next__()) # 物
print(res.__iter__().__next__()) # 园
可迭代对象,迭代器和生成器之间的关系
for循环的内部原理
lists = [1, 2, 3, 4, 5, 6, 7]
'''需求:不依赖于for循环 完成对列表元素的取值'''
iterator_ = iter(lists)
n = 0
while n < len(lists):
print(next(iterator_), end='')
n += 1
执行结果
1234567
for循环的本质
lists = [1, 2, 3, 4, 5, 6, 7]
# 1.先转换成迭代器对象
iterator_ = iter(lists)
# 2.迭代取值
while True:
try:
print(next(iterator_), end='')
except StopIteration as ret:
# 结束while循环
break
"""
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
"""
异常处理
异常简介
异常是指在语法正确的前提下,程序运行时报错就是异常。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行
异常信息的组成部分
'''报错信息
File "D:\pythonproject\test\1.py", line 308, in <module>
print(name)
NameError: name 'name' is not defined
'''
1.line关键字所在的一行
用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
'''如果报错的信息很长 一般最后一个才是'''
2.NameError错误的类型
代码的报错也可以分为很多类型
3.name 'name' is not defined
具体的报错原因(就是解决报错的答案)
异常类型
异常处理
与python异常相关的关键字
raise:手动抛出/引发异常
try/except:捕获异常并处理
pass:忽略异常
as:定义异常实例(except IOError as e)
finally:无论是否出现异常,都执行的代码
else:如果try中的语句没有引发异常,则执行else中的语句
详细
1.结合else使用
当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
try:
可能会出错的代码
except Exception as e:
统一的处理措施
else:
可能会出错的代码没有出错 最后走else子代码
2.结合finally使用
无论try检测的代码是否有异常 最后都会执行finally子代码
try:
name
except Exception as e:
print(e)
finally:
(代码块)
无论try检测的代码是否有异常 最后都会执行finally子代码
3.整合使用
try:
name
except Exception as e:
print(e)
else:
print('11111')
finally:
print('22222')
4.主动报错
raise NameError('春游去动物园')
'''由于是主动报错 所以可以非常明确的知道错误的类型'''
迭代取值与索引取值的对比
1.索引取值
优势:可以反复获取相同的元素 并且没有固定的方向
劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高
2.迭代取值
优势:兼容所有的容器类型
劣势:取值的顺序永远都是从左往右 并且无法重复获取 去完就完了
"""
迭代器里面的东西是固定的 没取一个就会少一个 去完就空了
"""