vim快捷键

一 快速移动到行尾或行首

  1. 简单粗暴行
    home键—-行首, end键—–行尾

  2. 组合键

    shift+6 也是 快捷键”^”——行道
    shift+4 也是 快捷键”$”——行尾

  3. 直接到编辑状态

    I—–跳到行首,并进入编辑状态
    A—–跳到行尾,并进入编辑状态

    二 移动光标

    h: 左移
    j: 下移
    k: 上移
    l: 右移
    M: 光标移动到中间行
    L: 光标移动到屏幕最后一行行首
    G: 移动到指定行,行号 -G
    w: 向后一次移动一个字
    b: 向前一次移动一个字
    {: 按段移动,上移
    }: 按段移动,下移
    Ctr-d: 向下翻半屏
    Ctr-u: 向上翻半屏
    Ctr-f: 向下翻一屏
    Ctr-b: 向上翻一屏
    gg: 光标移动文件开头
    G: 光标移动到文件末尾

    三 删除命令

    x: 删除光标后一个字符,相当于 Del
    X: 删除光标前一个字符,相当于 Backspace
    dd: 删除光标所在行,n dd 删除指定的行数 D: 删除光标后本行所有内容,包含光标所在字符
    d0: 删除光标前本行所有内容,不包含光标所在字符
    dw: 删除光标开始位置的字,包含光标所在字符

    四 撤销命令:

    u: 一步一步撤销,也称为后悔键
    Ctr-r: 反撤销

    五 查找命令:>

    /: str查找
    n: 下一个
    N:上一个

    六 编辑键

    yy: 复制一行 nyy: 复制n行
    dd: 删除一行 12dd: 删除12行
    p: 黏贴 3p: 黏贴三次

    七 替换字符串

    例如: 把文档中所有的 ports.ubuntu.org替换为阿里源 mirrors.aliyun.com
    :%s/ports.ubuntu.org/mirrors.aliyun.com/g

streamlit学习笔记六-----streamlit新版支持原生多页面一

streamlit以前只支持单页面,要想多页面,也不是不行,但是需要点技巧。但是新版streamlit己经原生支持多页面了,方法有三种:

1. pages目录加文件的方法,这个方法最简单,本文会介绍
2. st.Page 与 st.navigation方法结合,这个方法复杂但灵活,首先推荐
3. 小组件的方法,简单灵活但混乱,适合临时多页面

本文先介绍最简的方法,pages目录法如下:

1
2
$ pip install streamlit --upgrade #先升级到最新版 streamlit
$ mkidr pages #建立子页面目录

假设主页面的文档main_page.py如下:

1
2
3
4
import streamlit as st

st.markdown("# Main page 🎈")
st.sidebar.markdown("# Main page 🎈")

_

在 pages目录下,建立pages2.py pages3.py ….,示便代码如下

1
2
3
4
import streamlit as st

st.markdown("# Page 2 ❄️")
st.sidebar.markdown("# Page 2 ❄️")
1
2
3
4
import streamlit as st

st.markdown("# Page 3 🎉")
st.sidebar.markdown("# Page 3 🎉")

只要执行 strreamlit run main_page.py,则自动在左侧栏出现page2与page3的链接,注意排序竟然是按文件名来排序的。_

flask全局变量三,视图间的参数传递

在”flask全局变量一“,时,我讲了采用session[“变量名”],来定义全局变量,实现在视图间传递变量。现在用用另一名方法,用上下文的方法,采用g变量,来定义全局变量。比方法一要简单
有几个上下文装饰器
装饰器名 方式
@app.before_request 函数会在请求处理之前被调用
@app.after_request 函数会在请求处理完成后才被调用
@app.teardown_request 函数会在请求处理完成后才被调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask
from flask import g, request

app=Flask(__name__)

@app.before_request
def span_num_init():
g.start_num = 0 # 定义g变量
g.span_mum = 5 # 定义g变量

@app.route("/fun1")
def fun1():
g.start_num=9
g.span_num=16

@app.route("/fun2")
def fun2():
print("start_num=",g.start_num) # 此处start_num又变为0
print("span_num=",g.span_num]) # 此处start_num又变为5

flask全局变量二,自定义上下文参数

