常见内置函数,可迭代对象,异常处理,for循环原理

1. 常见内置函数

# 1.help()  查看参数的信息
help(len)
# Help on built-in function len in module builtins:
#
# len(obj, /)
#     Return the number of items in a container.

# 2.id()  返回一串相当于内存地址的数字
print(id('python cat'))
# 1963185353136

# 3.int()  类型转换、机制转换
# 类型转换 能将字符串转换成int类型(字符串必须是纯数字的字符串)
print(int('111'))
# >>>111

# # 将其他机制转换成十进制
print(int('0b110010', 2))
# >>>50
print(int('0o62', 8))
# >>>50
print(int('0x32', 16))
# >>>50

# 4.isinstance()  判断数据类型
# 使用此类型判断,比较的笨,不推荐使用,有内置函数来帮你进行处理
print(type('python cat') is str)
# >>>True
print(isinstance('python cat', str))
# >>>True
print(isinstance('python cat', int))
# >>>False

# 5.pow()  幂指数
# pow() 第一个参数为值,第二个参数为值的多少次幂
print(pow(10, 2))
# >>>100
print(pow(10.21, 3))
# >>>1064.3322610000002

# 6.round()  四舍五入
# round() 第一个参数为值,第二个参数为控制需要保留几位小数部分
print(round(11))
# >>>11
print(round(11.29))
# >>>11
print(round(11.59, 1))
# >>>11.6

# 7.sum()求和
print(sum([11, 22, 2, 33, 44, 3, 2]))
# >>>117
print(sum((11, 22, 2, 33, 44, 3, 2)))
# >>>117
print(sum({1: '1', 2: '2'}))
# >>>3
print(sum({11, 22, 33, 44, 3, 2}))
# >>>115
print(sum({11, 22, 2, 33, 44, 3, 2}))
# >>>115  # 为什么为115?  集合是去重的,所有即使定义的时候有两个2,当使用时,会将其中一个2去除掉

 

2. 可迭代对象

 

# 1.什么叫迭代?
# 迭代其实就是更新换代
# 每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值

# 单纯的循环 不是迭代
import time
while True:
    print('python cat')
    time.sleep(1)
# 属于迭代
index = 1
while True:
    print(index)
    print('python cat')
    index += 1
    
# 迭代取值
index_list = [11, 22, 33, 44, 55]
n = 0
while n < len(index_list):
    print(index_list[n])
    n += 1

# 2.什么是可迭代对象?
# 变量中存在内置__iter__方法的都可以称之为是可迭代对象
"""
__iter__该类代码的读法>>>:双下iter方法
"""

# 3.哪些数据是可迭代对象?
# 列表所学数据类型
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  # 普通函数不是


"""
属于可迭代对象的有
    字符串、列表、字典、元组、集合、文件对象
可迭代对象其实就是为了后续迭代取值做准备
    提供了不依赖于索引取值的方式 即__next__方法
"""

 

3. 迭代器对象

