醒途-觉醒之路

碎碎念

1.耳濡目染

关注大牛圈,一是接触到了,就更能明白自己和大牛之间的差距,认清自己哪些地方欠缺,哪些地方不足,就更能够补上短板.该学什么,怎么学,都有一个清晰的认识.再就是看得多了,更能补全三观,近朱者赤近墨者黑,耳濡目染的多了,思想与认识自然就更开阔了.眼界与认知自然就更深了.

2.忌固化宜变通

即使是固化的事情,也要主动思考是否可变通.不要把思维定住,不要认为教的都是不可以变的,不要既定思维,要活泛.

3.优秀与否不重要,学会自信

优秀与不优秀,不要妄自菲薄,不要自我否定,人外有人,天外有天,你的人外是有别人,但可能你也属于别人的人外人,如果你觉得自己现在很差,那么意思就是你这么久的努力就这样轻而易举的被自己否定了.当你觉得自己不优秀时,你还怎么让别人觉得你优秀呢?从一知半解开始到现在,你做的已经很好了,相比于从前.所以说,请照一照镜子,看一看自己,你,很优秀,并且会愈来愈优秀.加油.

4.费曼技巧

费曼技巧有四个简单的步骤:

  1. 选择一个概念

  2. 把它教给完全不懂的另外一个人

  3. 如果卡壳,回到原始材料

  4. 回顾后将语言条理化,简化。

检测知识最终的途径是你能有能力把它传播给另一个人。

那些声称清楚自己所想,但却不能清晰表达的人,其实通常不知道自己所想。— Mortimer Adler

python奇淫技巧

1.字典中value最大值对应的键

1
2
3
print(max(word_num, key=word_num.get))

print(max(zip(word_num.values(),word_num.keys())))

2.map

1
2
3
4
5
6
7
8
9
10
11
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。 

def add_one(x):
return x+1

for i in map(add_one,[1,2,3,4,5]):
print(i)

输出:2 3 4 5 6

由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

3.列表去重,顺序不变

1
2
3
l = list(set(list))

l.sort(key=list.index)

4.sorted()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
通常我们得到一个列表排序后产生的新列表很容易这么写:
new_ls = ls.sort()
但是sort方法并没有返回值,因此new_ls的值为NONE.

虽然ls.sort()之后ls已经排序成功,但我们经常并不希望原列表发生改变,这时我们就用到了sorted.
输入:ls=[3,1,2,4]
ls.sort()
输出:ls:[1,2,3,4]
Python的一个内置函数,使用方法与list.sort()大体一致,不同在于两个地方:
1.sorted(list)返回一个排序后的list,不改变原始的list.
sort()是对原始的L进行操作,调用后原始的L会改变,没有返回值。
2.sorted()适用于任何可迭代容器.
list.sort()仅支持list(sort()本身就是list的一个方法)
基于以上两点,sorted使用频率比list.sort()更高些,所以Python中更高级的排序技巧便是 sorted().
PS:如果想按照倒序排序的话,则只要将reverse置为true即可。

5.split默认切割

1
2
3
字符串的切割split()方法中如果没有参数,默认以空格分隔字符串。
输入: '2018 08 04'.split()
输出: ['2018','08','04']

6.num进制的数字字符串 –> 整型

1
int(str,num)	# num表示该字符串内的数字为num进制

7.format 格式化

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
32
33
type         【可选】格式化类型 •传入” 字符串类型 “的参数 •s,格式化字符串类型数据
•空白,未指定类型,则默认是None,同s

•传入“ 整数类型 ”的参数
•b,将10进制整数自动转换成2进制表示然后格式化
•c,将10进制整数自动转换为其对应的unicode字符
•d,十进制整数
•o,将10进制整数自动转换成8进制表示然后格式化;
•x,将10进制整数自动转换成16进制表示然后格式化(小写x)
•X,将10进制整数自动转换成16进制表示然后格式化(大写X)