如果我要在模板中一个多选菜单的项目是个变量。那么要每个视图函数读一次变量,再发送到模版中去。比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_option_item():
item = ["项目1""项目2""项目3""项目4""项目5""项目6""项目7",]
return item
#视图1
@app.route(/index1)
def index1():
item=get_option_item()
return render_template("index1.html", item=itme)
....
#视图n
@app.route(/index_n)
def index_n():
item=get_option_item()
return render_template("indexn.html", item=itme)

在模板中

1
2
3
4
5
<select>
{% for select_i in item %}
<option> select_i </option>
{% endfor %}
</select>
每个视图要读一次很烦,那么采用上下文变量的方式就很好的解决了这个问题。修改一下python代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# current_app对象是一个定义在应用上下文中的代理
from flask import current_app
app=Flask(__name__)

# 函数用@app.context_processor装饰器修饰,它是一个上下文处理器,它的作用是在模板被渲染前运行其所修饰的函数,并将函数返回的字典导入到模板上下文环境中,与模板上下文合并。
@app.context_processor
def get_option_item():
item = ["项目1""项目2""项目3""项目4""项目5""项目6""项目7",]
return dict(item=item) #注意是字典
# 视图函数不用再调用了
#视图n
@app.route(/index_n)
def index_n():
# item=get_option_item()
return render_template("indexn.html")
模板不用改变,直接就可用了。

flask 的form学习之三,一个小form

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MockCreate(Form):
user_email = StringField("email address",[validators.Email()])
api = StringField("api",[Required()])
submit = SubmitField("Submit")
code = IntegerField("code example: 200",[Required()])
alias = StringField("alias for api")
data = TextAreaField("json format",[Required()])


@app.route("/mockservice",methods=['GET','POST'])
def MockController():
form = MockCreate()
code = form['code']
api = form['api']
return render_template("testf.html",api=api,data=code)

flask 的form学习之二,Flask-WTF

使用 Flask-WTF的好处是直接在python中定义表单中的字段,比较直观

1
$ pip install flask-WTF

一. WTForms支持的全部HTML标准字段

字段对象 说明 相当于html的语句
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码字段
HiddenField 隐藏文件字段
DateField 文本字段,值为datetime.date文本格式
DateTimeField 文本字段,值为datetime.datetime文本格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal数
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True或False <input type=”radio”
RadioField 一组单选框
SelectField 下接列表
SelecMultipleField 可选择多个值的下接列表
FileField 文件上传
SubmitField 表单提交按钮
FormField 把表单做为字段嵌入另一个表单
FieldList 一组指定类型的字段

二 python代码

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
from flask import Flask
from flask import render_template
from flask_wtf import FlaskForm
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,
SelectField, SelectMultipleField, TextAreaField,
RadioField, IntegerField, DecimalField, SubmitField)
from wtforms.validators import DataRequired, InputRequired, Length, Email, EqualTo, NumberRange


app = Flask(__name__)
app.secret_key = 'asdfs'


class WtfForm(FlaskForm):
# StringField 文本输入框,必填,用户名长度为4到25之间,占位符
username = StringField('用户名:', validators=[Length(min=4, max=25)], render_kw={'placeholder': '请输入用户名'})

# Email格式
email = StringField('邮箱地址:', validators=[Email()], render_kw={'placeholder': '请输入邮箱地址'})

# PasswordField,密码输入框,必填
password = PasswordField('密码:', validators=[DataRequired()], render_kw={'placeholder': '请输入密码'})

# 确认密码,必须和密码一致
password2 = PasswordField('确认密码:', validators=[InputRequired(), EqualTo('password', '两次密码要一致')])

# IntegerField,文本输入框,必须输入整型数值,范围在16到70之间
age = IntegerField('年龄:', validators=[NumberRange(min=16, max=70)])

# DecimalField,文本输入框,必须输入数值,显示时保留一位小数
height = DecimalField('身高(cm):', places=1)

# DateField,文本输入框,必须输入是"年-月-日"格式的日期
birthday = DateField('出生日期:', format='%Y-%m-%d')

# RadioField,单选框,choices里的内容会在ul标签里,里面每个项是(值,显示名)对
gender = RadioField('性别:', choices=[('0', '男'), ('1', '女')], validators=[DataRequired()])

