Python语言奇淫技巧或语法糖收集

编程 2022年10月08日 129 0

使用这些技巧可以帮助你减少代码并优化执行,让你的代码更加简洁。

1、两个变量互换

Python 提供了一种在一行中进行赋值和交换的直观方式。请参考下面的例子。

x, y = 10, 20
print(x, y)

x, y = y, x
print(x, y)

#1 (10, 20)
#2 (20, 10)

右边的赋值为一个新的元组播种。而左边的立即将那个(未引用的)元组解包到名称 <a> 和 <b>

分配完成后,新元组将被取消引用并标记为垃圾收集。变量的交换也发生在最终。

2、连续赋值

a = b = c = 50

3、自动解包

a,b,c = [1,2,3]
print(a)
print(b)
print(c)

#1 1
#2 2
#3 3
a, *others = [1,2,3,4]
print(a)
print(others)

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

4、链式比较

n = 10 
result = 1 < n < 20 
print(result) 

# True 

result = 1 > n <= 9 
print(result) 

# False

5、重复列表

list_repeat = [5,2]*4
print(list_repeat)

# [5, 2, 5, 2, 5, 2, 5, 2]

6、重复字符串

str_repeat = "hello"*3
print(str_repeat)

# 'hellohellohello'

7、三目运算

三元运算符是 if-else 语句的快捷方式,也称为条件运算符

[on_true] if [expression] else [on_false]
age = 30
slogon = "牛逼" if  age == 30 else "niubility"

等价于:

if age == 30:
    slogon = "牛逼"
else:
    slogon = "niubility"

8、合并字典

a= {"a":1}
b= {"b":2}
c={**a, **b}
print(c)

# {'a': 1, 'b': 2}

9、字符串反转

s = "i love python"
print(s[::-1])

# 'nohtyp evol i'

10、列表转字符串

s_list = ["i", "love", "pyton"]
s = " ".join(s_list)
print(s)

# 'i love pyton'

11、for else 语句

检查列表foo是否有0,有就提前结束查找,没有就是打印“未发现"

found = False
for i in foo:
    if i == 0:
        found = True
        break
if not found: 
    print("未发现")

如果用 for else 语法来写可以省几行代码

for i in foo:
    if i == 0:
        break
else:
    print("未发现")

12、字典推导式

m = {x: x**2 for x in range(5)}
print(m)

# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

13、查找列表中出现最多的元素

content = ["a", "b", "c", "a", "d", "c", "a"]
most = max(set(content), keys=content.count)
print(most)

# 3

借助Counter方法

content = ["a", "b", "c", "a", "d", "c", "a"]
from collections import Counter
c = Counter(content)
print(c.most_common(1))

# [('a', 3)]

出现第1多的元素是a,一共出现3次, 你也可以用类似的方法找出第二多或者第三多的。

14、默认字典值

给字典中的value设置为列表,普通方法

d = dict()
if 'a' not in d:
    d['a'] = []
d['a'].append(1)

使用defaultdict默认字典构建一个初始值为空列表的字典

from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)

15、赋值表达式

这是3.8的新特性,赋值表达式又成为海象运算符:=, 可以将变量赋值和表达式放在一行,什么意思? 看代码就明白

import re
data = "hello123world"
match = re.search("(\d+)", data)  # 3
if match:                         # 4
    num = match.group(1)
else:
    num = None

第3、4行 可以合并成一行代码

if match:=re.search("(\d+)", data):
    num = match.group(1)
else:
    num = None

16、判断实例类型

isinstance 函数可用于判断实例的类型,其实第二个参数可以是多个数据类型组成的元组。例如:

isinstance(x, (int, float))

# 等价于

isinstance(x, int) or isinstance(x, float)

类似的函数还有字符串的startswith,endswith,例如:

s.startswith(('"""', "'''"))

# 等价于

s.startswith("'''") or s.startswith('"""')

17、用 http.server 共享文件

# python3
python3 -m http.server

# python2
python -m SimpleHTTPServer 8000

18、zip 函数实现字典键值对互换

lang = {"python":".py", "java":".java"}
result = dict(zip(lang.values(), lang.keys()))
print(result)

# {'.java': 'java', '.py': 'python'}

19、检查对象的内存使用情况

在 Python 2.7 中,32 位整数消耗 24 字节,而在 Python 3.5 中使用 28 字节。为了验证内存使用情况,我们可以调用 方法。

Python 2.7.

import sys
x=1
print(sys.getsizeof(x))

#-> 24

Python 3.5.

import sys
x=1
print(sys.getsizeof(x))

#-> 28

20、使用 slots 节省内存

class MyClass(object):
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
        self.set_up()


print(sys.getsizeof(MyClass))


class MyClass(object):
    __slots__ = ['name', 'identifier']

    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
        self.set_up()


print(sys.getsizeof(MyClass))

# In Python 3.5
# 1-> 1016
# 2-> 888

21、扩展列表

i = ['a','b','c']
i.extend(['e','f','g'])
print(i)

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

22、列表负数索引

a = [ 1, 2, 3]
print(a[-1])

# 3

23、二维数组变一维数组

import itertools
a = [[1, 2], [3, 4], [5, 6]]
i = itertools.chain(*a)
print(list(i))

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

24、有索引的迭代

a = ['Merry', 'Christmas ', 'Day']
for i, x in enumerate(a):
    print '{}: {}'.format(i, x)

# 0: Merry
# 1: Christmas
# 2: Day

25、列表推导式

le = [x*2 for x in range(10)]
print(le) # 每个数乘以2

# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


le = [x for x in range(10) if x%2 == 0]
print(le) # 获取偶数项

# [0, 2, 4, 6, 8]

26、生成器表达式

