首页 > 其他分享 >10月14日内容总结——内置函数、可迭代对象和迭代器、异常捕获与处理

10月14日内容总结——内置函数、可迭代对象和迭代器、异常捕获与处理

时间:2022-10-14 16:36:33浏览次数:45  
标签:__ 10 14 迭代 对象 res print 函数

目录

一、重要内置函数

1、zip

说白了就是压缩几组数据值。说细了就是将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,一般会用list或dict方法输出为对应的类型,当对象为多个的时候,会根据数据值最少的那个参数为输出的个数,多余的部分就不会输出了。

# zip
l1 = [11, 22, 33, 44, 55]
l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
l3 = [1, 2, 3, 4, 5]
res = zip(l1, l2, l3)
print(list(res))
# [(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3), (44, 'jerry', 4), (55, 'tony', 5)]
l1 = [11, 22, 33]
l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
l3 = [1, 2, 3, 4]
res = zip(l1, l2, l3)
print(list(res))
# [(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3)]

当我们使用zip方法压缩后还可以解压,使用方法为:zip(*+变量名):

aa = [(1, 2), (2, 3), (3, 4)]
a, b = zip(*aa)
print(a)
print(b)
(1, 2, 3)
(2, 3, 4)

2、filter

filter函数是筛选的意思:此函数会将可迭代对象中的每一位元素作为参数传递到func中,如果结果为True,则将此元素添加到结果列表中,filter()返回的结果是一个的新列表。

表现形式:filter(func,iterable)

其中func为函数名,可为lambda匿名函数,iterable为可迭代对象。

# filter
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = filter(lambda x: x > 40, l1)
print(list(res))
# [44, 55, 66, 77, 88]

这里的filter函数在匿名函数的作用下达成的功能是判断列表l1中的值,如果根据匿名函数的条件得出这个数据值大于40就把他记录到结果中用res输出结果。

3、sorted

sort方法大家一定很眼熟,他是列表的升序排列,到了内置函数sorted中也是一样的作用。

表现形式:sorted(iterable, key=None, reverse=False)

  • iterable – 可迭代对象。
  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。(说白了就是弄个函数加了条件)
  • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
# sorted
l1 = [21, 12, 53, 64, 76, 32, 11, 22]
res = sorted(l1)
print(res)  # 默认升序
# [11, 12, 21, 22, 32, 53, 64, 76]

下面是key加入函数的例子:

b = {1: 'ab', 2: 'degg', 4: 'ght', 9: 'd'}

res1 = sorted(b.items(), key=lambda i: i[0])  # 指定按字典里面的键排序
print(res1)

[(1, 'ab'), (2, 'degg'), (4, 'ght'), (9, 'd')]

res2 = sorted(b.items(), key=lambda i: len(i[1]))  # 指定按字典里的value长度排序,默认从小到大
print(res2)

[(9, 'd'), (1, 'ab'), (4, 'ght'), (2, 'degg')]

res3 = sorted(b.items(), key=lambda i: len(i[1]), reverse=True)  # 指定按字典里的value长度排序,同时进行翻转,即按value的长度从大到小排列
print(res3)

[(2, 'degg'), (4, 'ght'), (1, 'ab'), (9, 'd')]

二、常见内置函数(了解)

1、abs

abs的作用很好理解,就是把数值变成绝对值,也就是变成正数。

print(abs(-100))
print(abs(100))
# 100
# 100

2、all

对条件进行判断,如果给定的所有条件都对就返回True,否则就返回False。可以和and的作用放一起记忆。

3、any

对条件进行判断,如果给定的条件里面有一个对就返回True,都错的时候返回False。可以和or的作用放一起记忆。

4、bytes

相当与encode的作用,对给定的数据值进行编码,会转换成bytes(二进制类型)

s1 = '今天周五 内容也很简单'
print(s1.encode('utf8'))
print(bytes(s1, 'utf8'))
# b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\x91\xa8\xe4\xba\x94 \xe5\x86\x85\xe5\xae\xb9\xe4\xb9\x9f\xe5\xbe\x88\xe7\xae\x80\xe5\x8d\x95'
# b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\x91\xa8\xe4\xba\x94 \xe5\x86\x85\xe5\xae\xb9\xe4\xb9\x9f\xe5\xbe\x88\xe7\xae\x80\xe5\x8d\x95'