# SelectField,下拉单选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
job = SelectField('职业:', choices=[
('teacher', '教师'),
('doctor', '医生'),
('engineer', '工程师'),
('lawyer', '律师')
])

# Select类型,多选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
hobby = SelectMultipleField('爱好:', choices=[
('0', '吃饭'),
('1', '睡觉'),
('2', '敲代码')
])

# TextAreaField,段落输入框
description = TextAreaField('自我介绍:', validators=[InputRequired()], render_kw={'placeholder': '例:小明,18岁,未婚找女友'})

# BooleanField,Checkbox类型,加上default='checked'即默认是选上的
accept_terms = BooleanField('是否接受上述条款', default='checked', validators=[DataRequired()])

# SubmitField,Submit按钮
submit = SubmitField('提交')


@app.route('/', methods=['POST', 'GET'])
def index():
form = WtfForm()
return render_template('wtf.html', form=form)

if __name__ == "__main__":
app.run(debug=True)

三. html代码

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="">
{{ form.csrf_token }}
{{ form.username.label }}{{ form.username }}
<br>
{{ form.email.label }}{{ form.email }}
<br>
{{ form.password.label }}{{ form.password }}
<br>
{{ form.password2.label }}{{ form.password2 }}
<br>
{{ form.age.label }}{{ form.age }}
<br>
{{ form.height.label }}{{ form.height }}
<br>
{{ form.birthday.label }}{{ form.birthday }}
<hr>
{{ form.gender.label }}{{ form.gender }}
<br>
{{ form.job.label }}{{ form.job }}
<br>
{{ form.hobby.label }}{{ form.hobby }}
<br>
{{ form.description.label }}{{ form.description }}
<br>
{{ form.accept_terms.label }}{{ form.accept_terms }}
<br>
{{ form.submit }}
<br>

</form>
</body>
</html>

flask全局变量一,视图间的参数传递

提出的问题:

flask视图间如何传递变量呢?开始我用的全局变量,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from flask import Flask,request,render_template

app=Flask(__name__)

app.secret_key = '就得是要一个key' # 必须有
app.config['SESSION_TYPE'] = 'filesystem' # 必须有

start_num=0
span_num=5

@app.route("/fun1")
def fun1():
start_num=9
span_num=16

@app.route("/fun2")
def fun2():
print("start_num=",start_num) #此处start_num又变为0
print("span_num=",span_num]) #此处start_num又变为5

在执行视图fun2时, session[“start_num”]与session[“span_num”]的值又变为初始值了。
咋整呢?

网上找到一种办法是 session法。修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask,request,render_template
from flask import session

app=Flask(__name__)

app.secret_key = '我的key'
app.config['SESSION_TYPE'] = 'filesystem'

session["start_num"]=0
session["span_num"]=5

@app.route("/fun1")
def fun1():
session["start_num"]=9
session["span_num"]=16

@app.route("/fun2")
def fun2():
print("session["start_num"]",session["start_num"]) #此处session["start_num"]又变为9
print("session["span_num"]",session["span_num"]) #此处session["start_num"]又变为16
还有一种办法就是把两个临时值传到数据库,或保存为json数据,存入文件中,程序不难,但是如果参数频繁改变的话,要反复读写文件就不好玩了。

flask 的form学习之一,传统form

传统的方法与php一样,先在html里建立form,并用action指向视图函数处理,并用POST方法传递参数。不多说,代码说明。

一. html文件 form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" >
<title>表单示便</title>
</head>
<body>
<form action="regist",method="POST" >
用户名:<input type="text",name="username"><br>
密码:<input type="text",name="pawd"><br>
再次密码::<input type="text",name="re-pawd"><br>
<input type="submit",value="注册"><br>
</form>
</body>
</html>
二. python代码中的视图函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from flask import Flask,request,render_template

app=Flask(__name__)

@app.route(/)
def index():
return render_template("index.html")

@app.route("regist")
def regist():
if request.method=="GET":
return render_template("regist.html") # 没有输入的样子就是这个。
if request.methom=="POST":
uname=request.form.get("username")
password=request.form.get("pawd")
re_password=request.form.get("re-pawd")
#下面添加处理语句

