Python现在非常流行,主要是因为它简单,容易学习。你可以用它来完成很多任务,比如数据科学和机器学习、web开发、脚本编写、自动化等。
这里总结了100条很有用的tips给你:
1. “for” 循环中的“Else”条件 除了目前为止你已经看到的所有Python代码之外,你有可能错过了下面的“for-else”,这也是我在几周前第一次看到的。
这是一个用于循环遍历列表的“for-else”方法,尽管对列表进行了迭代,但仍然有一个“else”条件,这是非常不寻常的。
这是我在Java、Ruby或JavaScript等其他编程语言中所没有看到的。
让我们看一个实践中的例子。
假设我们要检查列表中是否没有奇数。
让我们来遍历一下:
numbers = [2 , 4 , 6 , 8 , 1 ]for number in numbers: if number % 2
== 1 : print(number) break else : print("No odd numbers" )
如果我们发现一个奇数,那么这个数字将被打印,因为break 将被执行,而else 分支将被跳过。
否则,如果break 从未被执行,执行流将继续执行else 分支。
在这个例子中,我们将输出1。
2. 使用命名的变量从列表中取元素 my_list = [1 , 2 , 3 , 4 , 5 ] one, two, three, four, five = my_list
3. 使用heapq从列表中获取最大或最小的元素 import heapq scores = [51 , 33 , 64 , 87 , 91 , 75 , 15 , 49 , 33 , 82 ] print(heapq.nlargest(3 , scores)) # [91, 87, 82] print(heapq.nsmallest(5 , scores)) # [15, 33, 33, 49, 51]
4. 把列表中的值作为参数传递给方法 可以使用" * "提取列表中的所有元素:
my_list = [1 , 2 , 3 , 4 ]
print(my_list) # [1, 2, 3, 4] print(*my_list) # 1 2 3 4
当我们想将列表中的所有元素作为方法参数传递时,这很有用:
def sum_of_elements (*arg) : total = 0 for i in arg: total += i return total result = sum_of_elements(*[1 , 2 , 3 , 4 ]) print(result) # 10
5. 获取列表的所有中间元素 _, *elements_in_the_middle, _ = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] print(elements_in_the_middle) # [2, 3, 4, 5, 6, 7]
6. 一行赋值多个变量 one, two, three, four = 1 , 2 , 3 , 4
7. 列表推导 你可以使用推导如,让我们将列表中的每个数字都取二次方:
numbers = [1 , 2
, 3 , 4 , 5 ] squared_numbers = [num * num for num in numbers] print(squared_numbers)
推导不仅仅局限于使用列表。还可以将它们与字典、集合和生成器一起使用。
让我们看另一个例子,使用字典推导将一个字典的值提升到二阶:
![](100 Helpful Python Tips You Can Learn Before Finishing Your Morning Coffee.assets/1_4D3OCbHOCfHiI8A3ru4xRQ.png)
Comprehensions are not just limited to working with lists. You can also use them with dictionaries, sets, and generators as well.
dictionary = {'a' : 4 , 'b' : 5 } squared_dictionary = {key: num * num for (key, num) in dictionary.items()} print(squared_dictionary) # {'a': 16, 'b': 25}
8. 通过Enum枚举相同概念的相关项 来自文档:
Enum是绑定到唯一值的一组符号名。它们类似于全局变量,但它们提供了更有用的repr()、分组、类型安全和其他一些特性。
下面是例子:
from enum import Enumclass Status (Enum) : NO_STATUS = -1 NOT_STARTED = 0 IN_PROGRESS = 1 COMPLETED = 2 print(Status.IN_PROGRESS.name) # IN_PROGRESS print(Status.COMPLETED.value) # 2
9. 不使用循环来重复字符串 name = "Banana" print(name * 4 ) # BananaBananaBananaBanana
10. 像数学式子一样比较3个数字 如果你有一个值,你想比较它是否在其他两个值之间,有一个简单的表达式,你在数学中使用:
1 < x < 10
这是我们在小学学过的代数表达式。但是,你也可以在Python中使用相同的表达式。
是的,你没听错。之前,你可能已经做过这种形式的比较:
1 < x and x < 10
现在,你只需要在Python中使用以下代码:
1 10
![img](100 Helpful Python Tips You Can Learn Before Finishing Your Morning Coffee.assets/1_peOH8-oPHF_kxW2UtOpKsw.png)
这在Ruby中行不通,Ruby是一种旨在让程序员开心的编程语言。这在JavaScript中也可以工作。
看到这样一个简单的表达没有得到更广泛的讨论,我真的很惊讶。至少,我还没有看到人们这么频繁地提到它。
11. 在单条语句中合并字典 从Python 3.9开始可用:
first_dictionary = {'name' : 'Fatos' , 'location' : 'Munich' }second_dictionary = {'name' : 'Fatos' , 'surname' : 'Morina' , 'location' : 'Bavaria, Munich' }result = first_dictionary | second_dictionaryprint(result) # {'name': 'Fatos', 'location': 'Bavaria, Munich', 'surname': 'Morina'}
12. 在tuple中找到元素的索引
books = ('Atomic habits' , 'Ego is the enemy' , 'Outliers' , 'Mastery' )print(books.index('Mastery' )) # 3
13. 把字符串列表转换成一个列表 假设你在一个字符串函数中获得输入,但它应该是一个列表:
input = "[1,2,3]"
你不需要那种格式,你需要的是一个列表:
input = [1 ,2 ,3 ]
或者你可能从一个API调用得到以下响应:
input = [[1 , 2 , 3 ], [4 , 5 , 6 ]]
你所要做的就是导入模块ast ,然后调用它的方法literal_eval ,而不用去写复杂的正则表达式:
import astdef string_to_list(string): return ast.literal_eval(string)
这就是你需要做的。
现在你会得到一个列表作为结果,或者列表的列表,如下所示:
import astdef string_to_list (string) :
return ast.literal_eval(string) string = "[[1, 2, 3],[4, 5, 6]]" my_list = string_to_list(string) print(my_list) # [[1, 2, 3], [4, 5, 6]]
14. 使用命名参数避免 “trivial” 错误 假设你想求两个数的差。差不是可交换的:
a - b != b -a
然而,我们可能会忘记参数的顺序,这可能会导致“trivial”错误:
def subtract (a, b) : return a - b print((subtract(1 , 3 ))) # -2 print((subtract(3 , 1 ))) # 2
为了避免这种潜在的错误,我们可以简单地使用命名参数,参数的顺序不再重要:
def subtract (a, b) : return a - b print((subtract(a=1 , b=3 ))) # -2 print((subtract(b=3 , a=1 ))) # -2
15. 使用单个print()语句打印多个元素 print(1 , 2 , 3 , "a"
, "z" , "this is here" , "here is something else" )
16. 一行打印多个元素 print("Hello" , end="" ) print("World" ) # HelloWorld print("Hello" , end=" " ) print("World" ) # Hello World print('words' , 'with' , 'commas' , 'in' , 'between' , sep=', ' )# words, with, commas, in, between
17. 打印多个值,每个值之间使用自定义分隔符 你可以很容易地做高级打印:
print("29" , "01" , "2022" , sep="/" ) # 29/01/2022 print("name" , "domain.com" , sep="@" ) # name@domain.com
18. 不能在变量名的开头使用数字 four_letters = “abcd” # this works4_letters = “abcd” # this doesn’t work
19. 不能在变量名的开头使用操作符 +variable = “abcd” # this doesn’t work
20. 你不能把0作为数字的第一个数字 number = 0110 # this doesn't work
21. 你可以在变量名的任何位置使用下划线字符 这意味着,在任何你想要的地方,在变量名中,你想要多少次就有多少次:
a______b = "abcd" # this works _a_b_c_d = "abcd" # this also works
我不鼓励你使用它,但如果你看到像这样奇怪的变量命名,要知道它实际上是一个有效的变量名。
22. 可以用下划线分隔较大的数字 这样读起来更容易。
print(1 _000_000_000) # 1000000000 print(1 _234_567) # 1234567
23. 颠倒列表的顺序 my_list = ['a' , 'b' , 'c' , 'd' ] my_list.reverse() print(my_list) # ['d', 'c', 'b', 'a']
24. 使用step函数对字符串切片 my_string = "This is just a sentence" print(my_string[0 :5 ]) # This # Take three steps forward print(my_string[0 :10
:3 ]) # Tsse
25. 反向切片 my_string = "This is just a sentence" print(my_string[10 :0 :-1 ]) # suj si sih # Take two steps forward print(my_string[10 :0 :-2 ]) # sjs i
26. 只有开始或结束索引的部分切片 表示切片的开始和结束的索引可以是可选的。
my_string = "This is just a sentence" print(my_string[4 :]) # is just a sentence print(my_string[:3 ]) # Thi
27. Floor 除法 print(3 /2 ) # 1.5 print(3 //2 ) # 1
28. == 和 “is” 的差别 " is "检查两个变量是否指向内存中的同一个对象。
" == "比较这两个对象的值是否相等。
first_list = [1 , 2 , 3 ]
second_list = [1 , 2 , 3 ]# Is their actual value the same? print(first_list == second_list) # True # Are they pointing to the same object in memory print(first_list is second_list) # False, since they have same values, but in different objects in memory third_list = first_list print(third_list is first_list) # True, since both point to the same object in memory
29. 更改分配给另一个变量的变量的值 当一个变量被赋值给另一个变量时,它的值实际上被复制到第二个变量中。
这意味着第一个变量之后的任何变化都不会反映在第二个变量中:
first = "An initial value" second = first first = "An updated value" print(first) # An updated value print(second) # An initial value
30. 检查一个字符串是否大于另一个字符串 first = "abc" second = "def" print(first # True second = "ab" print(first # False
31. 检查字符串是不是从特定字符开始的 my_string = "abcdef" print(my_string.startswith("b" )) # False
32. 使用id()找到变量的唯一id
print(id(1 )) # 4325776624 print(id(2 )) # 4325776656 print(id("string" )) # 4327978288
33. Integers, floats, strings, booleans, sets以及tuples是不可修改的 当将变量赋给整数、浮点数、字符串、布尔值、集合和元组等不可变类型时,该变量将指向内存中的对象。
如果给该变量赋了另一个值,原来的对象仍然在内存中,但是指向它的变量丢失了:
number = 1 print(id(number)) # 4325215472 print(id(1 )) # 4325215472 number = 3 print(id(number)) # 4325215536 print(id(1 )) # 4325215472