python学习日记7

今天为小破站加了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。

知识共享许可协议
Text is available under CC BY-NC-SA 4.0 unless otherwise stated.

除非特殊声明,本站所有内容均以 CC BY-NC-SA 4.0协议授权。
上一篇
下一篇