if __name__=="__main__":
app.debug=True
app.run(host = '127.0.0.1',port = 8080 )

panda笔记1

一. Python 将数据框 DataFrame转为html表格,DataFrame.to_html()详解
1
2
3
4
DataFrame.to_html(buf=None, columns=None, col_space=None, header=True, index=True,na_rep='NaN', formatters=None,
float_format=None, sparsify=None, index_names=True,justify=None, bold_rows=True,classes=None,
escape=True, max_rows=None, max_cols=None,show_dimensions=False, notebook=False, decimal='.',
border=None)
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
buf : StringIO-like, 可选
写入缓冲区。
columns : sequence,可选
要转化的列的列名;默认值 None 为所有列转化。
col_space : int,可选
每列的最小宽度。
header : bool,可选
是否打印列标签,默认为 True。
index : 布尔值,可选
是否打印索引(行)标签,默认为 True。
na_rep : 字符串,可选
指定 NAN 的字符串表示形式,默认为 'NaN'。
formatters : 多个单参数函数组成的列表或字典,可选
格式化程序可按列表的所索引或字典的键名称应用于列元素,默认为 None。
每个单参数函数的结果必须是一个 unicode 字符串。列表的长度必须等于列数。
float_format: 单参数函数,可选
用于将列元素设置为浮点数的格式化程序功能,默认为无。
此单参数函数的结果必须是 unicode 字符串。
sparsify : bool,可选
默认为 True。输入 False 时,对于具有层次结构索引的 DataFrame,会在每一行打印多重索引。
index_names : bool,可选
打印索引名称,默认为 True。
line_width : int,可选
换行符的宽度,默认为不换行。
justify : 列标签对齐方式, 可选
左右对齐列标签。默认为 None时,使用打印配置中的选项(由 set_option 控制),则右对齐。
bold_rows : bool, 可选
对横向表格线进行加粗。
classes : CSS类(es)适用于生成的html表, 可选
默认 None
escape : bool, 可选
将 "<", ">", "&" 转化成 html 安全序列(??),默认 True。
max_rows : int, 可选
显示最大行数。
max_cols : int, 可选
显示最大列数。
decimal : str, 可选
小数分隔符, 默认为 '.'。
border : int, 可选
表格外边框宽度,默认为 1,参数为 0 时表格无边框。数值越大外边框越宽。
二. pd.read_excel方法说明
1
2
3
4
5
6
pd.read_excel(io, sheet_name=0, header=0, names=None,      index_col=None, 
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True, **kwds)
1
2
3
4
5
6
io:excel文件
sheet_name:返回指定sheet,默认索引0返回第一个,也可用名称,如果返回多个则可用列表,为None则返回全表
header:指定表头,也可用列表指定多行
names:自定义列名,长度和Excel列长度必须一致
index_col:用作索引的列
usecols:读取指定的列,参数为列表,如[0,1]表示第1和第2列
三. 使用to_excel()函数将DataFrame导出到excel文件
1
2
3
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None,
header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True,
encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
excel_writer:文件路径或现有的ExcelWriter。
sheet_name:它是指包含DataFrame的工作表的名称。
na_rep:指定要写入的表如果有空值(NAN),则需要填入的字符串。
float_format:这是一个可选参数, 用于格式化浮点数字符串。
columns:指定哪些列要写入新表。
header:是否把列名也写入excel表,默认为True,即写入
index:是否把索引也写入excel表,默认为True,即写入。
index_label:引用索引列的列标签。如果未指定, 并且标头和索引为True, 则使用索引名称。如果DataFrame使用MultiIndex, 则应给出一个序列。
startrow:默认值0。它指向转储DataFrame的左上单元格行。
startcol:默认值0。它指向转储DataFrame的左上方单元格列。
engine:这是一个可选参数, 用于写入要使用的引擎, openpyxl或xlsxwriter。
merge_cells:返回布尔值, 其默认值为True。它将MultiIndex和Hierarchical行写为合并的单元格。
encoding:这是一个可选参数, 可对生成的excel文件进​​行编码。仅对于xlwt是必需的。
inf_rep:它也是一个可选参数, 默认值为inf。它通常表示无穷大。
verbose:返回一个布尔值。它的默认值为True。
它用于在错误日志中显示更多信息。
Frozen_panes:它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。