>>> ge = (x*2 for x in range(10))
>>> ge
<generator object <genexpr> at 0x01948A50>
>>> next(ge)
0
>>> next(ge)
2
>>> next(ge)
4
...
>>> next(ge)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

27、有序字典

from collections import OrderedDict
m = OrderedDict((str(x), x) for x in range(10))
print(m.keys())  # key 按照插入的顺序排列

# odict_keys(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])

28、两个列表组合成字典

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

29、去除列表中重复元素

my_list = [1,4,1,8,2,8,4,5]
my_list = list(set(my_list))
print(my_list)

30、打印日历

import calendar

>>> print(calendar.month(2021, 1))
    January 2021
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

31、使用多行字符串

基本方法是使用从 C 语言派生的反斜杠。

multiStr = "select * from multi_row \
where row_id < 5"
print(multiStr)

# select * from multi_row where row_id < 5

另一个技巧是使用三引号。

multiStr = """select * from multi_row 
where row_id < 5"""
print(multiStr)

#select * from multi_row 
#where row_id < 5

上述方法的共同问题是缺乏适当的缩进。如果我们尝试缩进,它会在字符串中插入空格。

所以最终的解决方案是将字符串拆分成多行,并将整个字符串括在括号中。

multiStr= ("select * from multi_row "
"where row_id < 5 "
"order by age") 
print(multiStr)

#select * from multi_row where row_id < 5 order by age

32、打印导入模块的文件路径

如果您想知道代码中导入的模块的绝对位置,请使用以下技巧。

import threading 
import socket

print(threading)
print(socket)

#1- <module 'threading' from '/usr/lib/python2.7/threading.py'>
#2- <module 'socket' from '/usr/lib/python2.7/socket.py'>

33、使用交互式“_”运算符

这是一个有用的功能,我们很多人都不知道。

在 Python 控制台中,每当我们测试表达式或调用函数时,结果都会发送到临时名称 _(下划线)。

>>> 2 + 1
3
>>> _
3
>>> print _
3

“_”引用上次执行的表达式的输出。

34、在 Python 中使用枚举

我们可以使用以下方法来创建枚举定义。

class Shapes:
	Circle, Square, Triangle, Quadrangle = range(4)

print(Shapes.Circle)
print(Shapes.Square)
print(Shapes.Triangle)
print(Shapes.Quadrangle)

#1-> 0
#2-> 1
#3-> 2
#4-> 3

35、从函数返回多个值

支持此功能的编程语言并不多。但是,Python 中的函数确实会返回多个值。

请参考以下示例以查看它的工作情况。

# function returning multiple values.
def x():
	return 1, 2, 3, 4

# Calling the above function.
a, b, c, d = x()

print(a, b, c, d)

#-> 1 2 3 4

36、使用 splat 运算符解包函数参数

splat 运算符提供了一种解压参数列表的艺术方式。为清楚起见,请参阅以下示例。

def test(x, y, z):
	print(x, y, z)

testDict = {'x': 1, 'y': 2, 'z': 3} 
testList = [10, 20, 30]

test(*testDict)
test(**testDict)
test(*testList)

#1-> x y z
#2-> 1 2 3
#3-> 10 20 30

37、使用 Assert 处理异常

异常处理是编程中一个非常重要的概念。使用 assert 关键字和给定的条件打印错误语句。如果给定的条件不为真,那么它将打印一条错误消息并终止程序。

x = int(input("enter a number to divide ")) 
assert x<=-1 and x>0, 'Number should be greater than 0' 
ans = 100/x 
print(f'The output is {ans}')

38、下划线作为分隔符

在程序中使用大数字时,使用下划线代替逗号作为分隔符可以提高可读性。Python 语法不承认下划线。它用下划线表示,以首选格式表示数字并且可读。

x = 10_000_000_000
print(f" It is Ten Billion: {x}")  

39、尝试 f 字符串格式

F 字符串格式是在 Python 3.6 版本中引入的。它是最简单易行的字符串格式化方法。使用 f 字符串格式而不是传统格式使代码易于理解。

Name = input("Enter your name ")
print(f'Hello{Name}! This is a Python Example')    

40、使用 lambda 代替函数

Lambda 是最强大的函数之一,也称为匿名函数。它不需要名称或函数定义或返回语句。普通函数 def 关键字,而 lambda 函数使用 lambda 关键字。它的工作方式与函数类似,只是它只适用于一个表达式。

x = lambda a, b : a + b
print(x(1, 2))  

41、打印语句中的条件

这个程序很有趣并且包含了相当多的操作。首先,将执行输入法,然后将输入值更改为整数。然后它将检查条件并返回一个布尔值。如果它返回,一个非零数字奇数将是输出,或者,如果它返回零,那么偶数将是输出。

print("odd" if int(input("enter the value"))%2 else "even")  

42、条件列表 All 和 Any

在这个程序中,我们一次检查一个条件列表。有两个函数:all()和any()。顾名思义,当我们使用 all() 时,所有条件都必须为真。并且当使用any()时,即使其中一个条件为真,代码块也会被执行。

Marks = 350
Percentage = 60
Passed = 5
Conditions = [Marks>200, Percentage>50,Passed>4]
if(all(Conditions)):
    print("Hired for a company A")
elif(any(Conditions)):
    print("Hired for a company B")
else:
    print("Rejected") 

43、用 Floor 和 Ceil 函数进行四舍五入

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

import math
my_number = 18.7
print(math.floor(my_number))
print(math.ceil(my_number))

44、对列表中所有元素应用函数

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

语法:map(function, iterable)

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

# ['Felix', 'Antony']

45、使用 Filter 函数过滤值

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

语法:filter(function, iterable)

def eligibility(age):
    return age>=24
list_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]

46、使用 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 1
# b 2
# c 3

参考文章