更新了部分文档补充了Linux部分的内容

pull/143/merge
jackfrued 2019-06-02 18:54:44 +08:00
parent 4082e1a311
commit b74e0deaf1
14 changed files with 616 additions and 184 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -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字符的系统上可能无法显示。
- 对象的复制(深复制/深拷贝/深度克隆和浅复制/浅拷贝/影子克隆)
- 垃圾回收、循环引用和弱引用

View File

@ -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()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

View File

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 176 KiB

View File

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because it is too large Load Diff

View File

@ -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界面简单优雅功能直观强大

View File

@ -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 = {}