Skip to content

Latest commit

 

History

History
 
 

Standard

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Pythonic

让python代码更加优雅,也包含一些奇淫技巧

以我为准

主程序

开头都加上:if __name__ == '__main__':

PySnooper调试

import pysnooper

@pysnooper.snoop()
def func1():
    a = 0
    for i in range(2):
        a += 1

func1()
>>> 
Source path:... <ipython-input-22-530479303b4e>
15:51:55.512317 call         6 def func1():
15:51:55.512317 line         7     a = 0
New var:....... a = 0
15:51:55.512317 line         8     for i in range(2):
New var:....... i = 0
15:51:55.512317 line         9         a += 1
Modified var:.. a = 1
15:51:55.512317 line         8     for i in range(2):
Modified var:.. i = 1
15:51:55.512317 line         9         a += 1
Modified var:.. a = 2
15:51:55.512317 line         8     for i in range(2):
15:51:55.512317 return       8     for i in range(2):
Return value:.. None

输出Print

print(' Beautiful '.center(40,'-'))
>>> -------------- Beautiful ---------------
item = 1
print(f'the result is {item}') # f-string 用法
>>> the result is 1
class color:
   PURPLE = '\033[95m'
   CYAN = '\033[96m'
   DARKCYAN = '\033[36m'
   BLUE = '\033[94m'
   GREEN = '\033[92m'
   YELLOW = '\033[93m'
   RED = '\033[91m'
   BOLD = '\033[1m'
   UNDERLINE = '\033[4m'
   END = '\033[0m'
print(color.BOLD + 'Hello World !' + color.END) # 加粗print()输出的特定部分

向量矩阵

一律借助 numpy

import numpy as np 

np.array([1,2,3]).shape # 一维数组
>>> (3,)
np.array([[1,2,3]]).shape # 二维数组
>>> (1,3)
np.array([[1],[2],[3]]).shape # 二维数组
>>> (3,1)

如果要使用@矩阵乘法,请用二维数组形式,避免使用一维数组形式

多值赋值

a = 10
b = 5
a, b = b, a

条件赋值

x = 3 if (y == 1) else 2

奇淫技巧

合并列表

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = sum(a,[])
print(b)
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器yield

在某些情况下用来替换函数中的 return参考

我们把数据看作是一个容器,在使用数据时,有时候是逐个获取其中的元素,这个过程叫[迭代]

可以在以下几种情况使用yield:

1、调用函数的结果时,需要用 for .. in ..形式,也就是把它看成一个生成器函数的时候

2、当函数中每次生成的值不一样时,之前我们会使用一个变量来存储,最后一起返回,这时候使用yield就可以不需要新变量,直接使用一个生成器

看一个输出斐波拉契数列前N项的例子

# old method1 直接print输出
def fab(max): 
   n, a, b = 0, 0, 1 
   while n < max: 
       print(b)
       a, b = b, a + b 
       n = n + 1
    
fab(5)
>>> 1
 	1 
	2 
	3 
	5
# old method2 先存到一个数组里
def fab(max): 
   n, a, b = 0, 0, 1 
   L = [] 
   while n < max: 
       L.append(b) 
       a, b = b, a + b 
       n = n + 1 
   return L
   
for n in fab(5):
	print(n)
>>> 1 
	1 
	2 
	3 
	5
# new method
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b 
        a, b = b, a + b 
        n = n + 1
        
for n in fab(5):
	print(n)
>>> 1 
	1 
	2 
	3 
	5

函数参数解包(unpacking)

列表前面加 星号 :将列表解开成独立的元素作为形参

字典前面加 两个星号 :是将字典解开成独立的元素作为形参

def func1(a, b):
    return a + b
 
data = [4, 3]
print(func1(*data)) # equals to print(func1(4, 3))
>>> 7
def func1(a, b):
    return a + b
 
data = {'a' : 4, 'b' : 3}
print(add(**data)) # equals to print(func1(4, 3))
>>> 7

同时输出元素和索引

iterable = [5,4,3,2,1]

for i, item in enumerate(iterable):
    print(i, item)
>>> 0 5
	1 4
	2 3
	3 2
	4 1
    
for i, item in enumerate(iterable, 1): # 从1开始编号
    print(i, item)
>>> 1 5
	2 4
	3 3
	4 2
	5 1

按索引重新赋值

import numpy as np 

a = np.array([9,8,7,6])
index = [0,1,2,3]
value = [0,1,2,3]
a[index] = value
print(a)
>>> [0 1 2 3]
import numpy as np 

a = np.array([9,8,7,6])
index = [0,1,2,3,1] # 支持后来居上
value = [0,1,2,3,4]
a[index] = value
print(a)
>>> [0 4 2 3]

for..else语法

分享代码

1 代码片段 snippet

网站Carbon