实现更好编码的30个神奇的 Python 技巧

2020 年 7 月 14 日

实现更好编码的30个神奇的 Python 技巧

本文最初发表在 Medium 博客,经原作者 Felix Antony 授权,InfoQ 中文站翻译并分享。


本文提供了 30 个 Python 技巧,可以将你的逻辑变成更优雅的代码。


Python 因其代码的简单性和可读性,在其他编程语言中相当受欢迎。它是最简单的编程语言之一,可以作为你的第一门语言。如果你是一个初学者,具备 Python 的基本概念,那么现在就是学习编写更好代码的最佳时机。


在 Python 中,有很多技巧,可以比以前更好地改进你的代码。本文将帮助你了解 Python 中可用的各种技巧和提示。不断地练习,直到它内化成你编程习惯的一部分。


技巧 01:变量的多重赋值


Python 允许我们在一行中为多个变量赋值。变量可以用逗号分隔。在一行中为变量多重赋值有很多好处。它可用于为多个变量分配多个值,或为单个变量分配多个值。让我们来看一个问题陈述,其中,我们必须给变量 a 和 b 赋值 50 和 60。通常的代码如下所示:


a = 50b = 60print(a,b)print(type(a))print(type(b))
复制代码


输出


50 60<class 'int'><class 'int'>
复制代码


条件 I:等于变量的值


当变量和多个赋值的值相等时,每个值将存储在所有变量中。


a , b = 50 , 60print(a,b)print(type(a))print(type(b))
复制代码


输出


50 60<class 'int'><class 'int'>
复制代码


这两个代码都给出了相同的结果。这就是使用一行赋值的好处。


条件 II:大于变量的值


让我们尝试增加前一个代码中的值的数量。可以将多个值赋给单个变量。将多个值赋给一个变量时,必须在变量名前使用星号。


a , *b = 50 , 60 , 70print(a)print(b)print(type(a))print(type(b))
复制代码


输出


50[60, 70]<class 'int'><class 'list'>
复制代码


第一个值将分配给第一个变量,第二个变量将从给定值中获取一组值。这将创建一个列表类型对象。


条件 III:一个值分配给多个变量


我们可以将一个值赋给多个变量。每个变量将使用等号来分隔。


a = b = c = 50print(a,b,c)print(type(a))print(type(b))print(type(c))
复制代码


输出


50 50 50<class 'int'><class 'int'><class 'int'>
复制代码


技巧 02:交换两个变量


交换是两个变量的值相互交换的过程。这在计算机科学的许多操作中都很有用。在这里,我编写了程序员用来交换值以及最佳解决方案的两个主要方法。


方法 I:使用临时变量


此方法使用一个临时变量来存储一些数据。以下代码是用临时变量名编写的。


a , b = 50 , 60print(a,b)temp = a+b  #a=50 b=60 temp=110b = a       #a=50 b=50 temp=110a = temp-b  #a=60 b=50 temp=110print("After swapping:",a,b)
复制代码


输出


50 60After swapping: 60 50
复制代码


方法 II:不使用临时变量


下面的代码是在不使用临时变量的情况下交换变量。


a , b = 50 , 60print(a,b)a = a+b  #a=110 b=60b = a-b  #a=110 b=50a = a-b  #a=60  b=50print("After swapping:",a,b)
复制代码


输出


50 60After swapping: 60 50
复制代码


方法 III:Python 中的最佳解决方案


这是使用 Python 交换变量的另一种方法。在上个技巧中,我们已经了解了多重赋值我们可以使用交换的概念。


a , b = 50 , 60print(a,b)a , b = b , aprint("After swapping",a,b)
复制代码


输出


50 60After swapping 60 50
复制代码


技巧 03:字符串反转


在 Python 中反转字符串还有一个很酷的技巧。用于反转字符串的概念成为字符串切片。任何字符串都可以在变量名之后使用符号 [::-1] 进行反转。


my_string = "MY STRING"rev_string = my_string[::-1]print(rev_string)
复制代码


输出


GNIRTS YM
复制代码


技巧 04:在一行中拆分单词


在一行中拆分单词不需要特殊的算法。为此,我们可以使用关键字 split()。在这里,我编写了两种拆分单词的方法。


方法 I:使用迭代


my_string = "This is a string in Python"start = 0end = 0my_list = []for x in my_string:    end=end+1    if(x==' '):        my_list.append(my_string[start:end])        start=end+1my_list.append(my_string[start:end+1])print(my_list)
复制代码


输出


['This ', 'is ', 'a ', 'string ', 'in ', 'Python']
复制代码


