Python基础篇---内置函数补充,迭代和异常

本章内容

       • 常见内置函数

       • 可迭代对象

       • 迭代器对象

       • 异常问题

       • for循环内部原理和本质

       • 迭代取值和索引取值的对比

常见内置函数


 1.help()  查看注释信息

help(len)  
输出 Return the number of items in a container.

2.id()  返回一串相当于内存地址的数字

print(id('1'))
输出 2294005398752

3.int()  类型转换、机制转换

print(int('22'))
输出 22
print(int(0b1100100))
输出 100

4.isinstance()  判断数据类型

s = 'str'
print(isinstance(s,int))
输出 False
print(isinstance(s,str))
输出 True

5.pow()  幂指数

print(pow(10,2))  # 10*10
输出 100
print(pow(3,4))   # 3*3*3*3
输出 81

6.round()  四舍五入

print(round(11, 1))  # 第二个参数控制需要保留几位小数部分
输出 11
print(round(11.128, 2))
输出 11.13
print(round(11.1234, 3))
输出 11.123

7.sum() 求和

s=sum([1,2,3,4,5,6,7,8,9])
print(s)
输出 45

 

 

可迭代对象


 1.认识可迭代对象之前我们要先知道什么是迭代?

迭代其实就是更新换代,每一次迭代的过程都需要依赖于上一次的结果,eg:游戏的更新。

迭代案列:

# 单纯的循环 不是迭代
import time
while True:
    print('单纯的循环,不是迭代')
    time.sleep(1)
# 属于迭代
n = 1
while True:
    print(n)
    n += 1  # 循环 且n的值是在上一次循环的n的基础上+1
# 迭代取值
l1 = [11, 22, 33, 44, 55]
n = 0
while n < len(l1):
    print(l1[n])
    n += 1

2.那我们知道了什么是迭代,那可迭代对象又是什么呢?

可迭代对象就是内置又__iter__方法的都可以称之为可迭代对象。

大白话理解就是数据可以通过点的方式点出来__iter__
__iter__该类代码的读法>>>:双下iter方法
  	千万不要读成杠杠iter杠杠、杠杠iter

 3.那可迭代对象有哪些数据类型呢?

我们可以列举出所学过的数据类型,依次尝试调用__iter__方法即可。

i = 11  # 整型不是
f = 11.11  # 浮点型不是
s = 'jason'  # 字符是
l = [1,2,3,4]  # 列表是
d = {'name':'jason','age':18}  # 字典是
t = (1,2,3,4)  # 元组是
se = {1,2,3,4,5}  # 集合是
b = True  # 布尔值不是
f = open()  # 文件是
def index():pass  # 普通函数不是

我们可以发现属于可迭代对象的数据类型有字符串、列表、字典、元组、集合和文件对象。

可迭代对象其实就是为了后续迭代取值做准备,提供了不依赖于索引取值的方式。

迭代器对象


 1.什么是迭代器对象?

迭代器对象就是可迭代对象调用__iter__方法后产生的结果。

2.迭代器对象的特征?

含有__iter__方法和__next__方法。

3.如何理解迭代器对象?

迭代器对象能够极大的节省存储空间,
类似于哆啦A梦的口袋,不用的时候就是一个口袋的面积,用的时候可以从中取出很多数据,
类似于工厂车间 你需要什么我就立刻造什么 你不需要我就不造 节省资源。

4.迭代器对象如何取值?

