Loading...
墨滴

瀋凣

2021/12/31  阅读:77  主题:极简黑

python笔记29

Python day29

1. 序列

1.2 序列相关函数

1.2.5 all()any()

all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True,如果是返回 True,否则返回 False
any() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 False,如果是返回 False,否则返回 True

语法
all(iterable)
any(iterable)
#iterable -- 元组或列表。
举个栗子:
>>> x = [1,1,0]
>>> y = [1.1.9]
>>> all(x)
False
>>> all(y)
True
>>> any(x)
True
>>> any(y)
True

啥意思?列表里明明没一个是布尔类型的数据,它是怎么判断出来的呢?

我们在第8课讲解布尔类型的时候就说过:Python中任何对象都可以进行真值测试,且只要传入非零参数,返回值都是True;只有不填参数或是传入的参数值为0或为,返回值才为False

以下为结果为False的参数:

  • 定义为False的对象:NoneFalse
  • 值为0的数字类型:00.00jDecimal(0)Fraction(0,1)
  • 空的序列和集合:''()[]{}set()range(0)

戳👇链接复习布尔值相关知识。

Python笔记08
Python笔记08

1.2.6 enumerate()

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标(枚举),一般用在 for 循环当中。

语法
enumerate(sequence, [start=0])
#sequence -- 一个序列、迭代器或其他支持迭代对象。
#start -- 下标起始位置。
举个栗子:
>>> seasons = ['Spring''Summer''Fall''Winter']
>>> enumerate(seasons)
<enumerate object at 0x71572f3240>
>>> list(enumerate(seasons))
[(0'Spring'), (1'Summer'), (2'Fall'), (3'Winter')]
>>> list(enumerate(seasons, start=10))       # 小标从 10 开始
[(10'Spring'), (11'Summer'), (12'Fall'), (13'Winter')]

一般用在for循环中:

>>> i = 0
>>> seasons = ['Spring''Summer''Fall''Winter']
>>> for element in seasons:
        print(i, seasons[i])
        i += 1

0 Sprint
1 Summer
2 Fall
3 Winter

或者:

>>> seasons = ['Spring''Summer''Fall''Winter']
>>> for element in seasons:
        print(seasons.index(element),element)
        
0 Sprint
1 Summer
2 Fall
3 Winter

for 循环使用 enumerate

>>> seasons = ['Spring''Summer''Fall''Winter']
>>> for i, element in enumerate(seasons):
        print(i, element)
        
0 Sprint
1 Summer
2 Fall
3 Winter

1.2.7 zip()

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象(迭代器),这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同;利用 * 号操作符,可以将元组解压为列表。

*zip 方法在 Python 2 和 Python 3 中的不同:在 Python 2.x zip() 返回的是一个列表。

语法
zip([iterable, ...])
#iterable -- 一个或多个迭代器;
举个栗子:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zipped = zip(a,b)  # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(14), (25), (36)]

当可迭代对象的长度不相同时:

>>> c = [7,8,9,10,11,12]
>>> list(zip(a,b,c))
[(147), (258), (369)]
# 元素个数与最短的列表一致,多余的丢掉

如果你实在不想抛弃任何一个元素的话:

“梭哈”
“梭哈”

补充:
可以使用itertools模块代替zip()函数

>>> import itertools  #导入itertools模块
>>> zipped = itertools.zip_longest(a,b,c)
>>> list(zipped)
[(147), (258), (369), (NoneNone10), (NoneNone11), (NoneNone12)]
#没有对应的用None补齐

有压缩自然有解压,我们可以通过zip(*)的方式来进行解压缩

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zipped = zip(a,b)
>>> a1,b1 = zip(*zipped)
>>> a1
(123)
>>> b1
(456)
>>> 

1.2.8 map()

map() 函数会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

语法
map(function, iterable, ...)
#function -- 函数
#iterable -- 一个或多个序列

#返回值:一个迭代器
举个栗子:
>>> mapped = map(ord, "Vanovel")  
#ord 函数用于返回参数指定的字符串的Unicode编码值
>>> list(mapped)
[8697110111118101108]

当参数指定的函数需要填入多个参数时:

>>> mapped = map(pow,[2,5,8],[1,4,7])
#pow(x,y)用于计算x的y次方
>>> list(mapped)
[26252097152]

当可迭代对象长度不同时:

>>> mapped = map(max,[1,9,8],[3,2,8],[1,1,4,5,1,4])
>>> list(mapped)
[398]
# 元素个数与最短的列表一致,多余的丢掉

1.2.9 filter()

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象。

如果要转换为列表,可以使用 list() 来转换。

该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 TrueFalse,最后将返回 True 的元素放到新列表中。

语法
filter(function, iterable)
#function -- 判断函数。
#iterable -- 可迭代对象。
举个栗子:
>>> fi = filter(str.isupper,'VaNoVeL')
>>> list(fi)
['V''N''V''L']

1.3 迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

可迭代对象和迭代器的联系与区别:

  1. 可迭代概念范围最大,迭代器肯定都可迭代,但可迭代不一定都是迭代器;
  2. 迭代器特点是,均可以使用 for in 和 next 逐一遍历;
  3. 可迭代可以重复使用,迭代器则是一次性的。
举个栗子:
>>> mapped = map(ord,'Vanovel')
>>> for i in mapped:
       print(i)

 
86
97
110
111
118
101
108
>>> for i in mapped:
       print(i)

 
>>> #再次进行for循环发现里面没有内容

1.3.1 iter()

iter() 函数用来生成迭代器。

语法
iter(object[, sentinel])
#object -- 支持迭代的集合对象。
#sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
举个栗子:
>>> x = [1,2,3,4,5]
>>> it = iter(x)
>>> type(x)
<class 'list'>
>>> type(it)
<class 'list_iterator'>

1.3.2 next()

next() 返回迭代器的下一个项目。

next() 函数要和生成迭代器的 iter() 函数一起使用。

语法
next(iterable[, default])
#iterable -- 可迭代对象
#default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
举个栗子:
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
5
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#41>", line 1in <module>
    next(it)
StopIteration
>>> #抛出异常:StopIteration

当我们不想让它抛出异常时:

>>> it2 = iter(x)  #重新生成一个迭代器
>>> next(it2,'感觉身体被掏空~')
1
>>> next(it2,'感觉身体被掏空~')
2
>>> next(it2,'感觉身体被掏空~')
3
>>> next(it2,'感觉身体被掏空~')
4
>>> next(it2,'感觉身体被掏空~')
5
>>> next(it2,'感觉身体被掏空~')
'感觉身体被掏空~'
点点关注不迷路
点点关注不迷路
- END -

瀋凣

2021/12/31  阅读:77  主题:极简黑

作者介绍

瀋凣