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循环代替
"""
迭代器里面的东西是固定的 没取一个就会少一个 去完就空了
"""