即学即用的30段Python实用代码

原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less
作 者 | Fatos Morina
翻 译 | Pita & AI开发者

(注:转载的原文中有些小错误,博主在这里做了更正,如果代码运行仍然出现问题,建议回到出自的Giuhub项目上进行校准)


Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许多人广泛使用。它的简单和易用性造就了它如此流行的原因。
在本文中,我们将会介绍 30 个简短的代码片段,你可以在 30 秒或更短的时间里理解和学习这些代码片段。


1.检查重复元素

下面的方法可以检查给定列表中是否有重复的元素。它使用了 set() 属性,该属性将会从列表中删除重复的元素。

def all_unique(lst):
    return len(lst) == len(set(lst))
	
x = [1,1,2,2,3,2,3,4,5,6]    
y = [1,2,3,4,5]    
all_unique(x) # False    
all_unique(y) # True
2.变位词

检测两个字符串是否互为变位词(即互相颠倒字符顺序)

from collections import Counter
def anagram(first, second):
    return Counter(first) == Counter(second)    

anagram("abcd3", "3acdb") # True
3.检查内存使用情况

以下代码段可用来检查对象的内存使用情况。

import sys    
variable = 30     
print(sys.getsizeof(variable)) # 28
4.字节大小计算

以下方法将以字节为单位返回字符串长度。

def byte_size(string):
    return(len(string.encode('utf-8')))   
        
byte_size('?') # 4    
byte_size('Hello World') # 11
5.重复打印字符串 N 次

以下代码不需要使用循环即可打印某个字符串 n 次。

n = 2;
s = "Programming"; 
print(s * n); # ProgrammingProgramming
6.首字母大写

以下代码段使用 title() 方法将字符串内的每个词进行首字母大写。

s = "programming is awesome"    
print(s.title()) # Programming Is Awesome
7.分块

以下方法使用 range() 将列表分块为指定大小的较小列表。

from math import ceil    
def chunk(lst, size):
    return list(
            map(lambda x: lst[x * size:x * size + size],
                list(range(0, ceil(len(lst) / size)))
                )
            )     

chunk([1,2,3,4,5],2) # [[1, 2], [3, 4], [5]]
8.压缩

以下方法使用 fliter() 删除列表中的错误值(如:False, None, 0 和“”)

def compact(lst):
    return list(filter(bool, lst))     

compact([0, 1, False, 2, '', 3, 'a', 's', 34]) #[1, 2, 3, 'a', 's', 34]
9. 解包(zip)

以下代码段可以用来转换一个二维数组。

array = [['a', 'b'], ['c', 'd'], ['e', 'f']]    
transposed = zip(*array)    
print(list(transposed)) # [('a', 'c', 'e'), ('b', 'd', 'f')]

进阶版:
Creates a list of elements, grouped based on the position in the original lists.
Use max combined with list comprehension to get the length of the longest list in the arguments. Loop for max_length times grouping elements. If lengths of lists vary, use fill_value (defaults to None).

def zip(*args, fillvalue=None): 
    max_length = max([len(lst) for lst in args])
    result = []
    for i in range(max_length):
        result.append([
                args[k][i] if i < len(args[k]) else fillvalue for k in range(len(args))
                                ])
    return result


zip(['a', 'b'], [1, 2], [True, False]) # [['a', 1, True], ['b', 2, False]]
zip(['a'], [1, 2], [True, False]) # [['a', 1, True], [None, 2, False]]
zip(['a'], [1, 2], [True, False], fill_value = '_') # [['a', 1, True], ['_', 2, False]]
10.链式比较

以下代码可以在一行中用各种操作符进行多次比较。

a = 3    
print( 2 < a < 8) # True    
print(1 == a < 2) # False
11.逗号分隔

以下代码段可将字符串列表转换为单个字符串,列表中的每个元素用逗号分隔。

hobbies = ["basketball", "football", "swimming"]
print("My hobbies are: " + ", ".join(hobbies)) # My hobbies are: basketball, football, swimming
12.计算元音字母数

以下方法可计算字符串中元音字母(‘a’, ‘e’, ‘i’, ‘o’, ‘u’)的数目。

import re    
def count_vowels(str):
    # 注:原文中本段代码有误,这里做了更正(by 假如我年华正好)
    return len(re.findall(r'[aeiou]', str, re.IGNORECASE))    

count_vowels('foobar') # 3    
count_vowels('gym') # 0
13.首字母恢复小写

以下方法可用于将给定字符串的第一个字母转换为小写。(Decapitalizes the first letter of a string.)

Decapitalize the first letter of the string and then add it with rest of the string. Omit the upper_rest parameter to keep the rest of the string intact, or set it to True to convert to uppercase.

def decapitalize(string, upper_rest=False):
    return string[:1].lower() + (string[1:].upper() if upper_rest else string[1:])    
    
decapitalize('FooBar') # 'fooBar'
decapitalize('FooBar', True) # 'fOOBAR'
14.平面化

以下方法使用递归来展开潜在的深度列表。

def spread(arg):
    ret = []
    for i in arg:
        if isinstance(i, list):
            ret.extend(i)
        else:
            ret.append(i)            
    return ret

def deep_flatten(lst):
    result = []
    result.extend(
    spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, lst))))    
    return result

deep_flatten([1, [2], [[3], 4], 5]) # [1,2,3,4,5]
16.寻找差异

下面的方法在将给定的函数应用于两个列表的每个元素后,返回两个列表之间的差值。

