一些Python的技巧(一)

python 真是一个简洁优雅的一门编程语言,特别喜欢python。总结一些python中的小技巧,(可能也算不上技巧,高手请忽略Orz…

列表生成式&高阶函数

首先我们先生成10以内奇数:

1
L = list(range(1, 10, 2))   #[1, 3, 5, 7, 9]

如果现在我想将列表 L 中的每一个元素平方

1
2
3
new = []
for i in L:
new.append(i ** 2) #new [1, 9, 25, 49, 81]

对于一个没有什么编程经验的人或者初学者来讲,很可能写出上边的代码,虽然可以达到我们的要求但是不美观,不优雅,不pythonic,Python之禅即扁平胜于嵌套,使用python中的 列表生成式 可以很好地实现我们的需求。

1
new = [i ** 2 for i in L]       #[1, 9, 25, 49, 81]

或者使用高阶函数 map & lambda 来实现,

1
new = list(map(lambda x: x ** 2, L))        #[1, 9, 25, 49, 81]

对于新的列表new,如果我想从中提取可以被3整除的数,同样可以使用列表生成式或高阶函数来实现。

1
[i for i in new if not i % 3]       #[9, 81]

高阶函数 filter & lambda

1
list(filter(lambda x: not x % 3, new))     #[9, 81]

python的高阶函数map, filter, reduce等在其他语言中同样存在,如javaScript中的map(), reduce()等方法,php中array_map(), array_walk()等,类似的函数式编程可以使我们在处理数组等更优雅简洁易读。

循环

对于循环列表时可能需要同时循环下标和列表的值,使用enumerate()来实现此方法

1
2
3
4
5
6
7
for i, v in enumerate(L):
print(i, v)
#0 1
#1 3
#2 5
#3 7
#4 9

有些时候循环列表时想同时将当前元素与下一位同时循环

1
2
3
4
5
6
7
for first, second in zip(L, L[1:]):
print(second - first)
# 2
# 2
# 2
# 2
# 得到了相邻元素之差,优雅的写法

当然,用列表生成式可能更直观

1
[second - first for first, second in zip(L, L[1:])]     #[2, 2, 2, 2]

dict & list

1
2
3
4
dic = {'c': 'swift', 'python': 'elegent', 'js': 'confusion'}
keys = list(dic.keys()) #['c', 'python', 'js']
values = list(dic.values()) #['swift', 'elegent', 'confusion']
dict(zip(keys, values)) #{'c': 'swift', 'python': 'elegent', 'js': 'confusion'}

同样类似于列表生成式,字典也有类似的处理方法。

例如用字典生成式将字典键值交换

1
{v:k for k, v in dic.items()}   #{'swift': 'c', 'elegent': 'python', 'confusion': 'js'}

未完待续~~