框架课分析
- Django前后端分离架构,好处多多。最大的好处,一个后端对应多个前端。
- Django统领多个服务。
- 同一个后端代码支持多种不同的接口。如:浏览器、AC APP、IOS等。
- server端存储数据的层: 云盘——>mysql——>redis(从左往右内存依次减小)
- client端存储数据的层:Web storage、js内存(js数组)等。
- 每一个数据都要考虑好存储的位置。
好习惯: 写工程之前先创建一个文件夹。vim main.py
#! /usr/bin/env python3 #指定python3解释器位置。意味着你能够./运行了。
#-*- coding: utf-8 -*- #声明文件的编码。因为有些平台没有默认编码,所以最好写上。
print("Hello World") #第一条注释
#! /usr/bin/env python3
指定python解释器位置,类同于#! /bin/bash
指明bash为脚本解释器并且/bin/bash就是解释器位置。- 不要在解释器后面添加注释。否则使用
./main.py
无法找到解释器位置会报错。 - 运行文件之前需要添加可执行权限。
chmod +x main.py
- 运行代码
python3 main.py
或者./main.py
。
Python “可以扩展”
- 会开发 C 语言程序,就能快速上手为解释器增加新的内置函数或模块,不论是让核心程序以最高速度运行,还是把 Python 程序链接到只提供预编译程序的库(比如,硬件图形库)。
历史遗留问题:
python
执行代码默认的是python2
,用python3
一定要加3。python2
已经不维护了,其中编码问题一直是一个巨大的问题。现在维护的都是python3
。
python
为什么称为解释性语言?
- 因为它可以一句话一句话执行。
ipython3交互模式的python3。
python | C++ |
---|---|
python整除:向下取整 | C++整除:向零取整。 |
python右移:向下取整 | C++右移:向下取整。 |
python交换两个数:a,b = b,a |
C++交换两个数: t = a, a = b, b = t; |
python三目运算符: y = "zero" if x == 0 else "not zero" |
C++三目运算符: 表达式 ? 表达式 : 表达式 ; \ |
直接赋值、浅拷贝、深拷贝
- python使用缩进区分代码块。
print
默认输出回车- python传递都是值传递。当然引用变量传地址。与java一样只有值传递。
- python中真假分别为
True
和False
- python中逻辑运算符
a and b
、a or b
、not a
分别为与、或、非。
for
循环可以遍历:
- 列表
for word in words:
print(word)
- 字典
items()
可以遍历副本实现以列表的方式遍历字典
copy()
实现边遍历边修改。原理:遍历复制的字典,修改原来的字典,就不会发生冲突了。
for key, value in dict.items():
print(key, value)
for key, value in dict.copy().items():
del dict[key]
# 如果没有copy浅拷贝,就会报dictionary changed size during iteration,遍历字典时,不能改变字典大小。
range()函数
range(a)
返回从零开始的区间[0, a)。range(a, b)
返回左闭右开的区间[a, b)。range(a, b, q)
返回左闭右开的区间[a, b),公差为q。
break、continue关键字
- break、continue用法与C一样,特殊情况:循环语句与else连用时需要注意一下。
- else可以与循环组合用来代替flag。
如果一个循环被break了,就不会执行else中的语句。
反之,就会执行else中的语句。
pass
使用场景
比如:
C++
定义一个函数并且不用实现它就能正常运行。- python定义一个函数但不实现它,回车就会一直存在缩进。就算你删除缩进,执行也会报错。
python
使用缩进区分代码块。当你不知道在循环和函数中写啥时,就使用pass
表示我们以后来实现它。
函数定义
def 函数(参数):
pass
- 函数不写返回值默认返回
None
。print(f())
这样你可以知道为啥了。 - python可以定义重名函数,下一个会把上一个函数覆盖掉。
- 函数可以定义默认参数,设置默认参数必须是连续。
def 函数(key=value,...)
- 我们调用函数的参数可以用
参数名=值
的方式打乱顺序进行赋值。
解包
- 解包列表
*a
- 解包字典
**a
,一般放在参数名=值
的传参上。 - 解包传参,实参和形参必须一一对应,当然
key=value
传参不用。
Lambda 表达式
数据结构
列表list
a = list() #定义一个空列表
a = list(map(函数,input().split())) #split返回列表,也就是list()中可以放置列表
a = [1, 2, 3] #定义列表
a.append(4) #添加元素
len(a) #输出列表中的元素个数
x = [i * i for i in range(10)] # 列表推导式
切片
切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列。
序列实现切片操作的语法格式如下:
sname[start : end : step]
其中,各个参数的含义分别是:
sname
:表示序列的名称;start
:表示切片的开始索引位置(包括该位置),此参数也可以不指定,会默认为 0,也就是从序列的开头进行切片;end
:表示切片的结束索引位置(不包括该位置),如果不指定,则默认为序列的长度;step
:表示在切片过程中,隔几个存储位置(包含当前位置)取一次元素,也就是说,如果 step 的值大于 1,则在进行切片去序列元素时,会“跳跃式”的取元素。如果省略设置 step 的值,则最后一个冒号就可以省略。
str="新年快乐"
#取索引区间为[0,2]之间(不包括索引2处的字符)的字符串
print(str[:2])
#隔 1 个字符取一个字符,区间是整个字符串
print(str[::2])
#取整个字符串,此时 [] 中只需一个冒号即可
print(str[:])
元组
与列表的区别:就是元组对象不能改。即不能加元素和修改元素。
元组定义可以省略小括号。
元组可以赋给几个变量,也可以反过来用变量赋值元组。即元组的解包。
a = (1, 2, 3)
a = 1, 2, 3, 4
x, y, r, z = a #元组的解包
#元组和列表仅仅只是值不能够修改,所以列表也可以这样给变量赋值
b = [1, 2, 3]
x, y, z = b
元组常用操作
s = "111 321"
s.split(" ") #split()函数可以以某个字符将字符串分割返回一个列表。
a, b = "123 321".split(" ") #利用列表的解包赋值。
集合
a = set() #定义一个集合
a = set(列表或者集合或者元组)
a = {1, 2, 3} #定义一个集合
a.add(1) #添加元素
a.add(1) #相同元素只保留一份。
a = {}
定义既可以表示集合,也可以表示字典。
如何区分?根据存储的值进行区分,存储key-value对表示字典,存值表示集合。
字典
key-value对
——用,
隔开。
dict = {"a":1, "b":2, "c":3} #定义字典
- type()变量名类型
- len()可以对你所有想的函数求长度。
- sorted()进行排序,返回的是排序好的数,需要通过变量进行接收。
- 反转列表a[::-1]
- a.reverse()反转列表、a.sort()正向排序
模块
- 写项目时,我们不可能将所有代码写在一个文件中,我们可以将项目分成多个模块。
- 开发项目时,一般使用树形开发。
- 我们可以引进模块文件,模块中的函数。
- python帮我们实现了非常多的模块。
比如:
#生成随机数
from random import randint #import一个函数
randint(1, 10)
一般写项目时,都会先from import
一堆东西。
格式化字符串
str = "%04d %.2lf %s" % (2, 3.4, "abc")
读写文件
- 写操作
fout = open('workfile', 'w')
fout.write("111\n") #写入的应该为字符串
for i in range(10):
fout.write(str(i) + "\n")
fout.close() #关闭文件目的:把缓存写进去。
在处理文件对象时,最好使用 with
关键字。优点是,子句体结束后,文件会正确关闭,即便触发异常也可以。
with open('workfile', 'w') as f:
read_data = f.read()
- 读操作:
with open("workfile", 'r') as f:
print(f.read())
with open("workfile", 'r') as f:
print(f.readlines())
with open("workfile", 'r') as f:
for line in f:
print(line, end=" ")
异常处理:
def divide(x, y):
try:
res = x / y
except Exception as e:
print(str(e)) #发生异常执行这句话
else:
print("result is", res) #不发生异常执行这句话
finally:
一般用来关闭数据库
divide(1, 0)
类
class MyClass:
"""A simple example class"""
i = 12345 #定义一个静态变量,
def f(self):
return 'hello world'
a = MyClass()
下方相当于定义了python的构造函数:
class Complex:
def __init__(self, realpart, imagpart):
#属性赋值,self相当于java的this
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
x.r, x.i
派生类定义的语法如下所示:
class DerivedClassName(BaseClassName):
#继承
# super().表示可以调用父类的方法和属性。