5、bin、oct、hex、int

这些是之前说过的一些进制转换的函数,分别是:二进制八进制十六进制和十进制。

6、callable

用于判断这个变量名加了括号是不是就能调用了,返回的结果时布尔值。

name = 'jason'
def index():
    print('from index')
print(callable(name))  # False
print(callable(index))  # True

7、chr、ord

根据ASCII对应的数值或是根据字符对应的数据值返回结果,chr是根据数值返回字符,ord是根据字符返回数据值。

print(chr(65))  # A
print(ord('A'))  # 65

8、dir

我们可以通过这个函数查看括号内的对象能调用的方法或函数

print(dir('hello'))
# ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

9、divmod

对数值进行整除,并且可以获得余数。

res = divmod(100, 2)
print(res)  # (50, 0)
res = divmod(100, 3)
print(res)   # (33, 1)

前面的结果时整除的结果,后面是余数。

10、enumerate

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般结合for循环使用(可以人为指定下表开始的数据值):

print(list(enumerate(["a", "b", "c"])))

[(0, 'a'), (1, 'b'), (2, 'c')]

11、eval和exec

两种函数都是一个作用:把字符串内的代码运行。

其中eval只能运行一些简单的代码

exec可以运行复杂一些的代码,比如开个for循环

s1 = 'print("哈哈哈")'
eval(s1)
exec(s1)
s2 = 'for i in range(100):print(i)'
eval(s2)  # 只能识别简单的python代码 具有逻辑性的都不行,这里会报错
exec(s2)  # 可以识别具有一定逻辑性的python代码

12、hash

使用哈希算法对数据值进行加密

print(hash('jason'))
# 6504587676088172780

13、id、input、isinstance

id

返回对象的唯一标识符,标识符是一个整数(返回对象的内存地址)

input

用于接收外界输入的信息

isinstance

判断一个对象是否是一个已知的类型,类似 type()

class A:
    pass
 
class B(A):
    pass
 
isinstance(A(), A)    # returns True
type(A()) == A        # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

14、map、max、min

map

映射的作用,昨天说过了

max和min

返回最大值或最小值,昨天也说了

15、open

用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写,在之前问文本编辑知识点可以找到详细操作方法,这里就举个例子:

with open() as f1:
    pass
f2 = open()

16、pow

返回 xy(x的y次方) 的值

pow(x, y[, z])

17、range

之前讲for循环的时候介绍过,作用是生成一个工厂,生成数据,python2和python3中的作用有所区别python2中的xrange和python3的range作用一样。

18、round

对数值进行四舍五入,但是不太准确,可能是五舍六入。

19、sum

sum(list) : 求取list元素的和

三、可迭代对象

之前我们对于for循环为什么可以遍历没有做具体解释,这里就开始对它进行解释了。

首先我们介绍什么是可迭代对象:

在数据类型的后面可以使用点加双下划线iter(.iter)来判断是不是可迭代对象

经过一圈测试得到如下的可迭代对象的范:

不是可迭代对象:
int float bool 函数对象
是可迭代对象:
str list dict tuple set 文件对象

四、迭代器对象

迭代器介绍:

迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代。

迭代器对象:

所有的可迭代对象在使用双下划线iter方法后都会编程迭代器对象,变成迭代器对象后继续使用双下划线iter方法就没有效果了,但是可以执行。判断迭代器对象的本质是查看内置方法中是否有__iter__和__next__

迭代器对象的作用

优点

1、提供了一种不依赖于索引取值的方式,正因为有迭代器的存在 我们的字典 集合才能够被for循环

2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__next__来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

缺点

1、除非取尽,否则无法获取迭代器的长度

2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

迭代器对象实操:

s1 = 'hello'  # 可迭代对象
res = s1.__iter__()  # 迭代器对象
print(res.__next__())  # 迭代取值 for循环的本质

