python函数微讲解(六)

python函数微讲解(六)

1.常见内置函数(二)

1.help()

# 查看注解信息,可以查看一些内置函数的使用方法
help(eval)

2.id()  

# 查看内存地址
name = 'oscar'
print(id(name))  # 返回变量名的内存地址2262001825192

3.isinstance()

# 判断数据类型
print(isinstance('oscar',str))  # True
print(isinstance('oscar',int))  # False

 

 4.pow()

# 幂指数
print(pow(10,3))  # 1000,第一个参数是底数,第二个参数指数

5.round() 

# 四舍五入
print(round(11.23))  # 11
print(round(11.23,1))  # 11.2,第二个参数定义的是保留几位小数,默认是零

6.sum()

# 求和
print(sum([11, 22, 33]))  # 66

2.可迭代对象

2.1什么叫迭代?

顾名思义就是更新换代,每一次的更新换代都基于上一代的基础上,就叫迭代。

# 只有循环的不是迭代
# while True:
#     print('你好呀')
# 每一次循环都基于上一次,就叫迭代
l = [11, 22, 33]
n = 0
while n < len(l):
    print(l[n])
    n += 1

2.2什么是可迭代对象、可迭代对象有哪些?

一个数据的内置方法中有“__iter__”的都成为可迭代对象,它的读法是:双下iter方法。

i = 12  # 整型不是 
f = 12.32  # 浮点型不是
s = 'oscar'  # 字符串是
l = [11, 22, 33]  # 列表是
d = {'name': 'oscar', 'sex': ''}  # 字典是
t = (1, 2, 3)  # 元组是
se = {11, 22, 33}  # 集合是
b = True  # 布尔值不是
f1 = open(r'userinfo.txt')  # 文件是

3.迭代器对象

3.1什么是迭代器对象?

可迭代对象调用“__iter__”方法之后得到的就是迭代器对象。

特征:同时含有“__iter__”和“__next__”两个方法。

3.2如何理解迭代器对象?

迭代器对象就类似多啦A梦的口袋,节省空间,但是里面的数据很多。

那么迭代器如何取值呢:多啦A梦把手伸进口袋就能取到,迭代器对象呢也有自己的手,就是“__next__”方法,调用即可取值。

l = [11, 22, 33]
res = l.__iter__()
print(res.__next__())  # 11
print(res.__next__())  # 22

3.3迭代器补充说明

(1).很多双下方法都有简写的,但并不是全部

l = [11, 22, 33]
res = iter(l)
print(res.__next__())  # 11
print(next(res))  # 22

(2).有的可迭代对象本身也是迭代器对象。

比如文件对象,因为文件对象同时含有“__iter__”和“__next__”两种方法。

(3).可迭代对象调用“__iter__”方法之后变为迭代器对象,在调用就不做改变。

l = [11, 22, 33]
res = l.__iter__()
print(res)  # <list_iterator object at 0x00000207F2A32160>
print(res.__iter__().__iter__())  # <list_iterator object at 0x00000207F2A32160>

(4).迭代取值的要求

l = [11, 22, 33]
print(l.__iter__().__next__())  # 11,产生了一个新的迭代器对象
print(l.__iter__().__next__())  # 11,产生了一个新的迭代器对象
print(l.__iter__().__next__())  # 11,产生了一个新的迭代器对象
print(l.__iter__().__next__())  # 11,产生了一个新的迭代器对象

res = l.__iter__()  # 已经变为迭代器
print(res.__iter__().__next__())  # 11 调用的是迭代器对象,并没有产生新的
print(res.__iter__().__next__())  # 22
print(res.__iter__().__next__())  # 33

4.for循环内部原理

'''
for 变量名 in 可迭代对象:
    循环体代码
'''

看上述for循环的代码结构,我们可以列出for循环的内部结构:

1.将in后面的可迭代对象调用“__iter__”方法变为迭代器对象。(文件之所以可以for循环是因为迭代器对象调用“__iter__”方法不做改变)

2.将迭代器对象调用“__next__”方法进行取值,然后赋值给变量名。

3.当值没有的情况下报错进行异常处理。

