Python中的一些概念、关键词
Python中的一些概念、关键词
关键字
yield
python中yield的用法详解——最简单,最清晰的解释_python yield-CSDN博客
如何理解Python中的yield用法? - 知乎 (zhihu.com)
有yield
的函数则返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。
在调用生成器函数的过程中,每次遇到 yield
时函数会暂停并保存当前所有的运行信息(保留局部变量。而一般 return 的函数 会销毁局部变量),返回yield
的值, 并在下一次执行next()
方法时从当前位置继续运行,直到生成器被全部遍历完。
yield和生成器主要就是**节省内存**
生成器存储的是一种规则或者说方法,普通集合存储的是数据,数据量大的话,内存消耗大,但是规则几乎不占内存
生成器函数有两种用途。
- 一是调用它创建一个生成器对象,也就是生成器迭代器,然后用迭代器驱动生成器函数分部运行,产生你想要的数据;
- 二是当协程函数用,控制程序流
zip
在Python中,zip函数是一个内置函数,它可以将多个序列按照索引位置一一对应起来,生成一个新的元组序列。zip函数的语法如下所示:
1 | zip(iterable1, iterable2,...) |
其中,iterable1、iterable2等参数可以是任何可迭代对象,如列表、元组、字符串等。
zip函数返回一个zip对象,通过list()函数可以将其转换为元组列表。例如:
1 | a = [1, 2, 3] |
zip函数将列表a和列表b中的每个元素依次一一对应起来,生成了一个新的元组序列[(1, 4), (2, 5), (3, 6)]。
当参数的长度不同时,zip函数会以最短长度的对象为准,将其他对象中多余的元素忽略掉。例如:
1 | a = [1, 2, 3] |
zip函数将列表a和列表b中的前两个元素一一对应起来,生成了一个新的元组序列[(1, 4), (2, 5)]。由于列表b只包含两个元素,所以列表a中的第三个元素被忽略掉了。
除了zip函数之外,Python还提供了zip_longest函数,它可以将多个序列按照最长长度对应起来。如果某个序列中的元素不足,则用指定的填充值来补齐。zip_longest函数的语法如下所示:
1 | from itertools import zip_longest |
其中,fillvalue参数表示用于填充不足元素的值,默认为None。例如:
1 | from itertools import zip_longest |
zip_longest函数将列表a和列表b中的所有元素一一对应起来,其中列表b中的第三个元素被用指定的填充值0来补齐,生成了一个新的元组序列[(1, 4), (2, 5), (3, 0)]。
总之,zip函数是一个非常实用的函数,它可以将多个序列按照索引位置一一对应起来,方便地进行批量处理和数据分析。
_get_items()等等
在Python中,__getitem__()
是一个特殊方法(也称为魔术方法或双下划线方法),用于实现对象的索引操作。当我们使用索引操作符 []
获取对象的元素时,Python会自动调用该对象的__getitem__()
方法来执行相应的操作。
__getitem__()
方法允许对象以类似序列或映射的方式进行索引,并返回对应的元素或值。它接受一个参数,即索引值,可以是整数、切片等类型。
下面是一个简单的示例,展示了如何在自定义类中实现__getitem__()
方法:
1 | class MyList: |
在上面的例子中,MyList
类定义了__getitem__()
方法,它接受一个索引值 index
,并返回data
列表中对应索引位置的元素。通过执行my_list[2]
操作,Python会调用__getitem__()
方法并将索引值 2
作为参数传递给它,最终返回data[2]
,即3
。
需要注意的是,除了__getitem__()
方法外,还有其他一些特殊方法可以实现不同的操作,例如__setitem__()
用于设置元素值,__delitem__()
用于删除元素等。这些特殊方法的使用可以让我们自定义的类更像内置的序列或映射类型,从而提供更灵活和自定义化的功能。
解包
解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来放在其它地方,好比你父母去菜市场买了一袋苹果回来分别发给家里的每个成员,这个过程就是解包。Python 中的解包是自动完成的;
- 任何可迭代对象都支持解包,可迭代对象包括元组、字典、集合、字符串、生成器等实现了__next__方法的一切对象
元组解包
-
第一种:赋值给多个变量的元组解
1
2
3
4
5
6
7
8
9temp = ("hi","yuan","wai")
first,second,third = temp
等同于
first = temp[0]
second = temp[1]
third = temp[2] -
第二种:元组的每个元素作为位置参数的元组解包
1
2
3
4
5
6temp = (1,2,3)
def hello(first,second,third):
print(first)
print(second)
print(third)hello(*temp)
等同于hello(1,2,3)
-
第三种:遍历的元素为元组对象时,同时赋值给对应的变量,自动完成元素解包
1
2
3
4
5
6
7
8
9
10temp_list = [
('测试人员', self.tester),
('开始时间', start_time),
('合计耗时', duration),
('测试结果', status + ",通过率= " + self.pass_rate)]
for first, second in temp_list:
print(first)
print(second)
# temp_list是一个list,每个元素为tuple,遍历temp_list时,将每次的获取到tuple对象,自动解包到2个变量first和second字典解包
python中*vars代表解包元组,**vars代表解包字典,通过这种语法可以传递不定参数
1
2
3
4
5
6
7
8def linear(x, k, b=0):
return k * x + b
a = {'x': 2, 'k': 3}
print(linear(**a)) # 相当于 print(linear(x=2, k=3))
# 6
python中的广播
广播是指在不同形状的数组之间进行算术运算的方式,它在很多场景下都非常有用。例如,我们可以简单地将一个标量(可以认为是零维数组)与一个数组相加。在这个例子中,标量会被广播到数组的每一个元素上。
1 | a = np.arange(3) |