今天为小破站加了redis,感觉丝滑多了(可以使用ctrl+f5清除缓存刷新)。顺便启用markdawn编辑,不用再直接去写html了。这一篇把迭代学完,再开一篇学习抽象。人类的本质果然是鸽子,新的DLC不香?
迭代字典
遍历字典中的所有关键字,可以直接使用for语句:
a={"a":1,"b":2,"c":3}
for key in a:
print(key,a[key])
我们也可以使用字典方法获取所有的键,只需要值的话可以使用a.values。a.items以元组方式返回键-值对,for中可以使用序列解包。
a={"a":1,"b":2,"c":3}
for key,value in a.items():
print(key,value)
一些迭代工具
并行迭代
例如,我们要迭代两个列表:
a=[1,2,3,4]
b=["a","b","c","d"]
print(list(zip(a,b)))
迭代时获取索引
有些时候,我们可能会在迭代的同时获取当前的索引。例如,替换所有包含某个子串的字符串,我们可以使用enumerate。
a=["abc","hello","abababc","bbbbasabfff"]
for index,string in enumerate(a):
print(index,string)
if "ab" in string:
a[index]=("enterdawn")
print(a)
反向迭代和排序后迭代
我们可以使用reversed和sorted两个函数,类似于reverse和sort,但不就地修改对象而返回反转或排序后的版本。
简单推导
列表推导是一种从其他列表创建列表的方式,原理类似for循环。
[x*x for x in range(10)] #此列表为[0,1,4,9,16,25,36,49,64,81]
[x*x for x in range(10) if x%3==0]#此列表为[0,9,36,81]
[(x,y) for x in range(3) for y in range(3)]#0-2的x和y的所有坐标
多个部分也可以添加if子句:
b=["1","2","3","4","5"]
a=["6","7","8","9","10"]
print([c+g for c in a for g in b])
使用圆括号代替方括号键创建生成器,这个将在后续学习中讨论。而使用花括号可以实现字典推导。
print({i:i*i for i in range(10)})
pass,del,exec和eval
pass语句为什么也不做,当程序未完成时用来占位,因为py中代码块不能为空。
del为删除,使用方法del x
,此方法可以删除某个元素,但是不能释放内存(实际上,当没有任何元素连接到某一块内存的时候,py就会自动释放该内存)。
exec将字符串作为代码执行:
exec("print('Hello world')")
不过最好不要只传进去一个参数,否则会污染命名空间,例如:
from math import sqrt
exec("sqrt=1")
sqrt(4)
解决方法是再传入一个字典当作命名空间(实际上可传入一个全局命名空间和一个局部命名空间,全局命名空间必须是字典,局部命名空间可以是任何映射,这一点也适用于eval):
from math import sqrt
s={}
exec("sqrt=1",s)
sqrt(4)
eval计算用字符串表示的py表达式的值,并返回结果,使用方法类似exec。