这里需要注意,如果__next__取不到值就会报错。

注意事项

1、可迭代对象调用__iter__会成为迭代器对象

2、迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身

五、for循环的本质

学完了上面的迭代器和可迭代对象相关知识,我们重新看一下for循环的结构:

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

现在我们可以知道for循环只是把字典、集合这类数据值进行了__iter__和__next__操作进行一次次取值,流程如下:

1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理

六、异常捕获和处理

1、什么是异常

当我们写程序难免遇到报错,专业的称呼叫做异常,行业俗语叫做bug,由于异常情况出现会导致代码停止运行,所以在编写过程中要尽可能避免。

2、异常分类

语法错误

这一类错误很好理解,相当于你不会写,比如用if或for的时候不知道他们怎么写,这种情况比较夸张了,好好学过的人都不会犯这种错误,一般来说这种错误发现了就是要准备跑路了。

逻辑错误

这种情况在编写的时候是允许出现的,通常来说都是代码结构完整,但是在调用的时候出了各种错误如:顺序错了或是变量用错了导致的异常。

3、异常的结构

我们可以分成三部分看:

错误位置

报错的位置是占最大部分的,我们从这里知道什么位置运行代码出错了,通常来说在错误位置很多的时候只用看最下面那个。

错误类型

最下面一行左边的几个单词是标志你的错误类型的,通常也不用管,起到提示作用

错误详情

这里比较关键,错误详情会把你错误的地方进行一个具体的解释,好让你找到错误并改正


标签:__,10,14,迭代,对象,res,print,函数
From: https://www.cnblogs.com/zhihuanzzh/p/16791975.html

相关文章

  • 【2022-10-08】连岳摘抄
    23:59办一件事,假设只有40%的把握,如果停在那里不动,就会慢慢变成20%的把握,最后变成零。但积极争取,可以将其变成60%、70%,最后将事情办成。          ......
  • uni-app 110清空聊天记录功能
    chat.jsimport$Ufrom"./util.js";import$Hfrom'./request.js';classchat{constructor(arg){this.url=arg.urlthis.isOnline=falsethis.socket=......
  • 微信小程序累计独立访客(UV)不低于 1000 是什么意思
    微信小程序累计独立访客(UV)不低于1000是什么意思!uniquevisitor独立访客也就是累计访客大于等于1000即可欢迎浏览我的小程序是万物功能有很多欢迎提意见......
  • 故障复盘究竟怎么做?美图SRE结合10年经验做了三大总结(附模板)
    美图崇尚的故障文化是“拥抱故障,卓越运维”,倡导的基准是No-Blame,即「不指责,重改进」。今年9月TakinTalks社区曾经分享过美图的三段式故障治理方法(美图SRE:一次线上......
  • uni-app 4.10封装聊天列表组件
    聊天组件free-media-list.vue,如下代码<template><viewhover-class="bg-light"><divclass="flexalign-stretch"><viewclass="flexalign-centerjustify-c......
  • [2022.10.14]Java方法
    加上static变成类变量Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方......
  • Test 2022.10.12
    今天是紫黑专场T1\(GreedyChange\)分析说实话我并没有太搞懂这道黑题,要我解释的话也并不能太清楚地说出来,只是对着题解老老实实整理了一遍,迷迷糊糊地打出来,大概就是对......
  • imagemagick:创建指定背景色的空图片(ImageMagick 6.9.10)
    一,用convert创建空图片1,执行命令[lhdop@blog~]$cdimg[lhdop@blogimg]$convert-size1024x768xc:"#FFF"./white.png[lhdop@blogimg]$convert-size1024x76......
  • CF1468J
    自闭了,*1800都不会了。。先连所有边权不大于\(k\)的边,若图能连通,直接找一条边权与\(k\)最接近的改一下就好了。否则跑一遍Kruskal。具体细节看代码。Code:#inclu......
  • java 枚举和迭代器遍历
    初始向量Vector<String>l=newVector<>();l.add("Amit");l.add("Raj");l.add("Pathak");l.add("Sumit");l.add("Aron")......