元组和列表相同,都是一组有序的数据的组合
元组中的元素一旦定义不可修改
由于元组是不可变类型,只能使用索引进行访问,不可以进行增删改
但元组也可以和列表相同,使用切片形式获取元素
# 元组的基本定义与操作 varint=1, vart=(1,) print(type(varint),type(vart)) # 元组的切片操作 vart=(1,2,3,4,5,6,5,6,7,4,3,2,) res=vart[:] print(res) res=vart[1:] print(res) print(vart[0:-1]) print(vart[0:]) print(vart[::-1]) #倒着输出 # 获取数组长度 print(len(vart)) # 统计元素出现的个数 print(vart.count(5)) # 获取元素在元组中的索引值 vart=['python','java','php','c','c++','vb','shell','php'] print(vart.index('php')) # 2 # 从指定位置开始查找 print(vart.index('php',3)) # 7 # 从指定位置查找到指定位置结束 print(vart.index('php',0,3)) # 2 #元组的拼接 var1=1,2,3 var2='a','b','c' print(var1+var2) # (1, 2, 3, 'a', 'b', 'c') #元组的复制 print(vart*2) # ['python', 'java', 'php', 'c', 'c++', 'vb', 'shell', 'php', 'python', 'java', 'php', 'c', 'c++', 'vb', 'shell', 'php']
列表推导式返回了一个列表,元组推导式返回了一个生成器
生成器:
生成器是一个特殊的迭代器,生成器可以自定义,也可以用元组推导式定义
生成器是按照某种算法推算下一个数据或结果,只需要网内存中存储一个生成器,节约内存消耗,提升性能
语法:
里面是推导式,外面是()的结果是一个生成器
自定义生成器,还有yield关键字的函数就是生成器
#元组推导式(生成器) # 列表推导式 varlist=[1,2,3,4,5,56,7] newlist=[i*2 for i in varlist] print(newlist) # [2, 4, 6, 8, 10, 112, 14] # 元组推导式 返回生成器:genexpr vart=(1,2,3,4,5,6) newvart=(i*2 for i in vart) print(newvart) # <generator object <genexpr> at 0x0000022C6A3BE580> # 操作生成器 # 生成器是迭代器的一种,可以使用迭代器操作 # 使用next()函数操作 print(next(newvart)) # 2 print(next(newvart)) # 4 print(next(newvart)) # 6 # 使用list()函数操作 newvart=(i*2 for i in vart) print(list(newvart)) # 使用tuple()函数操作 newvart=(i*2 for i in vart) # [2, 4, 6, 8, 10, 12] print(tuple(newvart)) # (2, 4, 6, 8, 10, 12) # 使用for循环进行遍历 newvart=(i*2 for i in vart) for i in newvart: print(i)
yield类似于return
共同点:关键字执行后把结果返回不同点:
- return 会直接返回结果,并且结束当前函数的调用
- yield 会返回结果并记录当前代码执行的位置,再次调用时从记录的位置继续向下执行
# 定义普通函数 def func(): print('hello world') return 1 print('hello python') return 2 func() # 普通定义方法只会执行到return 1 无法再次向下运行代码 # 使用 yield定义生成器函数 def fun(): print('hello world') yield 1 print('hello python') yield 2 # 调用生成器函数,返回一个迭代器 res= fun() r1=next(res) # hello world print(r1) # 1 r2=next(res) # hello python print(r2) # 2 # 使用list函数调用生成器时,返回迭代器 res=(fun()) print(list(fun())) # [1, 2] # 练习斐波那契序列 # 普通方法 def feibo(num): a,b,i=0,1,0 while i < num: print(b, end=',') a,b=b,a+b i+=1 feibo(7) print('') # 使用生成器改写 def feibo(num): a,b,i=0,1,0 while i < num: yield b a,b=b,a+b i+=1 res=feibo(7) print(next(res))