方法 II: 使用 split 函数


my_string = "This is a string in Python"my_list = my_string.split(' ')print(my_list)
复制代码


输出


['This ', 'is ', 'a ', 'string ', 'in ', 'Python']
复制代码


技巧 05:将单词列成一行


这是与上一个部分相反的过程中。在这个部分中,我们将使用 join 函数将单词列表转换为单行。下面给出了使用 join 函数的语法。


语法:"".join(string)


my_list = ['This' , 'is' , 'a' , 'string' , 'in' , 'Python']my_string = " ".join(my_list)
复制代码


输出


This is a string in Python
复制代码


技巧 06:多次打印字符串


我们可以使用乘法运算符多次打印字符串。这是重复字符串的一种非常有效的方法。


n = int(input("How many times you need to repeat:"))my_string = "Python\n"print(my_string*n)
复制代码


输出


How many times you need to repeat:3PythonPythonPython
复制代码


技巧 07:使用加法运算符连接两个字符串


可以在不使用 join 函数的情况下连接各种字符串。我们可以使用加法运算符(+)来完成这个操作。


a = "I Love "b = "Python"print(a+b)
复制代码


输出


I Love Python
复制代码


技巧 08:多个条件运算符


在一个程序中结合两个或多个条件运算符,我们可以使用逻辑运算符。但是,通过连接操作符也可以得到同样的结果。例如,当一个变量的值大于 10 且小于 20 时,打印某些内容,则代码将如下所示:


a = 15if (a>10 and a<20):    print("Hi")
复制代码


取而代之的是,我们可以将条件运算符组合成单个表达式:


a = 15if (10 < a < 20):    print("Hi")
复制代码


输出


Hi
复制代码


技巧 09:在列表中查找最频繁的元素


在列表中出现次数最多的元素,那么它将是列表中最频繁的元素。下面的代码片段将帮助你从列表中获取最频繁的元素。


my_list = [1,2,3,1,1,4,2,1]most_frequent = max(set(my_list),key=my_list.count)print(most_frequent)
复制代码


输出


1
复制代码


技巧 10:查找列表中所有元素的出现次数


前面的代码将给出最频繁的值。如果需要知道列表中所有唯一元素的出现次数,那么可以使用 collections 模块。collections 是 Python 中一个非常棒的模块,它提供了很多特性。Counter 方法提供了一个包含元素和出现项对的字典。


from collections import Countermy_list = [1,2,3,1,4,1,5,5]print(Counter(my_list))
复制代码


输出


Counter({1: 3, 5: 2, 2: 1, 3: 1, 4: 1})
复制代码


技巧 11:检查两个字符串的易位构词


如果一个字符串由另一个字符串中的字符组成,那么这两个字符串就是易位构词(Anagram)。我们可以使用来自 collections 模块的相同的 Counter 方法。


from collections import Countermy_string_1 = "RACECAR"my_string_2 = "CARRACE"if(Counter(my_string_1) == Counter(my_string_2)):    print("Anagram")else:    print("Not Anagram")
复制代码


输出


Anagram
复制代码


技巧 12:创建带范围的数字序列


函数 range() 对于创建数字序列很有用。它在许多代码片段中都很有用。Range 函数的语法如下:


语法:range(start, end, step)


让我们试着创建一个偶数列表。


my_list = list(range(2,20,2))print(my_list)
复制代码


输出


[2, 4, 6, 8, 10, 12, 14, 16, 18]
复制代码


技巧 13:多次重复元素


与字符串乘法类似,我们可以使用乘法运算符多次创建一个用元素填充的列表。


my_list = [3]my_list = my_list*5print(my_list)
复制代码


输出


[3, 3, 3, 3, 3]
复制代码


技巧 14:在三元运算符中使用条件


在大多数情况下,我们在 Python 中使用嵌套的条件结构。可以用三元运算符代替单行,而不是使用嵌套结构。语法如下所示。


语法:Statement1 if True else Statement2


age = 25print("Eligible") if age>20 else print("Not Eligible")
复制代码


输出


Eligible
复制代码


技巧 15:使用 Python 进行列表理解


列表理解(List Comprehension)是从另一个列表中创建列表的一种非常紧凑的方式。请看以下代码。第一个是使用简单迭代编写的,第二个是使用列表理解创建的。


square_list = []for x in range(1,10):    temp = x**2    square_list.append(temp)print(square_list)
复制代码


输出


[1, 4, 9, 16, 25, 36, 49, 64, 81]
复制代码


使用列表理解


square_list = [x**2 for x in range(1,10)]print(square_list)
复制代码


输出