毛不易作品

一 消愁

作词 : 毛不易
作曲 : 毛不易
编曲 : 赵兆
制作人 : 李健/赵兆

当你走进这欢乐场
背上所有的梦与想
各色的脸上各色的妆
没人记得你的模样

三巡酒过你在角落
固执的唱着苦涩的歌
听它在喧嚣里被淹没
你拿起酒杯对自己说

一杯敬朝阳 一杯敬月光
唤醒我的向往 温柔了寒窗
于是可以不回头地逆风飞翔
不怕心头有雨 眼底有霜

一杯敬故乡 一杯敬远方
守着我的善良 催着我成长
所以南北的路从此不再漫长
灵魂不再无处安放

躁动不安的座上客
自以为是地表演着
伪装着 舞蹈着 疲惫着
你拿起酒杯对自己说
一杯敬朝阳 一杯敬月光
唤醒我的向往 温柔了寒窗
于是可以不回头地逆风飞翔
不怕心头有雨 眼底有霜

一杯敬故乡 一杯敬远方
守着我的善良 催着我成长
所以南北的路从此不再漫长
灵魂不再无处安放

一杯敬明天 一杯敬过往
支撑我的身体 厚重了肩膀
虽然从不相信所谓山高水长
人生苦短何必念念不忘

一杯敬自由 一杯敬死亡
宽恕我的平凡 驱散了迷惘
好吧天亮之后总是潦草离场
清醒的人最荒唐
清醒的人最荒唐

二 我这样的人

作词 : 毛不易
作曲 : 毛不易
编曲 : 赵兆/宋涛
制作人 : 李健/赵兆

像我这样优秀的人
本该灿烂过一生
怎么二十多年到头来
还在人海里浮沉

像我这样聪明的人
早就告别了单纯
怎么还是用了一段情
去换一身伤痕

像我这样迷茫的人
像我这样寻找的人
像我这样碌碌无为的人
你还见过多少人

像我这样庸俗的人
从不喜欢装深沉
怎么偶尔听到老歌时
忽然也晃了神
像我这样懦弱的人
凡事都要留几分
怎么曾经也会为了谁
想过奋不顾身

像我这样迷茫的人
像我这样寻找的人
像我这样碌碌无为的人
你还见过多少人

像我这样孤单的人
像我这样傻的人
像我这样不甘平凡的人
世界上有多少人

像我这样迷茫的人
像我这样寻找的人
像我这样碌碌无为的人
你还见过多少人

像我这样孤单的人
像我这样傻的人
像我这样不甘平凡的人
世界上有多少人

像我这样莫名其妙的人
会不会有人心疼

三 牧马城市

游历在大街和楼房
心中是骏马和猎场
最了不起的脆弱迷惘
不过就这样
天外有天有无常
山外有山有他乡
跌了撞了 心还是回老地方

游离于城市的痛痒
错过了心爱的姑娘
宣告世界的那个理想
已不知去向
为所欲为是轻狂
防不胜防是悲伤
后来才把成熟当偏方

当所有想的说的要的爱的
都挤在心脏
行李箱里装不下我 想去的远方
这来的去的给的欠的 算一种褒奖
风吹草低见惆怅 抬头至少还有光

游历在大街和楼房
心中是骏马和猎场
最了不起的脆弱迷惘
不过就这样
天外有天有无常
山外有山有他乡
跌了撞了 心还是回老地方

游离于城市的痛痒
错过了心爱的姑娘
宣告世界的那个理想
已不知去向
为所欲为是轻狂
防不胜防是悲伤
后来才把成熟当偏方

当所有想的说的要的爱的
都挤在心脏
行李箱里装不下我 想去的远方
这来的去的给的欠的算一种褒奖
风吹草低见惆怅
抬头至少还有光

把烦恼痛了吞了认了算了
不对别人讲
谁还没有辜负几段 昂贵的时光
若男孩笑了哭了累了
说要去流浪
留下大人的模样
看岁月剑拔弩张
总会有个人成为你的远方