Python

一、基础

1
2
3
4
5
6
7
# 变量,直接赋值不用声明
message = "this is message"

# 类型转换
# str -> int
ageStr = '12'
age = int(ageStr)

字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
name = "ifangcy"

# 常用方法,不会修改字符串本身而是返回一个新字符串
name.title()
name.upper()
name.lower()
name.rstrip()
name.lstrip()
name.strip()

# Python 中拼接字符串时不会自动把其他类型转成字符串,需要手动转
age = 30
message = "I'm " + str(age)

数字

1
3**2  # 3的2次方

列表 list

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
bicycles = ['trek', 'cannondale', 'redline', 'specialized']

# 索引使用负数从尾部取元素,注意负值从 -1 开始
bicycles[-1]

# 判断列表中是否有指定值
if 'trek' in bicycles:
print('in')
# 判断列表中是否没有指定值
if 'trek' not in bicycles:
print('not in')

# 判断列表是否为空
if bicycles:
print("非空")
else:
print('空')

# 添加
bicycles.append('ducati')
bicycles.insert(0, 'ducati')

# 删除
del bicycles[0]
# 删除最后一个元素并拿到该元素以便后续使用
pop_value = bicycles.pop()
# pop 也可以删除指定位置元素
pop_value2 = bicycles.pop(0)
# 删除指定值的元素,注意这个方法只能删除第一个匹配的元素,如果列表中有多个该值的元素只会删除第一个
bicycles.remove('ducati')
while 'ducati' in bicycles:
bicycles.remove('ducati')

# 排序,永久修改列表自身
# 按字母顺序正序排序
bicycles.sort()
# 逆序
bicycles.sort(reverse=True)

# 排序,临时排序也就是返回一个新排序后的列表
sorted(bicycles)
sorted(bicycles, reverse=True)

# 逆序,永久修改列表
bicycles.reverse()
reversed(bicycles)

# 列表长度
len(bicycles)

# 遍历列表
for item in bicycles:
print(item)

# range 生成列表
# [1, 2, 3, 4, 5]
numbers = list(range(1, 6))
numbers = list(range(30))
# 使用步长,[1, 3, 5]
list(range(1, 6, 2))

# 数字列表有几个特殊的函数
min(numbers)
max(numbers)
sum(numbers)

# 列表解析:使用一行代码包含 for 循环列表和生成新元素的操作
squares = [value**2 for value in range(1, 11)]

# 切片,从指定的第一个位置到第二个位置前一个
players = ['charles', 'mertina', 'michael', 'florence', 'eli']
players[1:4]
players[:4] # 从第一个元素到第三个元素
players[1:] # 从第二个元素到最后一个元素
players[:] # 所有元素
players[-3:] # 最后三个元素

# 注意,Python 中的切片和 Go 中的不同,Python 中的切片是真正的深拷贝,切片和原来的列表不共享内存

元组 tuple

1
2
# 元组和列表的区别就是元组的值不能修改
dimensions = (200, 500)

字典

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
alien = { "color": "green", "points": 5 }

# 使用
alien['color']

# 添加
alien['x_position'] = 10
alien['y_position'] = 20

# 删除
del alien['color']

# 遍历
# 遍历索引、值
for key, value in alien.items():
print("key: " + key + ", value: " + value)
# 遍历索引
for key in alien.keys():
print("key: " + key)
# 遍历值
for value in alien.values():
print("value: " + value)

# 使用 sorted 排序
for key in sorted(alien.keys()):
print("key: " + key)

# 使用 set 去除重复项
for value in set(alien.values):
print("value: " + value)

条件

1
2
3
age = 30
age > 30 and age < 50
age > 20 or age < 10

函数

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
# 定义
def describe_pet(animal_type, pet_name):
print("animal_type: " + animal_type + ", pet_name: " + pet_name)

# 参数默认值,有默认值的参数是可选参数,Python 中的默认参数没有要求一定放在最后
def describe_pet(animal_type, pet_name="harry"):
pass

# 数量不定参数,可接受任意个数参数,函数内部使用元组接收,必须作为最后一个参数
def make_pizza(size, *toppings):
pass
make_pizza(12, 'green peppers', 'extra cheese')