[1, 4, 9, 16, 25, 36, 49, 64, 81]
复制代码


技巧 16:将可变转换为不可变


函数 frozenset()用于将可变迭代对象转换为不可变对象。使用这个函数,我们可以冻结一个对象,而不改变它的值。


my_list = [1,2,3,4,5]my_list = frozenset(my_list)my_list[3]=7print(my_list)
复制代码


输出


Traceback (most recent call last):  File "<string>", line 3, in <module>TypeError: 'frozenset' object does not support item assignment
复制代码


当我们在列表中应用 frozenset() 函数时,项目分配是受限的。


技巧 17:用 Floor 和 Ceil 函数进行四舍五入


Floor 和 Ceil 是数学函数,可用于浮点数。Floor 函数返回小于浮点值的整数,而 Ceil 函数返回大于浮点值的整数。要是用这个函数,我们必须导入 math 模块。


import mathmy_number = 18.7print(math.floor(my_number))print(math.ceil(my_number))
复制代码


输出


1819
复制代码


技巧 19:返回布尔值


有时我们必须通过检查某些参数的条件来返回布尔值。我们可以直接返回条件,而不是写 if else 语句。下面的代码将产生相同的输出。


方法 I:使用 If Else 条件


def function(n):    if(n>10):        return True    else:        return Falsen = int(input())if(function(n)):    print("Eligible")else:    print("Not Eligible")
复制代码


方法 II:不使用 If Else 条件


def function(n):    return n>10n = int(input())print("Eligible") if function(n) else print("Not Eligible")
复制代码


输出


11Eligible
复制代码


技巧 19:在一行中创建函数


Lambda 是 Python 中的一个匿名函数,它可以在一行中创建函数。下面给出了使用 Lambda 函数的语法。


语法:lambda arguments: expression


x = lambda a,b,c : a+b+cprint(x(10,20,30))
复制代码


输出


60
复制代码


技巧 20:对列表中所有元素应用函数


Map 是一个高阶函数,它为列表中所有元素应用特定的函数。


语法:map(function, iterable)


my_list = ["felix", "antony"]new_list = map(str.capitalize,my_list)print(list(new_list))
复制代码


输出


['Felix', 'Antony']
复制代码


技巧 21:将 Lambda 和 Map 函数一起使用


这个函数可以用 Python 中的 Lambda 函数替换。下面的代码用于创建数字列表的平方。


my_list = [1, 2, 3, 4, 5]new_list = map(lambda x: x*x, my_list)print(list(new_list))
复制代码


输出


[1, 4, 9, 16, 25]
复制代码


技巧 22 从一个函数返回多个值


一个 Python 函数可以返回多个值,而不需要任何额外的需求。我们可以通过逗号分隔这些来返回值。


def function(n):    return 1,2,3,4a,b,c,d = function(5)print(a,b,c,d)
复制代码


输出


1 2 3 4
复制代码


技巧 23:使用 Filter 函数过滤值


Filter 函数用于过滤可迭代对象中的一些值。Filter 函数的语法如下所示。


语法:filter(function, iterable)


def eligibility(age):    return age>=24list_of_age = [10, 24, 27, 33, 30, 18, 17, 21, 26, 25]age = filter(eligibility, list_of_age)print(list(age))
复制代码


输出


[24, 27, 33, 30, 26, 25]
复制代码


技巧 24:在 Python 中合并两个词典


在 Python 中,我们可以合并两个字典,而不需要任何特定的方法。下面的代码是合并两个字典的示例。


dict_1 = {'One':1, 'Two':2}dict_2 = {'Two':2, 'Three':3}dictionary = {**dict_1, **dict_2}print(dictionary)
复制代码


输出


{'One': 1, 'Two': 2, 'Three': 3}
复制代码


技巧 25:获取对象的大小


内存的大小根据对象的类型的不同而不同。我们可以使用 sys 模块中的 getsizeof() 函数来获取对象的内存。


import sysa = 5print(sys.getsizeof(a))
复制代码


输出


28
复制代码


技巧 26:将两个列表合并为词典


Zip 函数在 Python 中有很多优点,使用 zip 函数,可以从两个列表中创建词典。


list_1 = ["One","Two","Three"]list_2 = [1,2,3]dictionary = dict(zip(list_1, list_2))print(dictionary)
复制代码


输出


{'Two': 2, 'One': 1, 'Three': 3}
复制代码


技巧 27:计算程序的执行时间


Time 是 Python 中另一个有用的模块,可以用来计算执行时间。


import timestart = time.clock()for x in range(1000):    passend = time.clock()total = end - startprint(total)
复制代码