•传入“ 浮点型或小数类型 ”的参数 •e, 转换为科学计数法(小写e)表示,然后格式化;
•E, 转换为科学计数法(大写E)表示,然后格式化;
•f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
•F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
•g, 自动在e和f中切换
•G, 自动在E和F中切换
•%,显示百分比(默认显示小数点后6位)

a = "i am {},age {}".format("seven",18,"alex")
b = "i am {},age {}, {}".format(*["seven", 18 ,"alex"])
c = "i am {0}, age {1}, really {0}".format("seven", 18)
d = "i am {0}, age{1}, really {0}".format(*["seven", 18])
e = "i am {name}, age {age}, really {name}".format(name="seven", age = 18)
f = "i am {name}, age {age}, rally {name}".format(**{"name":"seven", "age":18})
g = "i am {0[0]},age{0[1]}, really{0[2]}".format([1,2,3],[11,22,33])
h = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 888.1)
i = "i am {:s}, age {:d}".format(*["seven", 18])
j = "i am {name:s}, age {age:d}".format(name="seven",age=18)
k = "i am {name:s}, age {age:d}".format(**{"name":"seven","age":18})
l = "numers:{:b},{:o},{:d},{:x},{:X},{:%}".format(15,15,15,15,15,15.32445,2)
m = "numbers:{0:b},{0:o},{0:d},{0:x},{0:%}".format(15)
"numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

8.httplib

1
2
3
httplib模块改名为http.client
import http.client
httplib是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。

9.获取屏幕分辨率/鼠标位置

1
2
3
4
5
6
7
8
9
10
11
from win32api import GetSystemMetrics
from win32api import GetCursorPos

# 分辨率
x = GetSystemMetrics(0)
y = GetSystemMetrics(1)

# 鼠标位置
GetCursorPos()

python3 安装 pypiwin32后使用

10.pyinstaller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-c 参数		使用控制台,无界面(默认)

-w 参数 使用窗口,无控制台.如果程序里有使用到控制台(如print)的就不可以使用-w,
否则会报错 '''failed to excute script xxx'''
如果想要捕捉错误信息可以先用控制台捕捉,没有报错后再使用无控制台.

-D 参数 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。

-F 参数 打包成一个exe文件

-p 多文件打包时,以-p [其他.py] 的形式跟在主文件后
'''如:pyinstaller -w -F main.py -p view.py -p other.py'''

-i 参数 修改打包后的exe图标,图标应放在py同级目录下,需要是ico格式,只改后缀不可用.
'''如:pyinstaller -w -F -i zzz.ico main.py -p view.py -p other.py'''

11.程序退出的两种方式

1
2
3
4
5
1.import os	'os退出会直接退出,不抛出异常'
os._exit()

2.import sys 'sys退出会抛出异常,如果捕捉异常代码依旧执行'
sys.exit()

12.PYQT

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class GUI(QMainWindow):
def __init__(self):
super().__init__()
self.iniUI()

def iniUI(self):
self.move(510,347)
self.setWindowTitle('天命')
self.resize(362,250)
# 设置状态消息栏文本
self.statusBar().showMessage("Mai")
# 标签
self.label1 = QLabel('天命', )
# 给标签1设字体
self.label1.setFont(QFont("cour", 25, QFont.Bold))
# 按钮
self.pushButton1 = QPushButton('天灵灵地灵灵')
self.pushButton1.setFont(QFont("cour", 18))
self.pushButton1.clicked.connect(self.God_will)
# 创建一个网格布局对象
grid_layout = QGridLayout()
# 在网格中添加窗口部件
grid_layout.addWidget(self.label1, 0, 0) # 放置在0行0列
grid_layout.addWidget(self.pushButton1, 2, 0) # 2行0列
# 对齐方式
grid_layout.setAlignment(Qt.AlignTop)
grid_layout.setAlignment(self.label1, Qt.AlignCenter)
grid_layout.setAlignment(self.pushButton1, Qt.AlignCenter)
# 创建一个窗口对象
layout_widget = QWidget()
# 设置窗口的布局层
layout_widget.setLayout(grid_layout)
self.setCentralWidget(layout_widget)
# 无边框
self.setWindowFlags(Qt.FramelessWindowHint)

