https://pythonguidecn.readthedocs.io/zh/latest/writing/structure.html
数值
序列类型
元祖在定义的时候就确认了存放的空间,内存固定,占用空间较小 列表的空间可以动态变化,内存占用的空间比元祖大的多 在数据固定的情况下使用元祖
散列
from collections import namedtuple
普通元祖:
tu = ('zx', '1994', '男')
print(tu[0])
命名元祖:
使用namedtuple
相当于创建了一个类,s1
相当于实例话了一个包含name
,age
,gender
三个属性的类。
__main__
:当前模块下
from collections import namedtuple
student = namedtuple('Student', ['name', 'age', 'gender'])
print(type(student)) # <class 'type'> 一个类
s1 = student('zx', '1994', '男')
print(type(s1)) # <class '__main__.Student'>
print(s1.name) # zx
print(s1[0]) # zx
普通列表创建
l = [1, 2, 3, 4]
urls = []
for i in range(0,101,10):
urls.append(f'http://....?page={i}')
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""
列表推导式
urls = [f'http://....?page={i}' for i in range(0,101,10)]
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""
三目运算
a = 10
if a > 5:
print(5)
else:
print(0)
a = 4
res = 5 if a > 5 else 0 # (判断语句成立)if(判断语句)else(判断语句不成立)
print(res) # 0
res = 5 if a > 5 else ('=' if a > 5 else "!")
print(res) # !
结合列表推导式
[i for i in range(10) if i % 2 == 0] # [0, 2, 4, 6, 8]
[i if i % 2 == 0 else -1 for i in range(10) ] # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1]
dic = {i for i in [1, 2, 3]}
# 集合{1, 2, 3}
dic = {i: 1 for i in [1, 2, 3]}
# 字典{1: 1, 2: 1, 3: 1}
dic = {k: v for k in [1, 2, 3] for v in [3, 2, 1]}
# {1: 1, 2: 1, 3: 1} 错误 ❌❌❌
dic = {k: v for k, v in zip([1, 2, 3], [3, 2, 1])}
# {1: 3, 2: 2, 3: 1} 正确 ✅✅✅
# 其实就是:
dict(zip([1, 2, 3], [3, 2, 1]))
tu = (i for i in range(5))
# <generator object <genexpr> at 0x11433d138>
next(tu) # 0
next(tu) # 1
next(tu) # 2
next(tu) # 3
next(tu) # 4
next(tu)
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/02/0807_2.py", line 33, in <module>
print(next(tu))
StopIteration
"""
生成器的作用:当我们要存储大量数据的时候,使用生成器可以节约内存
创建生成器的方式:
只能用于函数中,当一个函数中出现yield这个关键字,那么这个函数就是一个生成器函数。
# yield 后面不写东西
def gen():
for i in range(100000):
yield
res = gen() # <generator object gen at 0x114203138>
next(res) # None
# yield 后面写i
def gen1():
for i in range(100000):
yield i
res = gen()
next(res) # 1
next(res) # 2
def gen3():
for i in range(100000):
print(f'{i}--*******')
yield i
print(f'{i}--#######')
res = gen3()
print(res)
print(next(res))
"""
第一次next打印内容
0--*******
0
"""
print(next(res))
"""
第一次next打印内容
0--*******
0
第二次next打印内容
0--#######
1--*******
1
"""
对象内部实现了迭代协议的称之为可迭代对象 迭代协议:该对象实现了
__iter__
方法
for
循环进行遍历for
循环进行遍历的都是可迭代对象li = [11, 22, 33, 44]
for i in li:
print(i)
要求:
_next
方法next()方法 通过iter()可以将可迭代对象转化为迭代器
生成器是一种特殊的迭代器
li = [11, 22, 33, 44]
item = iter(li)
print(item) # <list_iterator object at 0x1032c8390>
print(next(item)) # 11
迭代器和生成器的区别:
send()
,close()
,throw()
def gen():
i = 0
while i < 10:
j = yield i
print(j)
i += 1
g = gen()
print(g) # <generator object gen at 0x114203138>
print(next(g)) # 0
print(next(g)) # None 1
print(g.send(8)) # 8 2
def gen1():
i = 0
while i < 10:
j = yield i
if j is not None:
i = j
i += 1
g = gen1()
print(next(g)) # 0
print(g.send(8)) # 9
print(g.send(5)) # 6
print(g.send(10))
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/02/0807_5.py", line 26, in <module>
print(g.send(10))
StopIteration
"""