输出


0.00011900000000000105
复制代码


技巧 28:删除列表中的重复元素


出现多次的元素称为重复元素。我们可以简单地使用 typecasting 来删除重复的元素。


my_list = [1,4,1,8,2,8,4,5]my_list = list(set(my_list))print(my_list)
复制代码


输出


[8, 1, 2, 4, 5]
复制代码


技巧 29:用 Python 打印月历


Calendar 模块有许多与日期的操作相关的功能。我们可以使用以下代码来打印月历。


import calendarprint(calendar.month("2020","06"))
复制代码


输出


     June 2020Mo Tu We Th Fr Sa Su 1  2  3  4  5  6  7 8  9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30
复制代码


技巧 30:使用 Zip 函数进行迭代


Zip 函数支持使用循环迭代多个可迭代的过程。在下面的代码中,两个列表同时被迭代。


list_1 = ['a','b','c']list_2 = [1,2,3]for x,y in zip(list_1, list_2):    print(x,y)
复制代码


输出


a 1b 2c 3
复制代码


结语


我希望你喜欢本文。最后,你必须明白,学习这些技巧并非必须。但如果你学了这些技巧,你就可以在其他程序员中脱颖而出。要想熟练地编写代码,就必须进行持续不断的练习。


祝你编码快乐!


作者介绍:


Felix Antony,关于科学、技术和自我发展的技术作家。


原文链接:


https://towardsdatascience.com/30-magical-python-tricks-to-write-better-code-e54d1642c255


2020 年 7 月 14 日 07:004559
用户头像
刘燕 InfoQ记者

发布了 470 篇内容, 共 146.9 次阅读, 收获喜欢 829 次。

关注

评论 1 条评论

发布
用户头像
技巧9 应该是这样
my_list = [2,2,3,1,1,4,2,1]
most_frequent = max(my_list,key=my_list.count)
print(most_frequent)
2020 年 09 月 08 日 15:39
回复
没有更多评论了
发现更多内容

《小狗钱钱》——财富离我们并不遥远

尹晓铁

读书笔记 投资 成长 思维方式

1. 什么是Xamarin.md

喵叔

C#

是时候要说再见了,春风十里,不如邮你!

乐少

【深度】为您解读东西方艺术教育的专业设置差异对比~

默聲

特别评论:甲骨文的傲气

张晓楠

云计算 互联网巨头 企业文化

dubbo-go 中如何实现远程配置管理

joe

golang Apache 开源 微服务架构 dubbo

分布式数据库是无用的屠龙术吗?

海边的Ivan

企业架构 分布式数据库 业务中台

var lady first

喵叔

C# .net 编码习惯

测试

Chonge

删掉最后一句话

池建强

心理学 情绪控制

小议RPA

一品凡心

人工智能 RPA 自动化

规范约束条件

喵叔

C# .net 编码习惯

减少装箱与拆箱

喵叔

C# .net 编码习惯

此为开卷

范学雷

浅谈汽车行业嵌入式软件发布的流程有多复杂

WB

程序员 软件

从流程、认知上做稳定的系统演进

Skysper

系统设计 质量管理

喔,明白了,成功也是一种苦难

泰稳@极客邦科技

创业 身心健康 企业文化 个人成长 心理

多用as少用强制类型转换

喵叔

初入响应式编程(上)

CD826

spring 微服务 Spring Cloud 响应式编程 reactor

如何做一名失败的安全架构师

石君

架构 安全架构师 安全评估

精纯还是混乱?职场十二箴言——重读“成为乔布斯”的思考(二)

石君

创业 乔布斯 成为乔布斯

Elasticsearch文档版本冲突原理与解决

Skysper

elasticsearch 乐观锁 悲观锁

禁止在构造函数里调用虚函数

喵叔

C# .net 编码习惯

翻译: Effective Go (2)

申屠鹏会

go 翻译

HTTP Methods和RESTful API的设计

孙苏勇

架构 系统设计 RESTful 接口

做小池塘里的大鱼,还是大池塘里的小鱼?这是个问题。

泰稳@极客邦科技

创业 团队管理 目标管理

精纯还是混乱?职场十二箴言——重读“成为乔布斯”的思考(一)

石君

职场 乔布斯 成功学

做产品的同理心

孙苏勇

产品 产品经理 产品设计

2.Hello Xamarin

喵叔

C#

走出舒适区最好办法别走了,扩大它

乐少

任正非管理哲学中的三个常识和三种科学

泰稳@极客邦科技

创业 团队管理 华为

实现更好编码的30个神奇的 Python 技巧-InfoQ