# esc退出
def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape:
self.close()

# 无边框时候拖动窗口
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.m_flag = True
self.m_Position = event.globalPos() - self.pos() # 获取鼠标相对窗口的位置
event.accept()
self.setCursor(QCursor(Qt.OpenHandCursor)) # 更改鼠标图标
def mouseMoveEvent(self, QMouseEvent):
if Qt.LeftButton and self.m_flag:
self.move(QMouseEvent.globalPos() - self.m_Position) # 更改窗口位置
QMouseEvent.accept()
def mouseReleaseEvent(self, QMouseEvent):
self.m_flag = False
self.setCursor(QCursor(Qt.ArrowCursor))
1
2
3
4
5
6
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = GUI()
gui.setWindowOpacity(0.8)
gui.show()
sys.exit(app.exec_())

13.python requests接收chunked编码问题 (https://blog.csdn.net/wangzuxi/article/details/40377467)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
IncompleteRead(4360 bytes read)', IncompleteRead(4360 bytes read))

原因:接收第一个chunked正常,第二次时line为空,导致int转换时出异常

解决方案:
方案1、修改httplib.py第581行为:
chunk_left = int(line, 16) if line else 0

方案2、自己的程序忽略这个异常;

方案3、import http.client
try:
response = request.urlopen(req)
except http.client.IncompleteRead as e:
response = e.partial
partial 会将error接收到的原文返回

方案4、用pycurl来代替requests,但必须将HTTP协议版本设置为1.0,否则与方案2无差别,因为
Transfer-Encoding:chunked , Connection:keep-alive 都是HTTP1.1的新特性,如果将
自己的HTTP协议版本设置为1.0,那么服务端将不会再返回chunked,而是以TCP分段的方式
直接返回整个文件内容,最后重组成一个完整的HTTP包。

14.mysql插入数据时,id字段不连续,数据也不连续

1
2
原因:   id是唯一索引,冲突后id自增1,所以自增字段id不连续是正常的,中间的
空号很多且数据不连续,说明包含该插入语句的事务不成功的比例很多。

15.anaconda使用

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
查看所有的 packages:

conda list


如果你记不清 package 的具体名称,也可以进行模糊查询:

conda search search_term


如何管理Python环境?
默认的环境是 root,你也可以创建一个新环境:

conda create -n env_name list of packages

其中 -n 代表 name,env_name 是需要创建的环境名称,list of packages 则是列出在新环境中需要安装的工具包。

例如,当我安装了 Python3 版本的 Anaconda 后,默认的 root 环境自然是 Python3,但是我还需要创建一个 Python 2 的环境来运行旧版本的 Python 代码,最好还安装了 pandas 包,于是我们运行以下命令来创建:

conda create -n py2 python=2.7 pandas

细心的你一定会发现,py2 环境中不仅安装了 pandas,还安装了 numpy 等一系列 packages,这就是使用 conda 的方便之处,它会自动为你安装相应的依赖包,而不需要你一个个手动安装。

进入名为 env_name 的环境:

source activate env_name

退出当前环境:

source deactivate

另外注意,在 Windows 系统中,使用 activate env_name 和 deactivate 来进入和退出某个环境。

删除名为 env_name 的环境:

conda env remove -n env_name

显示所有的环境:

conda env list

当分享代码的时候,同时也需要将运行环境分享给大家,执行如下命令可以将当前环境下的 package 信息存入名为 environment 的 YAML 文件中。

conda env export > environment.yaml

同样,当执行他人的代码时,也需要配置相应的环境。这时你可以用对方分享的 YAML 文件来创建一摸一样的运行环境。

conda env create -f environment.yaml

至此,你已跨入 Anaconda 的大门,后续就可以徜徉在 Python 的海洋中了。

16.git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法

1
2
3
4
在服务器添加完公钥后报错
执行下面两句
eval "$(ssh-agent -s)"
ssh-add
本文结束 感谢您的阅读
坚持原创技术分享,您的支持将鼓励我继续创作!