# 数量不定字典参数,可接受任意个键值对参数,函数内部使用字典接收,必须作为最后一个参数
def make_pizza(size, **toppings):
pass
make_pizza(12, location="shanghai", field="physics")

# 使用
describe_pet("hamster", "harry")
describe_pet(animal_type="hamster", pet_name="harry")

# 函数中修改列表参数会影响实参值
unprinted_designs = ["iphone case", "robot pendant"]
completed_models = []

def change(unprinted_designs, completed_models):
while unprinted_designs:
value = unprinted_designs.pop()
completed_models.append(value)

change(unprinted_designs, completed_models)

# 如果想让函数中修改列表不影响外层实参,可以传递列表切片
change(unprinted_designs[:], completed_models)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 定义类 
class Car():
# __init__ 是一个特殊方法,创建实例会自动调用,相当于其他语言中的构造函数,第一个参数必须是 self
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
# Python 方法中的 self 都是手动传进去的
def get_descriptive_name(self):
pass

# 继承
# 子类在括号中指定父类
class ElectricCar(Car):
# 子类中的 __init__ 第一句必须调用父类 __init__ 初始化
def __init__(self, make, model, year):
super().__init__(self, make, model, year)

模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Python 中不需要显示指定,文件名即是模块名
# 文件夹中的 py 文件,完整路径作为模块名,比如 /a/b/demo.py 模块名为 a.b.demo

# 导入模块
import pizza
# 使用别名导入模块
import pizza as newPizza

# 导入模块中指定方法
from pizza import func1, func2
# 使用别名导入方法
from pizza import func1 as newFunc

# 导入模块中的指定类
from pizza import Class1, Class2

# 导入模块中所有方法和类
from pizza import *

文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 读文件,注意这里的文件路径在 windows 中应该使用 \
with open('path/demo.txt') as file_object:
# 一次读取所有内容
contents = file_object.read()
print(contents)
# 逐行读取
for line in file_object:
print(line.rstrip())


# 写文件,写入文件是需要指定读取模式:r 只读(默认),w 写入,a 追加,r+ 读写
with open('path/demo.txt', 'w') as file_object:
file_object.write("This is content")

异常

1
2
3
4
5
6
7
8
9
try:
# 可能出错的代码
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
# 捕获处理异常
print('You cant divide by 0!')
else:
# 只有 try 中执行成功之后才会执行的内容放到这里
print(answer)

存储数据

1
2
3
4
5
6
7
8
9
10
players = ['charles', 'mertina', 'michael', 'florence', 'eli']

# 保存数据到文件中
with open('demo.txt', 'w') as file_object:
json.dump(players, file_object)

# 从文件中读取数据
with open('demo.txt') as file_object:
newPlayers = json.load(file_object)
print(newPlayers)

二、Django

在环境变量中配置参数

为不同环境使用不同 settings.py

写测试,测试覆盖度

三、PyCharm 远程开发

1、SSH 连接服务器

新增 SFTP 方式服务器:

3 处的 Root Path 是服务器上的项目上一级目录,记住是上一级目录。

这时候点击 Test Connection 如果提示连接失败,查看服务器是否开启了 ssh 服务:

1
2
3
4
5
6
# ubuntu
# 查看 ssh 状态
sudo service ssh status
# 启动 ssh
sudo service ssh start
sudo service ssh restart

如果确定 ssh 启动还是连接失败,提示:

1
sshd: no hostkeys available — exiting

修改配置

1
2
3
4
5
6
# 1
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

# 修改 /etc/ssh/sshd_config
PasswordAuthentication yes

1 处的 Local Path 是代码拉取到本机时存放的项目目录。

2 处的 Deployment Path 是服务器上的项目目录名称,这个地址会和上一步的 Root Path 合并一起用来查找服务器上的项目目录 ${Root Path}/${Deployment Path}

选择刚刚新建的服务器。

1 处 Host 即服务器 IP 地址

2 处 Run Browser 即服务器地址加端口

3 处 Python Interpreter 即上一步设置的 Python Interpreter

4 处 Working Directory 即本机项目目录