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小白陆禄绯,欢迎各位大佬的指点!!!