Python是一种没有BS的编程语言。设计的可读性和简单性是它大受欢迎的两个最大原因。
这就是为什么值得记住一些常见的Python技巧来帮助改善你的代码设计。这些将省去你每次需要做什么的时候都要浏览 Stack Overflow 的麻烦。以下技巧将在你的日常编码练习中证明是很方便的。
-
寻找字符串中的独特元素
-
使用标题大小写(首字母大写)。
-
反转一个字符串
-
打印一个字符串或一个列表n次
-
将一个字符串列表合并为一个字符串
-
在两个变量之间互换值
-
将一个字符串分割成一个子字符串列表
-
列表的理解
-
检查一个给定的字符串是否是帕林多姆(Palindrome)。
-
使用枚举法来获取索引/值对
-
查找两个字符串是否是相克的
-
使用try-except-else块
-
列表中元素的频率
-
检查一个对象的内存使用情况
-
从列表中取样
-
执行一段代码所需的时间
-
扁平化列表的列表
-
合并两个字典
-
寻找一个字符串中的唯一元素 下面的片段可以用来寻找一个字符串中的所有唯一元素。我们使用一个集合中的所有元素都是唯一的这个属性。
my_string = "aavvccccddddeee"
将字符串转换为一个集合
temp_set = set(my_string)
使用join将集合缝合成一个字符串
new_string = ''.join(temp_set)
print(new_string)
-
使用rhe标题大小写(首字母大写) 下面的片段可以用来将一个字符串转换为标题大小写。这是用字符串类的title()方法完成的。
my_string = "my name is chaitanya baweja"
# using the title() function of string class
new_string = my_string.title()
print(new_string)
# Output
# My Name Is Chaitanya Baweja
-
反转一个字符串 下面的片段使用Python的切片操作来反转一个字符串。
# 用切片法反转一个字符串
my_string = "ABCDE"
reversed_string = my_string[::-1] 。
print(reversed_string)
# 输出
# EDCBA
-
打印一个字符串或一个列表n次 你可以对字符串或列表使用乘法(*)。这使得我们可以随心所欲地将它们相乘。
n = 3 # 重复的次数
my_string = "abcd"
my_list = [1,2,3]
print(my_string*n)
# abcdabcdabcd
print(my_list*n)
# [1,2,3,1,2,3,1,2,3]
一个有趣的用例是用一个常量值来定义一个列表--比方说零。
n = 4
my_list = [0]*n # n表示所需列表的长度
# [0, 0, 0, 0]
-
将一个字符串列表合并成一个字符串join()方法将一个作为参数传递的字符串列表合并为一个字符串。在我们的例子中,我们用逗号分隔符把它们分开。
list_of_strings = ['My', 'name', 'is', 'Chaitanya', 'Baweja']
# 使用带有逗号分隔符的连接
print(','.join(list_of_strings))
#输出
# 我的名字是Chaitanya,Baweja
My,name,is,Chaitanya,Baweja
-
在两个变量之间互换数值
Python使得在两个变量之间交换数值变得非常简单,不需要使用另一个变量。
a = 1
b = 2
a, b = b, a
print(a) # 2
print(b) # 1
-
将一个字符串分割成一个子串的列表 我们可以使用字符串类中的.split()方法将一个字符串分割成一个子字符串的列表。你也可以把你希望分割的分隔符作为参数传给他。
string_1 = "My name is Chaitanya Baweja""
string_2 = "sample/ string 2"
# 默认的分隔符 ''
print(string_1.split())
# ['我的', '名字', '是', 'Chaitanya', 'Baweja']
['My', 'name', 'is', 'Chaitanya', 'Baweja']
# 定义分隔符为'/'
print(string_2.split('/'))
# ['样本', '字符串2']
['sample', ' string 2']
-
列表理解
列表理解为我们提供了一种基于其他列表创建列表的优雅方式。下面的代码段通过将旧列表中的每个元素乘以2来创建一个新列表。
# 将一个列表中的每个元素乘以2
original_list = [1,2,3,4]
new_list = [2*x for x in original_list]
print(new_list)
# [2,4,6,8]
-
检查一个给定的字符串是否是帕林陀罗
我们已经讨论过如何逆转一个字符串。因此,在Python中,回文成为一个简单的程序。
my_string = "abcba"
if my_string == my_string[::-1]:
print("palindrome")
else:
print("not palindrome")
# Output
palindrome # 回文
-
使用枚举法来获取索引/值对
下面的脚本使用enumerate来遍历一个列表中的值以及它们的索引。
my_list = ['a', 'b', 'c', 'd', 'e']
for index, value in enumerate(my_list):
print('{0}: {1}'.format(index, value))
# 0: a
# 1: b
# 2: c
# 3: d
# 4: e
-
查找两个字符串是否是同音异义词
Counter
类的一个有趣的应用是寻找变形词。缩略语是通过重新排列不同单词或短语的字母而形成的一个单词或短语。如果两个字符串的Counter对象相等,那么它们就是同音异义词。
from collections import Counter
str_1, str_2, str_3 = "acbde", "abced", "abcda"
cnt_1, cnt_2, cnt_3 = Counter(str_1), Counter(str_2), Counter(str_3)
if cnt_1 == cnt_2:
print('1 and 2 anagram')
if cnt_1 == cnt_3:
print('1 and 3 anagram')
-
使用 try-except-else
Python中的错误处理可以使用try/except
块轻松完成。在这个块中添加一个else语句可能是有用的。当 try 块中没有出现异常时,它就会运行。如果你需要在没有异常的情况下运行某些东西,请使用finally。
a, b = 1,0
try:
print(a/b)
# exception raised when b is 0
except ZeroDivisionError:
print("division by zero")
else:
print("no exceptions raised")
finally:
print("Run this always")
讲解
a, b = 1,0
试试:
print(a/b)
# 当b为0时引发异常
except ZeroDivisionError:
print("除以零")
否则:
print("没有出现异常")
最后:
print("一直运行这个")
-
列表中元素的频率 有多种方法可以做到这一点,但我最喜欢的是使用Python计数器类。Python计数器记录了容器中每个元素的频率。
Counter()
返回一个以元素为键、以频率为值的字典。我们还使用most_common()
函数来获取列表中最频繁的元素。
# 找到列表中每个元素的频率
from collections import Counter
my_list = ['a','a','b','b','c','d','d','d']。
count = Counter(my_list) # 定义一个计数器对象
print(count) # 所有元素的
# Counter({'d': 5, 'b': 3, 'a': 2, 'c': 1})
print(count['b']) # 每个元素的
# 3
print(count.most_common(1)) # 最常见的元素
# [('d', 5)]
-
检查一个对象的内存使用情况 下面的脚本可以用来检查一个对象的内存使用情况。
import sys
num = 21
print(sys.getsizeof(num))
# In Python 2, 24
# In Python 3, 28
-
从一个列表中取样 下面的片段使用随机库从一个给定的列表中生成n个随机样本。
import random
my_list = ['a', 'b', 'c', 'd', 'e']
num_samples = 2
samples = random.sample(my_list,num_samples)
print(samples)
# [ 'a', 'e'] this will have any 2 random values
我被推荐使用secrets库来生成用于加密的随机样本。下面的代码段将在 只适用于Python 3。
import secrets # imports secure module.
secure_random = secrets.SystemRandom() # 创建一个安全随机对象。
my_list = ['a', 'b', 'c', 'd', 'e']
num_samples = 2
samples = secure_random.sample(my_list, num_samples)
print(samples)
# ['e', 'd'] 这将有任意2个随机值
-
执行一段代码所需的时间
下面的片段使用时间库来计算执行一段代码所需的时间。
#输入时间
import time
start_time = time.time()
# 要检查的代码如下
a, b = 1,2
c = a+ b
# 检查结束的代码
end_time = time.time()
time_taken_in_micro = (end_time- start_time)*(10**6)
print(" time taken in micro_seconds: {0} ms").format(time_taken_in_micro)
-
扁平化一个列表
有时你不确定你的列表的嵌套深度,你只想把所有的元素放在一个单一的扁平列表中。这里是你如何得到的。
from iteration_utilities import deepflatten
# 如果你只有一个深度的嵌套列表,使用这个方法
def flatten(l):
返回 [item for sublist in l for item in sublist]
l = [[1,2,3],[3]]
print(flatten(l))
# [1, 2, 3, 3]
# 如果你不知道列表的嵌套深度
l = [[1,2,3],[4,[5],[6,7]],[8,[9,[10]]]]
print(list(deepflatten(l, depth=3))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
如果你有一个正确格式化的数组,Numpy flatten是一个更好的方法。
-
合并两个字典
在Python 2中,我们使用update()方法来合并两个字典;Python 3.5使这个过程更加简单。在下面的脚本中,两个字典被合并了。
在相交的情况下,使用第二个字典的值。
dict_1 = {'apple': 9, 'banana': 6}
dict_2 = {'banana': 4, 'orange': 8}
combined_dict = {**dict_1, **dict_2}
print(combined_dict)
# Output
# {'apple': 9, 'banana': 4, 'orange': 8}
Thanks for reading !