调用__next__方法即可 如果取完了则会直接报错!!!   
开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)。
'''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''

5.迭代器对象补充说明

♦ 双下方法的简编写法

"""
  __方法名__  等价  方法名()
      最为常见的两个是
          __iter__    iter()
          __next__    next()
"""
s = '123'
print(s.__iter__())  # <str_iterator object at 0x000001A1C23992E8>
print(iter(s))   # <str_iterator object at 0x000001A1C22BA4E0>
print(s.__len__())  # 3
print(len(s))  # 3

♦ 有些可迭代对象本身也是迭代器对象>>>:文件对象

s=open('b.txt')
s.__iter__()  # 内置有双下iter方法
s.__next__()  # 内置有双下next方法

♦ 可迭代对象调用一次__iter__方法变成迭代器对象 ,如果继续调用,结果还是迭代器对象本身

s =[]
res = s.__iter__()
res1 = s.__iter__().__iter__()
print(res, res1)  # <list_iterator object at 0x000001708FA592E8> <list_iterator object at 0x000001708FA59518>

♦ 迭代取值的要求

s = [1,2,3]
print(s.__iter__().__next__())  # 1  每次先产生一个新的迭代器对象然后取值
print(s.__iter__().__next__())  # 1  每次先产生一个新的迭代器对象然后取值
res = s.__iter__()   # res成了迭代器对象
print(res.__iter__().__next__())  # 1   res是迭代器对象,再调用还是自身 
print(res.__iter__().__next__())  # 2   res是迭代器对象,再调用还是自
print(res.__iter__().__next__())  # 3   res是迭代器对象,再调用还是自

异常问题


 1.什么是异常?

代码运行出错之后就是异常,异常会导致程序立刻停止 ,
我们还称其为'bug',是我们之后写代码需要规避的情况。

2.异常信息的组成部分

Traceback (most recent call last):
  File "E:/pythonProject/3.14/3.22.py", line 2, in <module>
    print(int(s))
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Flie 出错的文件路径
line 用于提示代码出错在哪一行 点击前方蓝色路径可以直接定位
TypeError  代码错误的类型,当前是数据类型的错误,代码的报错分很多类
nt() argument must be a string, a bytes-like object or a number, not 'list'  具体的报错原因

3.异常的分类

♦ 语法异常

在编写代码的时候语法异常是不被允许的,出现了就必须改正,例如:if分支语法,while语法等。

♦ 逻辑异常

可以允许的,如果出现了尽快修改即可。例如字符串类型却调用了列表的内置方法。

4.异常的类型(例举部分)

异常名称 错误类型
NameError 名字错误
IndexError 索引错误
KeyError 键错误
ValueError 值错误
IndentationError 缩进错误

5.异常处理实操

正常情况下代码出错肯定是直接导致程序停止,但是也可以自己通过代码来处理,从而避免程序的停止。

♦ 针对性的处理措施

try:
    可能会出错的代码
except 错误的类型1 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
except 错误的类型2 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
except 错误的类型3 as e:  # e指代的就是错误的提示信息

♦ 万能异常:常见的报错都可以照单全收

try:
    可能会出错的代码
except Exception as e:  
    统一的处理措施

♦ 主动报错(需要掌握)

raise NameError('不爽 就要作!!!')  # 由于是主动报错 所以可以非常明确的知道错误的类型

♦ 了解操作---结合else使用

当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
try:
    可能会出错的代码
except Exception as e:  
    统一的处理措施
else:
    可能会出错的代码没有出错 最后走else子代码

♦ 了解操作---结合finally使用

# 无论try检测的代码是否有异常 最后都会执行finally子代码
try:
    name
    print('1')
except Exception as e:
    print('a')
finally:
    print('b')
    # 无论try检测的代码是否有异常 最后都会执行finally子代码

♦ 了解操作---全部整合到一起使用

try:
      name
except Exception as e:
      print('1')  # 执行
else:
      print('没报错 好极了')  # 不执行
finally:
      print('管你错不错 都执行')  # 执行

♦ 了解操作---断言(了解中的了解)

name = 'jason'
assert isinstance(name,str)  # 不报错
assert isinstance(name,int)  # 报错
'''
assert 在表达式条件为 false 的时候触发异常
'''

for循环的内部原理和本质


 思考:不依赖于for循环,完成对下列列表元素的取值。

l = [11,22,33,44,55,66,77,88]
res = l.__iter__()  # res为迭代器对象,是l可迭代对象调用双下iter方法的返回值
n = 0
while n < len(l):
    print(res.__next__())  # 迭代输出
    n += 1

for循环底层原理:

 for 变量名 in 可迭代对象:
        循环体代码
会将in后面的数据调用__iter__()变成迭代器对象

针对产生的迭代器对象依次调用__next__()方法迭代取值

当值取完之后 会自动处理报错并退出循环

for循环的本质:利用while与异常捕获 实现for循环的功能

info = {'name': 'jason', 'age': 18, 'pwd': 123}
# 1.先转换成迭代器对象
# res  = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
    try:
        print(next(res))  # 当值不够的时候会报错 执行下方的异常捕获
    except StopIteration as e:
        # 结束while循环
        break

迭代取值与索引取值的对比


 1.索引取值

优点:可以反复获取相同的元素,并且没有固定的反向
缺点:只能支持有序的容器类型,无序的无法取值兼容性没有迭代取值高

2.迭代取值

优势:兼容所有的容器类型
劣势:取值的顺序永远都是从左往右,并且无法重复获取,只能获取一次 

PS:真正底层的迭代取值后续可能很少用,一般都是for循环代替。

 

posted @ 2022-03-23 16:37  早安_1207  阅读(101)  评论(0)    收藏  举报
返回顶端