比Python更Pythonic

More pythonic than python!

“人生苦短,我用python”。近日试着用C++ 写了一个R包,一边谷歌,一边写,步履维艰,语法晦涩难懂。转过来,研究一下Python,瞬间舒畅多了。相对于其他语言,Python的语法更加灵活,更加接近自然语言,在其他语言中或许只有一条大路通罗马,在Python中是条条大路通罗马。以下是一些经常遇到的例子,如何写的代码比Python更加Pythonic.

1. 交换变量值

在很多编程语言中,两个变量值的交换通常需要第三个变量作为过渡,但是在Python中,两个变量值可以直接交换,不需要第三者

x,y =12,13

print(x,y)

# 12 13

x,y = y,x

print(x,y)

# 13 12

2. 合并列表中的元素

在R中合并一个列表(向量)中的元素需要paste

aa = c("This","is","a","test")

paste(aa, collapse =" ")

# "This is a test"

在Python中不需要paste和collapse,只要join就可以了

aa = ['This','is','a','test']

" ".join(aa)

# 'This is a test'

3. 查找列表中出现频率最高的元素

aa = ["a","b","c","c","c","b"]

max(set(aa), key =lambdax:aa.count(x))

# 'c'

# #set 相当于去重,使用lambda函数对set中的每一个值使用count计数,然后去最大值。

# #这里巧妙使用了lambda函数,再举一例:

# lis = [(1,'a'),(3,'c'), (4,'e'), (-1,'z')]

# max(lis) # 这是max函数会先比较每个元组中第一个元素的大小,如果第一个元素相同,再比较第二个。

# #如果我们想直接比较第二个元素,则可以用

# max(lis, key = lambda x:x[1])

# #(-1, 'z')

如果我们使用collections模块,或许更简单一些

fromcollectionsimportCounter

aa = ["a","b","c","c","c","b"]

cnt = Counter(aa)

cnt.most_common(2)# 频率最高的前两位

# [('c', 3), ('b', 2)]

4. 逆序字符串

aa ="abcdefg"

aa[::-1]

# 'gfedcba'

# 逆转字符串,返回列表

list(reversed(aa))

# ['g', 'f', 'e', 'd', 'c', 'b', 'a']

# 如果想变回字符串,可以使用前面说的join。

5. 转置二维数组

aa = [['a','b'],['c','d'],['e','f']]

list(zip(*aa))

# [('a', 'c', 'e'), ('b', 'd', 'f')]

# 当然,你还可以这样写:

[[x[]forxinaa],[x[1]forxinaa]]

# [['a', 'c', 'e'], ['b', 'd', 'f']]

6. 函数的调用居然也可以if…else

defproduct(a,b):

returna*b

defadd(a,b):

returna+b

x =True

(productifxelseadd)(3,5)

# 15

7. 复制列表

a = [1,2,3,4]

b = a

b[] =10

b

# [10, 2, 3, 4]

a

# [10, 2, 3, 4]

# 由上可见,通过等号复制列表时,一个列表值改变,另一个也会随之改变!

a = [1,2,3,4]

b = a[:]

b[] =10

b

# [10, 2, 3, 4]

a

# [1, 2, 3, 4]

# 通过冒号复制,原列表不会随新列表值的改变而改变。

# 在python3中,通过a.copy()可以实现与冒号复制相同的效果。

8. 通过键值对字典元素进行排列

dd = {'apple':10,'banana':15,'orange':7}

sorted(dd.items(), key =lambdax:x[1])

# [('orange', 7), ('apple', 10), ('banana', 15)]

# 按照7,10,15的顺序对字典内容进行升序排列

9. 在python中不仅有if…else, 还有for…else

for…else可以用来检查for循环是否循环完成。

forainrange(3):

print(a)

ifa ==4:

break

else:

print("for completed OK")

# 0

# 1

# 2

# for completed OK

10. 使用逗号链接字符

aa = ['This','is','a','test']

",".join(aa)

# 'This,is,a,test'

# 如果是数字,需要将数字转换成字符

bb = [1,2,3,4]

",".join(map(str,bb))# map居然还可以这样使用!!

# '1,2,3,4'

# 我们还可以做一个有意思的事,用加号连接,然后求和

eval('+'.join(map(str,bb)))

# 10

# 这和使用sum(bb)求和结果是一样的。

11. 合并字典

d1 = {'apple':12}

d2 = {'banana':10}

{**d1,**d2}

# {'banana': 10, 'apple': 12}

# 在函数参数中,两个星号是将参数打包成字典,传递到函数中

12. 剔除列表中的重复元素

aa = [1,6,2,2,3,4,4,5]

list(set(aa))

# [1, 2, 3, 4, 5, 6]

# 你会发现, 虽然重复元素被踢出了,但是列表中元素的顺序也被重新排序了.

fromcollectionsimportOrderedDict

OrderedDict.fromkeys(aa)

list(OrderedDict.fromkeys(aa).keys())

# [1, 6, 2, 3, 4, 5]

# 保持了原有元素顺序,同时踢出了重复元素!

Python是及其灵活的编程语言,近乎于自然语言。很多用法,只有你想不到的,没有做不到的。

====== THE END =====

参考资料来源于网络

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180827G0FKBK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券