pythonic_比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 = lambda x: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模块,或许更简单一些

from collections import Counter

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[0] for x in aa],[x[1] for x in aa]]

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

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

def product(a,b):

return a*b

def add(a,b):

return a+b

x = True

(product if x else add)(3,5)

# 15

7. 复制列表

a = [1,2,3,4]

b = a

b[0] = 10

b

# [10, 2, 3, 4]

a

# [10, 2, 3, 4]

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

a = [1,2,3,4]

b = a[:]

b[0] = 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 = lambda x:x[1])

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

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

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

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

for a in range(3):

print(a)

if a == 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]

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

from collections import OrderedDict

OrderedDict.fromkeys(aa)

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

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

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

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

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

参考资料来源于网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值