def difference_by(a, b, fn):
    _b = set(map(fn, b))
    return [item for item in a if fn(item) not in _b]

#example:
from math import floor
difference_by([2.1, 1.2], [2.3, 3.4],floor) # [1.2]
difference_by([{'x': 2 }, {'x': 1 }], [{'x': 1 }], 
              lambda v : v['x']) #[{'x': 2}]
17.链式函数调用

以下方法可在一行中调用多个函数。

def add(a, b):    
    return a + b
def subtract(a, b):
    return a - b

a, b = 4, 5
print((subtract if a > b else add)(a, b)) # 9
18.检查重复值

以下方法使用 set() 方法仅包含唯一元素的事实来检查列表是否具有重复值。(与1雷同)

def has_duplicates(lst):
    return len(lst) != len(set(lst))    

x = [1,2,3,4,5,5]
y = [1,2,3,4,5]
has_duplicates(x) # True
has_duplicates(y) # False
19.合并两个词典

以下方法可用于合并两个词典。

def merge_two_dicts(a, b):
    c = a.copy()   # make a copy of a
    c.update(b)    # modify keys and values of a with the ones from b    
    return c

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
print(merge_two_dicts(a, b)) #{'x': 1, 'y': 3, 'z': 4}

在Python 3.5及更高版本中,你还可以执行以下操作:

def merge_dictionaries(a, b):  
    return {**a, **b}

a = {'x': 1,  'y': 2}
b = {'y': 3,  'z': 4}
print(merge_dictionaries(a, b)) #{'x': 1, 'y': 3, 'z': 4}
20.将两个列表转换成一个词典

以下方法可将两个列表转换成一个词典。

def to_dictionary(keys, values):
    return dict(zip(keys, values))    

keys = ["a", "b", "c"]    
values = [2, 3, 4]
print(to_dictionary(keys, values)) #{'a': 2, 'b': 3, 'c': 4}
21.使用枚举

以下方法将字典作为输入,然后仅返回该字典中的键。

list = ["a", "b", "c", "d"]
for index, element in enumerate(list):
     print("Value", element, "Index ", index, )

#Value a Index  0
#Value b Index  1
#Value c Index  2
#Value d Index  3
22.计算所需时间

以下代码段可用于计算执行特定代码所需的时间。

import time
start_time = time.time()
a = 1
b = 2
c = a + b
print(c) #3
end_time = time.time()
total_time = end_time - start_time
print("Time: ", total_time) #Time:  0.0009965896606445312
23.Try else 指令

你可以将 else 子句作为 try/except 块的一部分,如果没有抛出异常,则执行该子句。

try:
    2*3
except TypeError:
    print("An exception was raised")
else:
    print("Thank God, no exceptions were raised.")
24.查找最常见元素

以下方法返回列表中出现的最常见元素。

def most_frequent(list):
    return max(set(list), key = list.count)  

list = [1,2,1,2,3,2,1,4,2]
most_frequent(list) #2
25.回文

以下方法可检查给定的字符串是否为回文结构。该方法首先将字符串转换为小写,然后从中删除非字母数字字符。最后,它会将新的字符串与反转版本进行比较。

from re import sub
def palindrome(string):
    s = sub('[\W_]', '', string.lower())
    return s == s[::-1]

palindrome('taco cat') # True
26.没有 if-else 语句的简单计算器

以下代码段将展示如何编写一个不使用 if-else 条件的简单计算器。

import operator
action = {
    "+": operator.add,
    "-": operator.sub,    
    "/": operator.truediv,    
    "*": operator.mul,    
    "**": pow
    }

print(action['-'](50, 25)) # 25
27.元素顺序打乱

以下算法通过实现 Fisher-Yates算法 在新列表中进行排序来将列表中的元素顺序随机打乱。

from copy import deepcopy
from random import randint
def shuffle(lst):
    temp_lst = deepcopy(lst)
    m = len(temp_lst)
    while (m):
        m -= 1
        i = randint(0, m)
        temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
        
    return temp_lst

foo = [1,2,3]
shuffle(foo) 
28.列表扁平化

以下方法可使列表扁平化,类似于JavaScript中的 [].concat(…arr)

def spread(arg):
    ret = []
    for i in arg:
    #注意执行本代码的环境中不能有以list命名的变量
        if isinstance(i, list):
            ret.extend(i)
        else:
            ret.append(i)            
    return ret
  
spread([1,2,3,[4,5,6],[7],8,9]) # [1,2,3,4,5,6,7,8,9]
29.变量交换

以下是交换两个变量的快速方法,而且无需使用额外的变量。

def swap(a, b):  
    return b, a

a, b = -1, 14
swap(a, b) # (14, -1)
30.获取缺失键的默认值

通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果在字典中没有包含要查找的键的情况下返回默认值。
如果 get()方法没有设置默认值,那么如果遇到不存在的 Key,则会返回 None。

d = {'a': 1, 'b': 2}
print(d.get('c', 3)) # 3

以上是你在日常工作中可能会发现的有用方法的简短列表。
它主要基于这个GitHub项目(https://github.com/30-seconds/30_seconds_of_knowledge),
你可以在其中找到许多其他有用的代码片段,包括Python及其他编程语言和技术。

作者:Fatos Morina(https://towardsdatascience.com/@FatosMorina

数据科学家 | 软件工程师 | 作者
个人主页:https://www.fatosmorina.com/
via https://towardsdatascience.com/30-helpful-python-snippets-that-you-can-learn-in-30-seconds-or-less-69bb49204172

Mark 作者主页上其它有意思的文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值