# 写一个for循环的底层原理
l = [11, 22, 33]
n = 0
res = l.__iter__()
while n < len(l):
    print(res.__next__())
    n += 1

虽然上述代码实现了for的功能,但是for循环并没有用到“len()”方法,而是用的报错后的异常处理,所以这个还不对,先放着,看下面的。

5.异常处理

5.1什么是异常?

代码运行出错之后就是异常(也就是我们常说的bug),异常一出现,程序立刻停止运行,异常是以后我们编写代码极力避免的一种情况。

5.2异常信息的组成部分

你好呀

'''
Traceback (most recent call last):
  File "F:/Py3/day1/03.23.py", line 137, in <module>
    你好呀
NameError: name '你好呀' is not defined
'''

(1).line关键字后面的数字是代码出错的行数,点击前面的蓝色字体就可以直接到达你错误的地方。

(2).“NameError”是错误的一种类型。

(3).“name '你好呀' is not defined”是报错的具体原因。

5.3异常的分类

(1).语法异常:就相当于Python的语法写错。

(2).逻辑异常:相当于自己的逻辑思维与自己写的不符合。

5.4异常的类型

# 你好呀  # NameError  名字错误
# l = [11, 22, 33]
# print(l[10])  # IndexError  索引错误
# int('oscar')  # ValueError  值错误
d = {'name': 'oscar'}
print(d['sex'])  # KeyError 键错误

列举一些......

6.异常处理实操

6.1基本语法结构

'''
try:
    可能出错的代码
except 错误的类型 as e:
    print(e)  # 错误信息
    针对错误实施的措施
'''

我们来看一个例子:

try:
    你好呀
except NameError as e:
    print(e)  # name '你好呀' is not defined
    print('你报错了,是NameError错误')  # 你报错了,是NameError错误

但是呢有时候我们不知道代码会报什么错误,那怎么写错误类型呢?这就用到了万能异常:

try:
    你好呀
except Exception as e:
    print(e)  # name '你好呀' is not defined
    print('你报错了')  # 你报错了

关键字“Exception”一般的异常都可以接收。

6.2异常处理的使用准则

(1).异常处理中的代码越少越好

(2).异常处理越少用越好

7.异常处理的了解

7.1结合else使用

当异常处理中的代码没有出错的时候才会执行else语句。

try:
    # 你好呀
    print('1')  # 1
except Exception as e:
    print(e)  # name '你好呀' is not defined
    print('你报错了')  # 你报错了
else:
    print('没有错误')  # 没有错误 try之后的代码没有错误才会打印

7.2结合finally使用

不管异常处理中的代码有没有错误都会执行finally语句。

try:
    你好呀
except Exception as e:
    print(e)  # name '你好呀' is not defined
    print('你报错了')  # 你报错了
finally:
    print('有没有错误都要执行')  # 有没有错误都要执行

7.3else与finally整合使用

try:
    你好呀
except Exception as e:
    print(e)  # name '你好呀' is not defined
    print('你报错了')  # 你报错了
else:
    print('没有错误执行')
finally:
    print('有没有错误都要执行')  # 有没有错误都要执行

7.4断言

name = 'jason'
assert isinstance(name,str)  # 第二个参数就是变量名指向值的数据类型,不对就会报错

7.5主动报错

name = 'jason'
raise NameError(name)  # NameError: jason

因为这是主动报错,所以我们是知道数据类型的。

8.for循环的本质

l = [11, 22, 33]
res = l.__iter__()  # 调用双下iter方法变为迭代器对象
while True:
    try:  # 判断是否出现异常
        print(res.__next__())  # 打印迭代器的值
    except Exception as e:  # 出现异常就结束循环
        break

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

(1).索引取值

优点:可以反复取相同的值,并且没有固定的方向

缺点:只支持有序的容器类型,兼容性没有迭代取值高

(2).迭代取值

优点:兼容所有的容器类型

缺点:取值的顺序都是从左往右,无法重复取值,取完就没有了。

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

 

posted @ 2022-03-23 16:09  陆禄绯  阅读(52)  评论(0)    收藏  举报