更新了部分文档补充了Linux部分的内容
|
@ -219,7 +219,7 @@
|
|||
# 第二天A第一个醒来 他将鱼分为5份 扔掉多余的1条 拿走自己的一份
|
||||
# B第二个醒来 也将鱼分为5份 扔掉多余的1条 拿走自己的一份
|
||||
# 然后C、D、E依次醒来也按同样的方式分鱼 问他们至少捕了多少条鱼
|
||||
fish = 1
|
||||
fish = 6
|
||||
while True:
|
||||
total = fish
|
||||
enough = True
|
||||
|
@ -232,7 +232,7 @@
|
|||
if enough:
|
||||
print(fish)
|
||||
break
|
||||
fish += 1
|
||||
fish += 5
|
||||
```
|
||||
|
||||
贪婪法例子:假设小偷有一个背包,最多能装20公斤赃物,他闯入一户人家,发现如下表所示的物品。很显然,他不能把所有物品都装进背包,所以必须确定拿走哪些物品,留下哪些物品。
|
||||
|
@ -769,6 +769,8 @@
|
|||
main()
|
||||
```
|
||||
|
||||
> 说明:上面的代码中使用了Emoji字符来表示扑克牌的四种花色,在某些不支持Emoji字符的系统上可能无法显示。
|
||||
|
||||
- 对象的复制(深复制/深拷贝/深度克隆和浅复制/浅拷贝/影子克隆)
|
||||
|
||||
- 垃圾回收、循环引用和弱引用
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
"""
|
||||
多进程和进程池的使用
|
||||
多线程因为GIL的存在不能够发挥CPU的多核特性
|
||||
对于计算密集型任务应该考虑使用多进程
|
||||
time python3 example22.py
|
||||
real 0m11.512s
|
||||
user 0m39.319s
|
||||
sys 0m0.169s
|
||||
"""
|
||||
import concurrent.futures
|
||||
import math
|
||||
|
||||
PRIMES = [
|
||||
1116281,
|
||||
1297337,
|
||||
104395303,
|
||||
472882027,
|
||||
533000389,
|
||||
817504243,
|
||||
982451653,
|
||||
112272535095293,
|
||||
112582705942171,
|
||||
112272535095293,
|
||||
115280095190773,
|
||||
115797848077099,
|
||||
1099726899285419
|
||||
] * 5
|
||||
|
||||
|
||||
def is_prime(n):
|
||||
"""判断素数"""
|
||||
if n % 2 == 0:
|
||||
return False
|
||||
|
||||
sqrt_n = int(math.floor(math.sqrt(n)))
|
||||
for i in range(3, sqrt_n + 1, 2):
|
||||
if n % i == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
with concurrent.futures.ProcessPoolExecutor() as executor:
|
||||
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
|
||||
print('%d is prime: %s' % (number, prime))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Before Width: | Height: | Size: 140 KiB |
After Width: | Height: | Size: 282 KiB |
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 224 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 25 KiB |
|
@ -69,61 +69,53 @@
|
|||
|
||||
- 启动MySQL服务。
|
||||
|
||||
先修改MySQL的配置文件(`/etc/my.cnf`)添加一行`skip-grant-tables`,可以设置不进行身份验证即可连接MySQL服务器,然后就可以以超级管理员(root)身份登录。
|
||||
|
||||
```Shell
|
||||
vim /etc/my.cnf
|
||||
```
|
||||
|
||||
```INI
|
||||
[mysqld]
|
||||
skip-grant-tables
|
||||
|
||||
datadir=/var/lib/mysql
|
||||
socket=/var/lib/mysql/mysql.sock
|
||||
|
||||
symbolic-links=0
|
||||
|
||||
log-error=/var/log/mysqld.log
|
||||
pid-file=/var/run/mysqld/mysqld.pid
|
||||
```
|
||||
|
||||
接下来可以使用下面的命令来启动MySQL。
|
||||
可以使用下面的命令来启动MySQL。
|
||||
|
||||
```Shell
|
||||
service mysqld start
|
||||
```
|
||||
|
||||
在CentOS 7中建议使用下面的命令来启动MySQL。
|
||||
在CentOS 7中,更推荐使用下面的命令来启动MySQL。
|
||||
|
||||
```Shell
|
||||
systemctl start mysqld
|
||||
```
|
||||
|
||||
启动MySQL成功后,可以通过下面的命令来检查网络端口使用情况,MySQL默认使用3306端口。
|
||||
|
||||
```Shell
|
||||
netstat -nap | grep mysql
|
||||
```
|
||||
|
||||
- 使用MySQL客户端工具连接服务器。
|
||||
|
||||
命令行工具:
|
||||
|
||||
```Shell
|
||||
mysql -u root
|
||||
```
|
||||
|
||||
修改超级管理员(root)的访问口令为i_LOVE_macos_123。
|
||||
|
||||
```SQL
|
||||
use mysql;
|
||||
update user set authentication_string=password('i_LOVE_macos_123') where user='root';
|
||||
flush privileges;
|
||||
```
|
||||
|
||||
将MySQL配置文件中的`skip-grant-tables`去掉,然后重启服务器,重新登录。这一次需要提供用户名和口令才能连接MySQL服务器。
|
||||
|
||||
```Shell
|
||||
systemctl restart mysqld
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
也可以选择图形化的客户端工具来连接MySQL服务器,可以选择下列工具之一:
|
||||
> 说明:启动客户端时,`-u`参数用来指定用户名,MySQL默认的超级管理账号为`root`;`-p`表示要输入密码(用户口令);如果连接的是其他主机而非本机,可以用`-h`来指定连接主机的主机名或IP地址。
|
||||
|
||||
如果是首次安装MySQL,可以使用下面的命令来找到默认的初始密码。
|
||||
|
||||
```Shell
|
||||
cat /var/log/mysqld.log | grep password
|
||||
```
|
||||
|
||||
上面的命令会查看MySQL的日志带有password的行,在显示的结果中`root@localhost:`后面的部分就是默认设置的初始密码。
|
||||
|
||||
修改超级管理员(root)的访问口令为`123456`。
|
||||
|
||||
```SQL
|
||||
set global validate_password_policy=0;
|
||||
set global validate_password_length=6;
|
||||
alter user 'root'@'localhost' identified by '123456';
|
||||
```
|
||||
|
||||
> 说明:MySQL默认不允许使用弱口令作为用户口令,所以我们通过上面的前两条命令修改了验证用户口令的策略和口令的长度。事实上我们不应该使用弱口令,因为存在用户口令被暴力破解的风险。近年来,攻击数据库窃取数据和劫持数据库勒索比特币的事件屡见不鲜,要避免这些潜在的风险,最为重要的一点是不要让数据库服务器暴露在公网上(最好的做法是将数据库置于内网,至少要做到不向公网开放数据库服务器的访问端口),另外要保管好`root`账号的口令,应用系统需要访问数据库时,通常不使用`root`账号进行访问,而是创建其他拥有适当权限的账号来访问。
|
||||
|
||||
再次使用客户端工具连接MySQL服务器时,就可以使用新设置的口令了。在实际开发中,为了方便用户操作,可以选择图形化的客户端工具来连接MySQL服务器,包括:
|
||||
|
||||
- MySQL Workbench(官方提供的工具)
|
||||
- Navicat for MySQL(界面简单优雅,功能直观强大)
|
||||
|
|
18
Python惯例.md
|
@ -5,7 +5,6 @@
|
|||
1. 让代码既可以被导入又可以被执行。
|
||||
|
||||
```Python
|
||||
|
||||
if __name__ == '__main__':
|
||||
```
|
||||
|
||||
|
@ -13,7 +12,6 @@
|
|||
2. 用下面的方式判断逻辑“真”或“假”。
|
||||
|
||||
```Python
|
||||
|
||||
if x:
|
||||
if not x:
|
||||
```
|
||||
|
@ -21,7 +19,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
name = 'jackfrued'
|
||||
fruits = ['apple', 'orange', 'grape']
|
||||
owners = {'1001': '骆昊', '1002': '王大锤'}
|
||||
|
@ -32,7 +29,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
name = 'jackfrued'
|
||||
fruits = ['apple', 'orange', 'grape']
|
||||
owners = {'1001': '骆昊', '1002': '王大锤'}
|
||||
|
@ -43,7 +39,6 @@
|
|||
3. 善于使用in运算符。
|
||||
|
||||
```Python
|
||||
|
||||
if x in items: # 包含
|
||||
for x in items: # 迭代
|
||||
```
|
||||
|
@ -51,7 +46,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
name = 'Hao LUO'
|
||||
if 'L' in name:
|
||||
print('The name has an L in it.')
|
||||
|
@ -60,7 +54,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
name = 'Hao LUO'
|
||||
if name.find('L') != -1:
|
||||
print('This name has an L in it!')
|
||||
|
@ -69,7 +62,6 @@
|
|||
4. 不使用临时变量交换两个值。
|
||||
|
||||
```Python
|
||||
|
||||
a, b = b, a
|
||||
```
|
||||
|
||||
|
@ -78,7 +70,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
|
||||
name = ''.join(chars)
|
||||
print(name) # jackfrued
|
||||
|
@ -87,7 +78,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
|
||||
name = ''
|
||||
for char in chars:
|
||||
|
@ -104,7 +94,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
d = {'x': '5'}
|
||||
try:
|
||||
value = int(d['x'])
|
||||
|
@ -116,7 +105,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
d = {'x': '5'}
|
||||
if 'x' in d and isinstance(d['x'], str) \
|
||||
and d['x'].isdigit():
|
||||
|
@ -131,7 +119,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
fruits = ['orange', 'grape', 'pitaya', 'blueberry']
|
||||
for index, fruit in enumerate(fruits):
|
||||
print(index, ':', fruit)
|
||||
|
@ -140,7 +127,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
fruits = ['orange', 'grape', 'pitaya', 'blueberry']
|
||||
index = 0
|
||||
for fruit in fruits:
|
||||
|
@ -153,7 +139,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
data = [7, 20, 3, 15, 11]
|
||||
result = [num * 3 for num in data if num > 10]
|
||||
print(result) # [60, 45, 33]
|
||||
|
@ -162,7 +147,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
data = [7, 20, 3, 15, 11]
|
||||
result = []
|
||||
for i in data:
|
||||
|
@ -176,7 +160,6 @@
|
|||
**好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
keys = ['1001', '1002', '1003']
|
||||
values = ['骆昊', '王大锤', '白元芳']
|
||||
d = dict(zip(keys, values))
|
||||
|
@ -186,7 +169,6 @@
|
|||
**不好**的代码:
|
||||
|
||||
```Python
|
||||
|
||||
keys = ['1001', '1002', '1003']
|
||||
values = ['骆昊', '王大锤', '白元芳']
|
||||
d = {}
|
||||
|
|