# 1.什么是迭代器对象?
# 可迭代对象调用__iter__方法之后生成的结果,具有__next__()方法的对象。该方法能够自动返回下一个结果,当到达序列结尾时,引发nametopIteration异常就是迭代器对象
# 2.迭代器对象的特征
#     含有__iter__方法和__next__方法与当到达序列结尾时,引发nametopIteration异常
# 3.如何理解迭代器对象
#     迭代器对象能够极大的节省存储空间
# 4.迭代器对象如何取值
#     调用__next__方法即可 如果取完了则会直接报错!!!
#   支持对对象的多种遍历
#   备注:开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)
'''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''
# 5.迭代器对象补充说明
# 1.有很多双下划线方法其实都有简便写法,但并不是所有的双下划线方法都有简便写法
"""
  __方法名__  等价  方法名()
      最为常见的两个是
          __iter__    iter()
          __next__    next()
"""
name = 'python cat'
print(name.__iter__())
# >>><str_iterator object at 0x000002D21E3BA4C0>
print(iter(name))
# >>><str_iterator object at 0x000002D21E3BA4C0>
print(name.__len__())
# >>>10
print(len(name))
# >>>10
# 2.有一些可迭代对象本身也是迭代器对象>>>:文件对象
# 3.可迭代对象调用一次__iter__方法编程迭代器对象  如果继续调用 结果还是迭代器对象本身
name = name.__iter__()
print(name)
# >>><str_iterator object at 0x0000018F7F56A4C0>
name1 = name.__iter__().__iter__().__iter__()
print(name1)
# >>><str_iterator object at 0x0000018F7F56A4C0>

# 4.迭代取值的要求
name = 'python cat'
# 每次先产生一个新的迭代器对象然后取值
print(name.__iter__().__next__())  
# >>>p 
print(name.__iter__().__next__())  
# >>>p 
print(name.__iter__().__next__())  
# >>>p 
print(name.__iter__().__next__())  
# >>>p 
name = name.__iter__()
# 因为name已经是迭代器对象了,继续调用__iter__(),还是本身
print(name.__iter__().__next__())  
# >>>p
print(name.__iter__().__next__())  
# >>>y
print(name.__iter__().__next__())  
# >>>t
print(name.__iter__().__next__())  
# >>>h

 

4. 异常处理

# 1.什么是异常?
# 代码运行出错之后就是异常
# 异常会导致程序立刻停止
# 是我们以后在编程过程中需要极力避免的情况(异常的外号 >> >: bug)

# 2.异常信息的组成部分
# Traceback(most recent call last):
# File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in < module >
#     name
# NameError: name 'name' is not defined

# 1.line关键字所在的一行
# 用于提示你代码哪一行出错了
# 点击前面的蓝色字体可以直接定位
'''如果报错的信息很长 一般最后一个才是'''
# 2.NameError错误的类型
# 代码的报错也可以分为很多类型
# 3. name
# 'name' is not defined
# 具体的报错原因(就是解决报错的答案)

# 3.异常的分类
# 1.语法异常
# 不被允许的
# 如果出现了必须立刻改正
# SyntaxError: invalid syntax
# if 1, while:,
#     ...
# 2.逻辑异常
# 可以允许的
# 如果出现了尽快修改即可
name = 'python cat'
print(name.append())
# AttributeError 逻辑异常

# 4.异常的类型(有很多 不一一列举)
print(name)
# NameError     名字错误
index_list = [11, 22, 33]
print(l1[100])
# IndexError 索引错误
name_dict = {'name': 'python cat'}
print(name_dict['age'])
# KeyError  键错误
int('python cat')
# ValueError   值错误

'''有时候针对可能会出错的代码 也可以自己提前写好处理措施'''
# 正常情况下代码出错 肯定是直接导致程序停止
# 但是也可以自己通过代码来处理 从而避免程序的停止

# 基本语法结构
#     try:
#     可能会出错的代码
#   except 错误的类型1 as e:  # e指代的就是错误的提示信息
#     针对性的处理措施
#   except 错误的类型2 as e:
#     针对性的处理措施
#   except 错误的类型3 as e:
#     针对性的处理措施
#   ...
# 
# 错误类型
# 很多时候可能自己都不知道会报什么类型的错误
# '''万能异常:常见的报错都可以照单全收'''
# try:
#   可能会出错的代码
# except Exception as e:  
#   统一的处理措施
# 

'''
异常处理使用尊则
1. 被检测的代码越少越好
2. 能尽量少用就尽量少用
'''

 

5. 异常处理(了解)

# 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:6
    print('牛逼')
finally:
    print('傻逼')

    # 4.主动报错(需要掌握)
    raise NameError('确实牛')
'''由于是主动报错 所以可以非常明确的知道错误的类型'''

 

6. for循环内部原理

index_list = [11, 22, 33, 44, 55, 66, 77, 88]
'''需求:不依赖于for循环 完成对列表元素的取值'''
res = index_list.__iter__()
n = 0
while n < len(index_list):
    print(res.__next__())
    n += 1
"""
for循环底层原理
    for 变量名 in 可迭代对象:
        循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
"""
res = index_list.__iter__()
while True:
    print(res.__next__())

# 利用while与异常捕获 实现for循环的功能
info = {'name': 'python cat', 'age': 18, 'hobby': 'play basketball'}
# 1.先转换成迭代器对象
# 方式一: res  = info.__iter__()
# 方式二:
res = iter(info)
# 2.迭代取值
while True:
    print(res.__next__())
    try:
        print(next(res))
    except StopIteration as e:
        # 结束while循环
        break

 

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

1.索引取值
    优势:可以反复获取相同的元素 并且没有固定的方向
    劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高
 
2.迭代取值
    优势:兼容所有的容器类型
    劣势:取值的顺序永远都是从左往右 并且无法重复获取 去完就完了
  # 真正底层的迭代取值后续可能很少用 一般都是for循环代替
"""
迭代器里面的东西是固定的 没取一个就会少一个 去完就空了
"""    

 

posted @ 2022-03-23 17:28  thrombus  阅读(54)  评论(0)    收藏  举报